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

Subversion Repositories minirisc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 5 to Rev 6
    Reverse comparison

Rev 5 → Rev 6

/trunk/verilog/core/primitives.v
39,10 → 39,10
 
// CVS Log
//
// $Id: primitives.v,v 1.2 2002-09-27 15:35:40 rudi Exp $
// $Id: primitives.v,v 1.3 2002-10-01 12:44:24 rudi Exp $
//
// $Date: 2002-09-27 15:35:40 $
// $Revision: 1.2 $
// $Date: 2002-10-01 12:44:24 $
// $Revision: 1.3 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
49,6 → 49,8
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2002/09/27 15:35:40 rudi
// Minor update to newer devices ...
//
//
//
59,6 → 61,7
//
//
//
//
 
`timescale 1ns / 10ps
 
71,7 → 74,7
reg [7:0] out;
 
always @(sel or in0 or in1 or in2 or in3)
case(sel)
case(sel) // synopsys full_case parallel_case
0: out = in0;
1: out = in1;
2: out = in2;
128,7 → 131,7
reg [7:0] out;
 
always @(sel or in0 or in1 or in2 or in3 or in4 or in5 or in6 or in7)
case(sel)
case(sel) // synopsys full_case parallel_case
3'd0: out = in0;
3'd1: out = in1;
3'd2: out = in2;
168,7 → 171,7
input [10:0] in;
output [10:0] out;
 
assign out = in + 1;
assign out = in + 11'h1;
 
endmodule
 
177,7 → 180,7
input [7:0] in;
output [7:0] out;
 
assign out = in + 1;
assign out = in + 8'h1;
 
endmodule
 
213,28 → 216,3
endmodule
 
 
// Synchrounous SRAM
// 128 bytes by 8 bits
// 1 read port, 1 write port
module ssram_128x8(clk, rd_addr, rd_data, we, wr_addr, wr_data);
input clk;
input [6:0] rd_addr;
output [7:0] rd_data;
input we;
input [6:0] wr_addr;
input [7:0] wr_data;
 
reg [7:0] rf_mem[0:128]; // Actual Memory
 
reg [7:0] rd_data;
 
always @(posedge clk) // Synchrounous Read Logic
rd_data <= #1 rf_mem[rd_addr];
 
always @(posedge clk) // Synchrounous Write Logic
if(we)
rf_mem[wr_addr] <= #1 wr_data;
 
endmodule
 
 
/trunk/verilog/core/alu.v
39,10 → 39,10
 
// CVS Log
//
// $Id: alu.v,v 1.2 2002-09-27 15:35:40 rudi Exp $
// $Id: alu.v,v 1.3 2002-10-01 12:44:24 rudi Exp $
//
// $Date: 2002-09-27 15:35:40 $
// $Revision: 1.2 $
// $Date: 2002-10-01 12:44:24 $
// $Revision: 1.3 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
49,6 → 49,8
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2002/09/27 15:35:40 rudi
// Minor update to newer devices ...
//
//
//
59,6 → 61,7
//
//
//
//
 
 
`timescale 1ns / 10ps
108,7 → 111,7
begin
cout = 0;
case(op) // synopsys full_case parallel_case
ALU_ADD: {cout, out} = s1 + s2;
ALU_ADD: {cout, out_t} = s1 + s2;
ALU_AND: out_t = s1 & s2;
ALU_CLR: out_t = 8'h00;
ALU_NOT: out_t = ~s1;
/trunk/verilog/core/register_file.v
39,10 → 39,10
 
// CVS Log
//
// $Id: register_file.v,v 1.2 2002-09-27 15:35:40 rudi Exp $
// $Id: register_file.v,v 1.3 2002-10-01 12:44:24 rudi Exp $
//
// $Date: 2002-09-27 15:35:40 $
// $Revision: 1.2 $
// $Date: 2002-10-01 12:44:24 $
// $Revision: 1.3 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
49,6 → 49,8
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2002/09/27 15:35:40 rudi
// Minor update to newer devices ...
//
//
//
59,6 → 61,7
//
//
//
//
 
