OpenCores
URL https://opencores.org/ocsvn/hive/hive/trunk

Subversion Repositories hive

[/] [hive/] [trunk/] [v01.10/] [reg_set_shim.v] - Rev 3

Compare with Previous | Blame | View Log

/*
--------------------------------------------------------------------------------
 
Module: reg_set_shim.v
 
Function: 
- Shim to interface main memory and internal register set.
 
Instantiates: 
- (2x) vector_sr.v
 
Notes:
- Address, data, and control I/O optionally registered.
- Register set is placed at the top of memory space, main mem at bottom.
 
--------------------------------------------------------------------------------
*/
 
module reg_set_shim
	#(
	parameter	integer							REGS_IN			= 1,		// register option for inputs
	parameter	integer							REGS_OUT			= 1,		// register option for outputs
	parameter	integer							DATA_W			= 16,		// data width (bits)
	parameter	integer							ADDR_W			= 8,		// address width (bits)
	parameter	integer							REG_ADDR_W		= 4,		// register set address width (bits)
	parameter	integer							IM_ADDR_W		= 4		// immediate address width
	)
	(
	// clocks & resets
	input			wire								clk_i,						// clock
	input			wire								rst_i,						// async. reset, active high
	// data I/O
	input			wire	[DATA_W-1:0]			a_i,							// operand
	input			wire								ext_i,						// 1=extended result
	output		wire	[DATA_W/2-1:0]			wr_data_o,					// write data
	// address I/O
	input			wire	[DATA_W/2-1:0]			b_lo_i,						// operand
	input			wire	[IM_ADDR_W-1:0]		im_addr_i,					// immediate address
	input			wire	[ADDR_W-1:0]			pc_1_i,						// program counter
	output		wire	[ADDR_W-1:0]			addr_o,						// address
	// bus I/O
	input			wire								wr_i,							// data write enable, active high
	input			wire								rd_i,							// data read enable, active high
	output		wire								regs_wr_o,					// data write enable, active high
	output		wire								regs_rd_o,					// data read enable, active high
	output		wire								dm_wr_o						// data write enable, active high
	);
 
 
	/*
	----------------------
	-- internal signals --
	----------------------
	*/
	wire					[DATA_W-1:0]			a;
	wire					[DATA_W/2-1:0]			b_lo;
	wire					[IM_ADDR_W-1:0]		im_addr;
	wire												wr, rd, ext;
	wire					[ADDR_W-1:0]			rw_addr, addr;
	wire												regs_en, regs_wr, regs_rd, dm_wr;
	wire					[DATA_W/2-1:0]			wr_data;
 
 
 
	/*
	================
	== code start ==
	================
	*/
 
 
	// optional input regs
	vector_sr
	#(
	.REGS			( REGS_IN ),
	.DATA_W		( DATA_W+DATA_W/2+IM_ADDR_W+3 ),
	.RESET_VAL	( 0 )
	)
	in_regs
	(
	.clk_i		( clk_i ),
	.rst_i		( rst_i ),
	.data_i		( { a_i, b_lo_i, im_addr_i, wr_i, rd_i, ext_i } ),
	.data_o		( { a,   b_lo,   im_addr,   wr,   rd,   ext   } )
	);
 
 
	// read / write address
	assign rw_addr = b_lo + im_addr;
 
	// decode address
	assign addr = ( rd | wr ) ? rw_addr : pc_1_i;
 
	// decode register set address space (all upper bits set)
	assign regs_en = &addr[ADDR_W-1:REG_ADDR_W];
 
	// decode regs read & write
	assign regs_wr = wr & regs_en;
	assign regs_rd = rd & regs_en;
 
	// decode dmem write
	assign dm_wr = wr & ~regs_en;
 
	// decode write data
	assign wr_data = ( ext ) ? a[DATA_W-1:DATA_W/2] : a[DATA_W/2-1:0];
 
 
	// optional output registers
	vector_sr
	#(
	.REGS			( REGS_OUT ),
	.DATA_W		( ADDR_W+DATA_W/2+3 ),
	.RESET_VAL	( 0 )
	)
	out_regs
	(
	.clk_i		( clk_i ),
	.rst_i		( rst_i ),
	.data_i		( { addr,   wr_data,   regs_wr,   regs_rd,   dm_wr   } ),
	.data_o		( { addr_o, wr_data_o, regs_wr_o, regs_rd_o, dm_wr_o } )
	);
 
 
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.