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

Subversion Repositories brisc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 1 to Rev 2
    Reverse comparison

Rev 1 → Rev 2

/trunk/incrementer.v
0,0 → 1,9
module incrementer(in, out);
parameter dw = 8;
input [dw-1:0] in;
output [dw-1:0] out;
assign out = in + 1;
endmodule
/trunk/mux2.v
0,0 → 1,16
module mux2( mux_out, data_0, data_1, select);
 
parameter dw = 8;
input [dw-1:0] data_1, data_0;
input [0:0] select;
output reg [dw-1:0] mux_out;
// choose between the two inputs
always @ ( data_1 or data_0 or select)
case (select)// (* synthesis parallel_case *)
1'd0: mux_out = data_0;
1'd1: mux_out = data_1;
default: mux_out = {dw{1'bx}};
endcase
endmodule
/trunk/reg_file.v
0,0 → 1,18
module reg_file (Read_Addr_1, Data_Out_1, Clock);
 
parameter aw = 8; //address bus width
parameter dw = 48; //size of each memory element
parameter size = (1<<aw);
output [dw-1:0] Data_Out_1;
input [aw-1:0] Read_Addr_1;
input Clock;
reg [dw-1:0] Reg_File [0:size-1];
/*
always @ (posedge Clock) begin
Data_Out_1 <= Reg_File[Read_Addr_1];
end
*/
//assign Data_Out_a = {{dw-aw{1'b0}}, Read_Addr_1};
endmodule
/trunk/mux2r.v
0,0 → 1,24
module mux2r( mux_out, data_0, data_1, select, reset_n);
 
parameter dw = 8;
input [dw-1:0] data_1, data_0;
input [0:0] select;
input reset_n;
output reg [dw-1:0] mux_out;
// choose between the two inputs
always @ ( data_1 or data_0 or select or reset_n)
if(!reset_n)
begin
mux_out = 0;
end
else
begin
case (select)// (* synthesis parallel_case *)
1'd0: mux_out = data_0;
1'd1: mux_out = data_1;
default: mux_out = {dw{1'bx}};
endcase
end
endmodule
/trunk/mux4.v
0,0 → 1,18
module mux4( mux_out, data_0, data_1, data_2, data_3, select);
 
parameter dw = 32;
input [dw-1:0] data_3, data_2, data_1, data_0;
input [1:0] select;
output reg [dw-1:0] mux_out;
// choose between the four inputs
always @ ( data_3 or data_2 or data_1 or data_0 or select)
case (select)// (* synthesis parallel_case *)
2'd0: mux_out = data_0;
2'd1: mux_out = data_1;
2'd2: mux_out = data_2;
2'd3: mux_out = data_3;
default: mux_out = {dw{1'bx}};
endcase
endmodule
/trunk/mux8.v
0,0 → 1,22
module mux8( mux_out, data_0, data_1, data_2, data_3, data_4, data_5, data_6, data_7, select);
 
parameter dw = 8;
input [dw-1:0] data_0, data_1, data_2, data_3, data_4, data_5, data_6, data_7;
input [2:0] select;
output reg [dw-1:0] mux_out;
// choose between the two inputs
always @ ( data_0 or data_1 or data_2 or data_3 or data_4 or data_5 or data_6 or data_7 or select)
case (select)// (* synthesis parallel_case *)
3'd0: mux_out = data_0;
3'd1: mux_out = data_1;
3'd2: mux_out = data_2;
3'd3: mux_out = data_3;
3'd4: mux_out = data_4;
3'd5: mux_out = data_5;
3'd6: mux_out = data_6;
3'd7: mux_out = data_7;
default: mux_out = {dw{1'bx}};
endcase
endmodule
/trunk/brisc.v
0,0 → 1,63
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
/trunk/register.v
0,0 → 1,20
module register(in, out, clk, reset_n);
 
parameter dw = 8;
 
input [dw-1:0] in;
input clk;
input reset_n;
 
output reg [dw-1:0] out;
 
 
always @(posedge clk or negedge reset_n)
begin
if (!reset_n)
out <= 0;
else
out <= in;
end
 
endmodule
/trunk/prog_mem.v
0,0 → 1,108
/*******************************************************************************
* This file is owned and controlled by Xilinx and must be used *
* solely for design, simulation, implementation and creation of *
* design files limited to Xilinx devices or technologies. Use *
* with non-Xilinx devices or technologies is expressly prohibited *
* and immediately terminates your license. *
* *
* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" *
* SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR *
* XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION *
* AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION *
* OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS *
* IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, *
* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE *
* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY *
* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE *
* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR *
* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF *
* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *
* FOR A PARTICULAR PURPOSE. *
* *
* Xilinx products are not intended for use in life support *
* appliances, devices, or systems. Use in such applications are *
* expressly prohibited. *
* *
* (c) Copyright 1995-2006 Xilinx, Inc. *
* All rights reserved. *
*******************************************************************************/
// The synopsys directives "translate_off/translate_on" specified below are
// supported by XST, FPGA Compiler II, Mentor Graphics and Synplicity synthesis
// tools. Ensure they are correct for your synthesis tool(s).
 
// You must compile the wrapper file prog_mem.v when simulating
// the core, prog_mem. When compiling the wrapper file, be sure to
// reference the XilinxCoreLib Verilog simulation library. For detailed
// instructions, please refer to the "CORE Generator Help".
 
`timescale 1ns/1ps
 
module prog_mem(
addr,
clk,
dout);
 
 
input [7 : 0] addr;
input clk;
output [47 : 0] dout;
 
// synopsys translate_off
 
BLKMEMSP_V6_2 #(
8, // c_addr_width
"0", // c_default_data
256, // c_depth
0, // c_enable_rlocs
0, // c_has_default_data
0, // c_has_din
0, // c_has_en
0, // c_has_limit_data_pitch
0, // c_has_nd
0, // c_has_rdy
0, // c_has_rfd
0, // c_has_sinit
0, // c_has_we
18, // c_limit_data_pitch
"prog_mem.mif", // c_mem_init_file
0, // c_pipe_stages
0, // c_reg_inputs
"0", // c_sinit_value
48, // c_width
0, // c_write_mode
"0", // c_ybottom_addr
1, // c_yclk_is_rising
1, // c_yen_is_high
"hierarchy1", // c_yhierarchy
0, // c_ymake_bmm
"16kx1", // c_yprimitive_type
1, // c_ysinit_is_high
"1024", // c_ytop_addr
0, // c_yuse_single_primitive
1, // c_ywe_is_high
1) // c_yydisable_warnings
inst (
.ADDR(addr),
.CLK(clk),
.DOUT(dout),
.DIN(),
.EN(),
.ND(),
.RFD(),
.RDY(),
.SINIT(),
.WE());
 
 
// synopsys translate_on
 
// FPGA Express black box declaration
// synopsys attribute fpga_dont_touch "true"
// synthesis attribute fpga_dont_touch of prog_mem is "true"
 
// XST black box declaration
// box_type "black_box"
// synthesis attribute box_type of prog_mem is "black_box"
 
endmodule
 
/trunk/down_counter.v
0,0 → 1,8
module down_counter(in, out);
parameter dw = 8;
input [dw-1:0] in;
output [dw-1:0] out;
assign out = in - 1;
endmodule
/trunk/register_e.v
0,0 → 1,22
module register_e(in, out, clk, reset_n, enable);
 
parameter dw = 8 ;
 
input [dw-1:0] in;
input clk;
input reset_n;
input enable;
 
output reg [dw-1:0] out;
 
always @(posedge clk or negedge reset_n)
begin
if (!reset_n)
out <= 0;
else if (enable)
out <= in;
// else
// out <= {dw{1'bx}};
end
 
endmodule
/trunk/lifo.v
0,0 → 1,25
// List in First out (LIFO)
module lifo(din, dout, clk, enable, push_pop, reset_n);
parameter dw = 8; // data width
input [dw-1: 0] din;
output wire [dw-1: 0] dout;
input clk;
input enable;
input push_pop; // high to push, low to pop
input reset_n;
wire [dw-1:0] m1o, m2o, m3o, r2o, r3o;
mux2 #(.dw(dw)) mux3(m3o, {dw{1'b0}}, r2o, push_pop);
register_e #(.dw(dw)) reg3(m3o, r3o, clk, reset_n, enable);
mux2 #(.dw(dw)) mux2(m2o, r3o, dout, push_pop);
register_e #(.dw(dw)) reg2(m2o, r2o, clk, reset_n, enable);
mux2 #(.dw(dw)) mux1(m1o, r2o, din, push_pop);
register_e #(.dw(dw)) reg1(m1o, dout, clk, reset_n, enable);
 
endmodule
/trunk/stimulus_trisc.v
0,0 → 1,35
module stimulus_trisc();
 
parameter ncs = 3;
parameter cw = (1<<ncs)-1; //number of conditional inputs (cw+1 must be a power of 2)
 
parameter ow = 28; //control output size
 
reg [cw-1:0] cond;
wire [ow-1:0] out_sig;
reg clk;
reg reset_n;
 
trisc processor(cond, out_sig, clk, reset_n);
 
initial
begin
clk = 0;
reset_n = 1;
cond = 0;
#1
reset_n = 0;
 
#1
reset_n = 1;
 
cond = 1;
end
 
always
#5 clk = ~clk;
 
 
 
endmodule
/trunk/nal.v
0,0 → 1,18
module nal(out, in1, in2, in3, in4, cond, sel1, sel2, reset_n);
 
parameter dw = 8;
 
input [dw-1:0] in1, in2, in3, in4;
input cond;
input [1:0] sel1, sel2;
input reset_n;
 
output [dw-1:0] out;
 
wire [dw-1:0] m1o, m2o;
 
mux4 #(.dw(dw)) mux1(m1o, in1, in2, in3, in4, sel1);
mux4 #(.dw(dw)) mux2(m2o, in1, in2, in3, in4, sel2);
mux2r #(.dw(dw)) mux3(out, m1o, m2o, cond, reset_n);
 
endmodule

powered by: WebSVN 2.1.0

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