`timescale 1ns / 10ps
 
82,26 → 85,21
wire [7:0] rf_rd_data_mem;
reg [7:0] wr_data_tmp;
reg rd_wr_addr_equal;
wire rd_wr_addr_equal_tmp;
//reg [6:0] rd_adr_r, wr_adr_r;
 
// Simple Read & Write Address Mapping to memory address
assign rd_addr[6] = ~rf_rd_addr[4];
assign rd_addr[5:3] = rf_rd_addr[4] ? {rf_rd_bnk, rf_rd_addr[3]} : 3'h0;
assign rd_addr[2:0] = rf_rd_addr[2:0];
 
assign rd_addr = rf_rd_addr[4] ?
{1'b0, rf_rd_bnk, rf_rd_addr[3:0]} :
{1'b1, 2'b00, 1'b0, rf_rd_addr[2:0]};
assign wr_addr[6] = ~rf_wr_addr[4];
assign wr_addr[5:3] = rf_wr_addr[4] ? {rf_wr_bnk, rf_wr_addr[3]} : 3'h0;
assign wr_addr[2:0] = rf_wr_addr[2:0];
 
assign wr_addr = rf_wr_addr[4] ?
{1'b0, rf_wr_bnk, rf_wr_addr[3:0]} :
{1'b1, 2'b00, 1'b0, rf_wr_addr[2:0]};
 
// This logic is to bypass the register file if we are reading and
// writing (in previous instruction) to the same register
always @(posedge clk)
rd_wr_addr_equal <= #1 rd_wr_addr_equal_tmp;
rd_wr_addr_equal <= #1 (rd_addr==wr_addr) & rf_we;
 
assign rd_wr_addr_equal_tmp = (rd_addr==wr_addr) & rf_we;
 
assign rf_rd_data = rd_wr_addr_equal ? wr_data_tmp : rf_rd_data_mem;
 
always @(posedge clk)
/trunk/verilog/core/primitives_xilinx.v
39,10 → 39,10
 
// CVS Log
//
// $Id: primitives_xilinx.v,v 1.2 2002-09-27 15:35:40 rudi Exp $
// $Id: primitives_xilinx.v,v 1.3 2002-10-01 12:44:24 rudi Exp $
//
// $Date: 2002-09-27 15:35:40 $
// $Revision: 1.2 $
// $Date: 2002-10-01 12:44:24 $
// $Revision: 1.3 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
49,6 → 49,8
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2002/09/27 15:35:40 rudi
// Minor update to newer devices ...
//
//
//
59,12 → 61,12
//
//
//
//
 
`timescale 1ns / 10ps
 
// LIB_TAG
// synopsys translate_off
// synthesis translate_off
`include "XilinxCoreLib/C_ADDSUB_V1_0.v"
`include "XilinxCoreLib/C_MUX_BUS_V1_0.v"
`include "XilinxCoreLib/C_COMPARE_V1_0.v"
71,7 → 73,6
`include "XilinxCoreLib/C_MUX_BIT_V1_0.v"
`include "XilinxCoreLib/C_MEM_DP_BLOCK_V1_0.v"
`include "XilinxCoreLib/C_REG_FD_V1_0.v"
// synthesis translate_on
// synopsys translate_on
// LIB_TAG_END
 
/trunk/verilog/core/risc_core.v
39,10 → 39,10
 
// CVS Log
//
// $Id: risc_core.v,v 1.2 2002-09-27 15:35:40 rudi Exp $
// $Id: risc_core.v,v 1.3 2002-10-01 12:44:24 rudi Exp $
//
// $Date: 2002-09-27 15:35:40 $
// $Revision: 1.2 $
// $Date: 2002-10-01 12:44:24 $
// $Revision: 1.3 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
49,6 → 49,8
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2002/09/27 15:35:40 rudi
// Minor update to newer devices ...
//
//
//
59,6 → 61,7
//
//
//
//
 
