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

Subversion Repositories brisc

[/] [brisc/] [trunk/] [brisc.v] - Rev 3

Compare with Previous | Blame | View Log

module trisc(cond, out_sig, clk, reset_n);
 
//independent parameters
parameter ncs = 3;			//number of bits to select cw+1 inputs i.e 2^ncs = (cw+1)
parameter aw = 8;		//address width
parameter dw = 20;		//data width for internal control
parameter ow = 28;		//control output size
 
//dependant parameters (based on independant parameters
parameter cw = (1<<ncs)-1;		//number of conditional inputs (cw+1 must be a power of 2)
parameter pms = (1<<aw);	// program memory size. depends on address width ( pms = 2 ^ aw )
 
//  ow  + dw defines the width of one memory block of program memory
 
input [cw-1:0] cond;		// one conditional input is from down counter
input [0:0] clk, reset_n;
output [ow-1:0] out_sig;
 
//output of program memory
wire [aw-1:0] prog_ctr_a;		// program counte address
wire [aw-1:0] sub_a;		// subroutine address
wire [aw-1:0] branch_a;		// branch address
wire [ncs-1:0] cond_sel;
wire [3:0] nal_sel;
wire [0:0] pp;				// push/pop_n
wire [0:0] cl;				//count/load_n
wire [0:0] ce;				//counter enable
wire [0:0] sse;				// subroutine stack enable
wire [0:0] cse;				// counter stack enable
 
wire [0:0] cc;				// output of conditinal select mux
 
//output of NAL
wire [aw-1:0] next_inst_a;	//address of next instruction to execute
 
wire [aw:0]	dc;				// down counter
wire [aw:0]	lc;				// output of loop counter lifo
wire [aw:0]	cm;				// output of counter mux
wire [aw:0]	ctr_o;			// output of down counter register
 
wire [aw-1:0] inc_o;		// output of incrementer
 
// program memory
prog_mem mem (.addr(next_inst_a),.clk(clk),.dout({out_sig, nal_sel, cond_sel, cse, sse, ce, cl, pp, branch_a})); 
 
nal			#(.dw(aw)) next_addr(next_inst_a, ctr_o[aw-1:0], branch_a, sub_a, prog_ctr_a, cc, nal_sel[1:0], nal_sel[3:2], reset_n);
 
 
lifo		#(.dw(aw+1)) loop_cnt(ctr_o, lc, clk, cse, pp, reset_n);
mux2		#(.dw(aw+1)) counter_m(cm, {1'b0, branch_a}, lc, cl);
 
down_counter #(.dw(aw+1)) dn_ctr(cm, dc);
register_e #(.dw(aw+1)) ctr(dc, ctr_o, clk, reset_n, ce);
 
mux8		#(.dw(1))	cond_m(cc, ctr_o[aw], cond[0], cond[1], cond[2], cond[3], cond[4], cond[5], cond[6], cond_sel); 
 
 
incrementer #(.dw(aw)) inc(next_inst_a, inc_o);
register #(.dw(aw)) prog_ctr(inc_o, prog_ctr_a, clk, reset_n);
 
lifo #(.dw(aw)) sub(prog_ctr_a, sub_a, clk, sse, pp, reset_n);
 
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.