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

Subversion Repositories hive

[/] [hive/] [trunk/] [v01.09/] [alu_mux.v] - Rev 2

Compare with Previous | Blame | View Log

/*
--------------------------------------------------------------------------------
 
Module : alu_mux.v
 
--------------------------------------------------------------------------------
 
Function:
- Multiplexer for processor ALU.
 
Instantiates:
- (4x) vector_sr.v
 
Notes:
- I/M/O optionally registered.
 
--------------------------------------------------------------------------------
*/
 
module alu_mux
	#(
	parameter	integer							REGS_IN_A		= 0,		// reg option input to mux a
	parameter	integer							REGS_A_B			= 0,		// reg option mux a to mux b
	parameter	integer							REGS_B_C			= 0,		// reg option mux b to mux c
	parameter	integer							REGS_C_D			= 0,		// reg option mux c to mux d
	parameter	integer							REGS_D_OUT		= 0,		// reg option mux d to output
	parameter	integer							DATA_W			= 8,		// data width
	parameter	integer							ADDR_W			= 4		// address width
	)
	(
	// clocks & resets
	input			wire								clk_i,						// clock
	input			wire								rst_i,						// async. reset, active high
	// control I/O
	input			wire								sgn_i,						// 1=signed
	input			wire								ext_i,						// 1=extended
	input			wire								as_i,							// 1=add/subtract
	input			wire								dm_i,							// 1=read data
	input			wire								rtn_i,						// 1=return pc
	input			wire								ms_i,							// 1=multiply
	// data I/O
	input			wire	[DATA_W/2-1:0]			a_lo_i,						// operand
	input			wire	[DATA_W-1:0]			res_lg_i,					// logical result
	input			wire	[DATA_W-1:0]			res_as_i,					// add/subtract result
	input			wire	[DATA_W-1:0]			res_ms_i,					// multiply/shift result
	input			wire	[DATA_W/2-1:0]			dm_data_i,					// dmem read data
	input			wire	[ADDR_W-1:0]			pc_i,							// program counter
	output		wire	[DATA_W-1:0]			result_o						// selected result
	);
 
 
	/*
	----------------------
	-- internal signals --
	----------------------
	*/
	wire												ms_a, rtn_a, dm_a, as_a, ext_a, sgn_a;
	wire												ms_b, rtn_b, dm_b, as_b, ext_b, sgn_b;
	wire												ms_c, dm_c, as_c, ext_c, sgn_c;
	wire												ms_d;
	wire					[DATA_W/2-1:0]			a_lo_a;
	reg					[DATA_W-1:0]			mux_a, mux_b, mux_c, mux_d;
	wire					[DATA_W-1:0]			mux_a_b, mux_b_c, mux_c_d;
 
 
	/*
	================
	== code start ==
	================
	*/
 
 
	// input to mux a regs
	vector_sr
	#(
	.REGS			( REGS_IN_A ),
	.DATA_W		( DATA_W/2+6 ),
	.RESET_VAL	( 0 )
	)
	in_a_regs
	(
	.clk_i		( clk_i ),
	.rst_i		( rst_i ),
	.data_i		( { a_lo_i, ms_i, rtn_i, dm_i, as_i, ext_i, sgn_i } ),
	.data_o		( { a_lo_a, ms_a, rtn_a, dm_a, as_a, ext_a, sgn_a } )
	);
 
 
	// mux a
	always @ ( * ) begin
		casex ( { dm_a, as_a } )
			'b00 : mux_a <= res_lg_i;
			'b01 : mux_a <= res_as_i;
			'b1x : mux_a <= a_lo_a;
		endcase
	end
 
 
	// mux a to mux b regs
	vector_sr
	#(
	.REGS			( REGS_A_B ),
	.DATA_W		( DATA_W+5 ),
	.RESET_VAL	( 0 )
	)
	a_b_regs
	(
	.clk_i		( clk_i ),
	.rst_i		( rst_i ),
	.data_i		( { mux_a,   ms_a, rtn_a, dm_a, ext_a, sgn_a } ),
	.data_o		( { mux_a_b, ms_b, rtn_b, dm_b, ext_b, sgn_b } )
	);
 
 
	// mux b
	always @ ( * ) begin
		case ( rtn_b )
			'b0 : mux_b <= mux_a_b;
			'b1 : mux_b <= pc_i;
		endcase
	end
 
 
	// mux b to mux c regs
	vector_sr
	#(
	.REGS			( REGS_B_C ),
	.DATA_W		( DATA_W+4 ),
	.RESET_VAL	( 0 )
	)
	b_c_regs
	(
	.clk_i		( clk_i ),
	.rst_i		( rst_i ),
	.data_i		( { mux_b,   ms_b, dm_b, ext_b, sgn_b } ),
	.data_o		( { mux_b_c, ms_c, dm_c, ext_c, sgn_c } )
	);
 
 
	// mux c
	always @ ( * ) begin
		casex ( { dm_c, ext_c, sgn_c } )
			'b0xx : mux_c <= mux_b_c;
			'b100 : mux_c <= dm_data_i;
			'b101 : mux_c <= $signed( dm_data_i );
			'b11x : mux_c <= { dm_data_i, mux_b_c[DATA_W/2-1:0] };
		endcase
	end
 
 
	// mux c to mux d regs
	vector_sr
	#(
	.REGS			( REGS_C_D ),
	.DATA_W		( DATA_W+1 ),
	.RESET_VAL	( 0 )
	)
	c_d_regs
	(
	.clk_i		( clk_i ),
	.rst_i		( rst_i ),
	.data_i		( { mux_c,   ms_c } ),
	.data_o		( { mux_c_d, ms_d } )
	);
 
 
	// mux c
	always @ ( * ) begin
		case ( ms_d )
			'b0 : mux_d <= mux_c_d;
			'b1 : mux_d <= res_ms_i;
		endcase
	end
 
 
	// mux d to output regs
	vector_sr
	#(
	.REGS			( REGS_D_OUT ),
	.DATA_W		( DATA_W ),
	.RESET_VAL	( 0 )
	)
	d_out_regs
	(
	.clk_i		( clk_i ),
	.rst_i		( rst_i ),
	.data_i		( mux_d ),
	.data_o		( result_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.