`timescale 1ns / 10ps
 
303,8 → 306,16
 
////////////////////////////////////////////////////////////////////////
// Synchrounous Register File
register_file u0( .clk(clk), .rst(rst), .rf_rd_bnk(rf_rd_bnk), .rf_rd_addr(rf_rd_addr), .rf_rd_data(rf_rd_data),
.rf_we(rf_we), .rf_wr_bnk(rf_wr_bnk), .rf_wr_addr(rf_wr_addr), .rf_wr_data(rf_wr_data) );
register_file u0( .clk( clk ),
.rst( rst ),
.rf_rd_bnk( rf_rd_bnk ),
.rf_rd_addr( rf_rd_addr ),
.rf_rd_data( rf_rd_data ),
.rf_we( rf_we ),
.rf_wr_bnk( rf_wr_bnk ),
.rf_wr_addr( rf_wr_addr ),
.rf_wr_data( rf_wr_data )
);
 
////////////////////////////////////////////////////////////////////////
// Always Fetch Next Instruction
324,9 → 335,11
always @(posedge clk)
valid_1 <= #1 valid;
 
always @(posedge clk)
instr_1 <= #1 instr_0;
 
always @(posedge clk) // Basic Decode extracted directly from the instruction
begin
instr_1 <= #1 instr_0;
// Mask for bit modification instructions
case(instr_0[7:5]) // synopsys full_case parallel_case
0: mask <= #1 8'h01;
343,7 → 356,6
always @(posedge clk)
pc_r <= #1 pc; // Previous version of PC to accomodate for pipeline
 
/*
always @(posedge clk) // SFR Read Operands
if(src1_sel_[1]) sfr_rd_data <= #1 instr_0[7:0];
else
356,8 → 368,9
6: sfr_rd_data <= #1 portb_r;
7: sfr_rd_data <= #1 portc_r;
endcase
*/
 
 
/*
always @(posedge clk)
sfr_rd_data <= #1 sfr_rd_data_tmp1;
 
389,16 → 402,20
 
mux2_8 u2b( .sel(instr_0[0]), .out(sfr_rd_data_tmp3),
.in0(portb_r), .in1(portc_r) );
*/
 
reg instd_zero;
 
always @(posedge clk)
instd_zero <= #1 !(|inst_data[4:0]);
 
// Register File Read Port
assign rf_rd_bnk = fsr_next[6:5];
assign rf_rd_addr = (instr_0[4:0]==0) ? fsr_next[4:0] : instr_0[4:0];
assign rf_rd_addr = instd_zero ? fsr_next[4:0] : instr_0[4:0];
 
 
// ALU OP
always @(posedge clk)
casex(instr_0) // synopsys full_case
casex(instr_0) // synopsys full_case parallel_case
// Byte Oriented RF Operations
I_ADDWF: alu_op <= #1 ALU_ADD; // ADDWF
I_ANDWF: alu_op <= #1 ALU_AND; // ANDWF
429,7 → 446,6
endcase
 
 
 
// Source Select
// This CPU source 1 can be one of: rf (or sfr) or k,
// second source (if any) is always w
442,7 → 458,7
I_MOVLW: src1_sel_ = K_SEL;
I_RETLW: src1_sel_ = K_SEL;
I_XORLW: src1_sel_ = K_SEL;
default: src1_sel_ = (instr_0[4:3]==2'h0 & instr_0[2:0] != 0) ? SFR_SEL : RF_SEL;
default: src1_sel_ = ( (instr_0[4:3]==2'h0) & (instr_0[2:0] != 3'h0 )) ? SFR_SEL : RF_SEL;
endcase
 
always @(posedge clk)
502,44 → 518,26
 
// Stage 2 destination encoder
// write enable outputs are registered now
always @(posedge clk)
w_we <= #1 w_we_; // working register write 0 enable
always @(posedge clk) w_we <= #1 w_we_; // working register write 0 enable
 
always @(posedge clk)
w_we1 <= #1 w_we1_; // working register write 1 enable
always @(posedge clk) w_we1 <= #1 w_we1_; // working register write 1 enable
 
 
// Register File Write Enable is composed of thee conditions: 1) direct register writing (0x10-0x1f);
// 2) Direct Global Register writing (0x08-0x0f), and 3) Indirect Register File Writing
// The logic has been partitioned and balanced between the decode and execute stage ...
/*
assign rf_we = (valid_1 & rf_we1) | (valid_1 & rf_we2 & rf_we3);// register file write enable Composite
assign rf_we = rf_we1 | (rf_we2 & rf_we3); // register file write enable Composite
 
always @(posedge clk)
rf_we1 <= #1 rf_we_; // register file write enable 1
rf_we1 <= #1 valid & rf_we_; // register file write enable 1
 
always @(posedge clk)
rf_we2 <= #1 fsr_next[4] | fsr_next[3]; // register file write enable 2
rf_we2 <= #1 valid & (fsr_next[4] | fsr_next[3]);// register file write enable 2
 
always @(posedge clk)
rf_we3 <= #1 indf_we_; // register file write enable 3
*/
 
assign rf_we = rf_we1 | (rf_we2 & rf_we3);// register file write enable Composite
 
always @(posedge clk)
rf_we1 <= #1 valid & rf_we_; // register file write enable 1
 
always @(posedge clk)
rf_we2 <= #1 valid & (fsr_next[4] | fsr_next[3]); // register file write enable 2
 
always @(posedge clk)
rf_we3 <= #1 indf_we_; // register file write enable 3
 
 
 
 
always @(posedge clk)
wdt_clr <= #1 instr_0[11:0] == I_CLRWDT;
 
 
592,7 → 590,6
endcase
end
 
 
always @(posedge clk)
begin
pc_skz <= #1 valid & pc_skz_;
646,8 → 643,16
//assign src1 = src1_sel ? rf_rd_data : sfr_rd_data;
mux2_8 u3( .sel(src1_sel), .in0(sfr_rd_data), .in1(rf_rd_data), .out(src1) );
 
alu u4( .s1(src1), .s2(w), .mask(mask), .out(dout),
.op(alu_op), .c_in(status[0]), .c(c_out), .dc(dc_out), .z(z_out) );
alu u4( .s1( src1 ),
.s2( w ),
.mask( mask ),
.out( dout ),
.op( alu_op ),
.c_in( status[0] ),
.c( c_out ),
.dc( dc_out ),
.z( z_out )
);
 
// Register file connections
assign rf_wr_bnk = fsr[6:5];
679,7 → 684,6
 
mux2_8 u21( .sel(stat_we), .in1( {dout | 8'h18} ), .in0( {status[7:3],status_next2[2:0]} ), .out(status_next) );
 
//synopsys sync_set_reset "rst"
always @(posedge clk)
if(rst) status <= #1 STAT_RST_VALUE;
else status <= #1 status_next;
688,7 → 692,6
 
mux2_7 u31( .sel(fsr_we), .in1(dout[6:0]), .in0(fsr), .out(fsr_next) );
 
//synopsys sync_set_reset "rst"
always @(posedge clk)
if(rst) fsr <= #1 FSR_RST_VALUE;
else fsr <= #1 fsr_next;
696,25 → 699,21
always @(posedge clk)
if(valid_1 & (w_we | (w_we1 & ~instr_1[5])) ) w <= #1 dout;
 
//synopsys sync_set_reset "rst"
always @(posedge clk)
if(rst) trisa <= #1 TRIS_RST_VALUE;
else
if(trisa_we & valid_1) trisa <= #1 w;
 
//synopsys sync_set_reset "rst"
always @(posedge clk)
if(rst) trisb <= #1 TRIS_RST_VALUE;
else
if(trisb_we & valid_1) trisb <= #1 w;
 
//synopsys sync_set_reset "rst"
always @(posedge clk)
if(rst) trisc <= #1 TRIS_RST_VALUE;
else
if(trisc_we & valid_1) trisc <= #1 w;
 
//synopsys sync_set_reset "rst"
always @(posedge clk)
if(rst) option <= #1 OPT_RST_VALUE;
else
743,20 → 742,28
//assign tmr0_next = tmr0_we ? dout : tmr0_cnt_en ? (tmr0 + 1) : tmr0;
 
 
mux2_8 u5( .sel(tmr0_we & valid_1), .in0(tmr0_next1), .in1(dout), .out(tmr0_next) );
mux2_8 u6( .sel(tmr0_cnt_en), .in0(tmr0), .in1(tmr0_plus_1), .out(tmr0_next1) );
inc8 u7( .in(tmr0), .out(tmr0_plus_1) );
mux2_8 u5( .sel(tmr0_we & valid_1),
.in0(tmr0_next1), .in1(dout),
.out(tmr0_next) );
mux2_8 u6( .sel(tmr0_cnt_en),
.in0(tmr0), .in1(tmr0_plus_1),
.out(tmr0_next1) );
 
inc8 u7( .in(tmr0), .out(tmr0_plus_1) );
 
always @(posedge clk)
tmr0 <= #1 tmr0_next;
 
presclr_wdt u8( .clk(clk), .rst(rst), .tcki(tcki),
.option(option[5:0]),
.tmr0_we(tmr0_we & valid_1),
.tmr0_cnt_en(tmr0_cnt_en), .wdt_en(wdt_en),
.wdt_clr(wdt_clr & valid_1),
.wdt_to(wdt_to));
presclr_wdt u8( .clk( clk ),
.rst( rst ),
.tcki( tcki ),
.option( option[5:0] ),
.tmr0_we( tmr0_we & valid_1 ),
.tmr0_cnt_en( tmr0_cnt_en ),
.wdt_en( wdt_en ),
.wdt_clr( wdt_clr & valid_1 ),
.wdt_to( wdt_to )
);
 
 
////////////////////////////////////////////////////////////////////////
772,12 → 779,10
// registers in the IO cells, this is not needed. Synopsys FPGA compiler appears to
// make the correct decission either way, and gett rid of unneded logic ...
 
//synopsys sync_set_reset "rst"
always @(posedge clk)
if(rst) inst_addr <= #1 PC_RST_VECTOR;
else inst_addr <= #1 pc_next;
 
//synopsys sync_set_reset "rst"
always @(posedge clk)
if(rst) pc <= #1 PC_RST_VECTOR;
else pc <= #1 pc_next;
/trunk/verilog/core/risc_core_top.v
39,10 → 39,10
 
// CVS Log
//
// $Id: risc_core_top.v,v 1.2 2002-09-27 15:35:40 rudi Exp $
// $Id: risc_core_top.v,v 1.3 2002-10-01 12:44:24 rudi Exp $
//
// $Date: 2002-09-27 15:35:40 $
// $Revision: 1.2 $
// $Date: 2002-10-01 12:44:24 $
// $Revision: 1.3 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
49,6 → 49,8
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2002/09/27 15:35:40 rudi
// Minor update to newer devices ...
//
//
//
59,8 → 61,8
//
//
//
//
 
 
`timescale 1ns / 10ps
 
module mrisc_top(
67,7 → 69,7
clk, rst_in,
porta, portb, portc,
tcki,
wdt_en );
wdt_en ); // synthesis syn_useioff=1 syn_hier="flatten,remove"
 
// Basic Core I/O.
input clk;
101,14 → 103,6
wire [7:0] trisb;
wire [7:0] trisc;
 
wire block0, block1, wr_block0, wr_block1;
 
wire [10:0] wr_adr; // This signals can be used to optionally
wire [11:0] wr_data; // fill the internal ram from external memory
wire we;
 
wire [11:0] dout_unused;
 
////////////////////////////////////////////////////////////////////////
//
// IO Buffers
178,17 → 172,6
// Program memory
//
 
// Optional interface to fill the memory from external ROM
assign wr_adr = 11'h0;
assign wr_data = 12'h0;
assign we = 1'b0;
 
// Block selects
assign block0 = ~inst_addr[10];
assign block1 = inst_addr[10];
assign wr_block0 = ~wr_adr[10];
assign wr_block1 = wr_adr[10];
 
generic_spram #(11,12) imem(
.clk( clk ),
.rst( rst_in ),
196,8 → 179,8
.we( 1'b0 ),
.oe( 1'b1 ),
.addr( inst_addr ),
.di( ),
.di( 12'h0 ),
.do( inst_data )
);
);
 
endmodule

powered by: WebSVN 2.1.0

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