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

Subversion Repositories lwrisc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 15 to Rev 16
    Reverse comparison

Rev 15 → Rev 16

/trunk/BENCH/test1/seg7_decode.c
0,0 → 1,21
unsigned char byte2seg7(unsigned char my_byte)
{unsigned char seg;
switch (my_byte){
case 0: return 0xc0;//~8'b00111111;//b11111100;
case 1: return 0xf6;//~8'b00000110;//01100000;
case 2: return 0xa4;//~8'b01011011;//11011010;
case 3: return 0xb0;//~8'b01001111;//11010010;
case 4: return 0x99;//~8'b01100110;//1100110;
case 5: return 0x92;//~8'b01101101;//10110110;
case 6: return 0x82;//~8'b01111101;//10111110;
case 7: return 0xf8;//~8'b00000111;//11100000;
case 8: return 0x8f;//~8'b01111111;//11111110;
case 9: return 0x90;//~8'b01101111;//11110110;
case 10: return 0x88;//~8'b01110111;//11101110;
case 11: return 0x83;//~8'b01111100;//00111110;
case 12: return 0xa7;//~8'b01011000;//00011010;
case 13: return 0xa1;//~8'b01011110;//01111010;
case 14: return 0x86;//~8'b01111001;//10011110;
case 15: return 0x8e;//~8'b01110001;//10001110;
default : return 0xff;}
}
/trunk/BENCH/test1/sw_led.c
0,0 → 1,52
#device PIC16F54
 
#define PORT_DATA *(unsigned char*)0
#define IN_PORT_ADDR *(unsigned char*)1
#define OUT_PORT_ADDR *(unsigned char*)2
#define STATUS *(unsigned char*)3
 
#define PORT_ADDR_SEG 0
#define PORT_ADDR_LED 8
#define PORT_ADDR_SW 9
#define PORT_ADDR_KEY 10
#define PORT_ADDR_BEEP 11
 
void outport(unsigned char addr,unsigned char data)
{
OUT_PORT_ADDR = addr;
PORT_DATA = data;
}
 
unsigned char inport(unsigned char addr)
{
IN_PORT_ADDR = addr;
return PORT_DATA;
}
 
#define GetKey() inport(PORT_ADDR_KEY)
#define GetSwich() inport(PORT_ADDR_SW)
#define BeepSet(data) outport(PORT_ADDR_BEEP,data)
#define BeepON() outport(PORT_ADDR_BEEP,1)
#define BeepOFF() outport(PORT_ADDR_BEEP,0)
#define SetLed(data) outport(PORT_ADDR_LED,data)
 
#define Seg7Led(addr,data) outport(addr,data)
#define Seg7Led0(data) outport(0,data)
#define Seg7Led1(data) outport(1,data)
#define Seg7Led2(data) outport(2,data)
#define Seg7Led3(data) outport(3,data)
#define Seg7Led4(data) outport(4,data)
#define Seg7Led5(data) outport(5,data)
#define Seg7Led6(data) outport(6,data)
#define Seg7Led7(data) outport(7,data)
 
void main()
{
unsigned char i;
while(1){
i=GetSwich();
SetLed(i);
}
 
}
/trunk/CTOOL/hexdasm.exe Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
/trunk/CTOOL/hexdasm.c
55,7 → 55,7
static volatile unsigned char WB_CTL @ 0x06;*/
static char reg_name[30];
char*find_reg(unsigned int t)
{
{/*
//puts(&ins[7]);
if(t==0)
{
75,11 → 75,13
strcpy(reg_name,"PCL");
return reg_name ;
}
else if(t-3==0)
else
*/ if(t-3==0)
{
strcpy(reg_name,"STATUS");
return reg_name ;
}
}/*
else if(t==0+4)
{
strcpy(reg_name,"FSR");
102,6 → 104,7
strcpy(reg_name,"PORTC");
return reg_name ;
}
*/
return NULL ;
}
 
171,7 → 174,7
if(ins[11-5]=='1')t+=32;//1<<5 ;
if(ins[11-6]=='1')t+=64;//1<<6 ;
if(ins[11-7]=='1')t+=128;//1<<7 ;
if(ins[11-8]=='1')t+=256;//1<<8 ;
// if(ins[11-8]=='1')t+=256;//1<<8 ;
return t ;
}
 
862,7 → 865,7
fprintf(fpi,"%4X : %4X;\n",Memory[i].nAddress,Memory[i].byData);
}
fprintf(fpi,"\END;\n");
fprintf(fpi,"\nEND;\n");
printf("\END;\n");
close(fpi);
/*output simulate verilog code */
953,9 → 956,9
// getchar();
strcpy(mif_fn,"rom_set.h");
// strcpy(mif_fn,"rom_set.h");
fpi=fopen(mif_fn,"w");
// fpi=fopen(mif_fn,"w");
for(i=0;i<nMemoryCount;i++)
{
if ((Memory[i].nAddress==2047)&&(Memory[i-1].nAddress!=2046))continue;
971,9 → 974,9
// fprintf(fpi,"`define ALT_MEM_WIDTHAD %d\n",addr_wdt);
// fprintf(fpi,"`define ALT_MEM_NUMWORDS %d\n",1<<addr_wdt);
// `define MIF_NAME %s\n\n","init_file.mif");
fprintf(fpi,"`define ROM_TYPE rom%dx12\n\n",1<<func1(max));
// fprintf(fpi,"`define ROM_TYPE rom%dx12\n\n",1<<func1(max));
close(fpi);
// close(fpi);
// getchar();
}
 
/trunk/RTL/device_box.v
0,0 → 1,472
`define HARD_CLOCK
 
 
`ifndef HARD_CLOCK
`define SEG7_CLOCK_MODEL
`endif
 
 
module led_interface (
input clk, rst, wr, rd,
input [7:0] din,
output reg [7:0] dout,
output [7:0]led
);
reg [7:0] led_data;
assign led = led_data;
 
always @ (posedge clk)
if (rst)
led_data = 0;
else if (wr)
led_data=din;
 
always@ (posedge clk)
if (rd)
dout=led_data;
else dout = 0;
endmodule
 
 
module clock_seg7led_interface(
input clk,rst,
input [7:0]din,
output reg [7:0]dout,
input wr,rd ,
input [2:0]wr_addr,input [2:0]rd_addr,
output reg [7:0] seg7_sel,seg7_data
);
reg [7:0]buff[0:3];
always @ (posedge clk)
if (wr)
buff[wr_addr] = din;
 
always @(posedge clk)
if (rd)
dout = buff[rd_addr] ;
else dout=0;
 
/*the main counter*/
reg [31:0] seg7_cntr;
always @(posedge clk)seg7_cntr=seg7_cntr+1;
wire [2:0] sel =seg7_cntr[17:15] ;
wire flash_bit = seg7_cntr[21];
always @(posedge clk)
case (sel[2:0])
0:seg7_data=(buff[3][0]&flash_bit)?'hff:seg(buff[0][3:0]);
1:seg7_data=(buff[3][1]&flash_bit)?'hff:seg(buff[0][3:0]);
2:seg7_data=(buff[3][2]&flash_bit)?'hff:~8'b01000000;
3:seg7_data=(buff[3][3]&flash_bit)?'hff:seg(buff[1][3:0]);
4:seg7_data=(buff[3][4]&flash_bit)?'hff:seg(buff[1][3:0]);
5:seg7_data=(buff[3][5]&flash_bit)?'hff:~8'b01000000;
6:seg7_data=(buff[3][6]&flash_bit)?'hff:seg(buff[2][3:0]);
7:seg7_data=(buff[3][7]&flash_bit)?'hff:seg(buff[2][3:0]);
endcase
 
always @(posedge clk) seg7_sel=~(1<<sel);
function [7:0] seg;
input [3:0] data;
begin
case(data)
0: seg = ~8'b00111111;//b11111100;
1: seg = ~8'b00000110;//01100000;
2: seg = ~8'b01011011;//11011010;
3: seg = ~8'b01001111;//11010010;
4: seg = ~8'b01100110;//1100110;
5: seg = ~8'b01101101;//10110110;
6: seg = ~8'b01111101;//10111110;
7: seg = ~8'b00000111;//11100000;
8: seg = ~8'b01111111;//11111110;
9: seg = ~8'b01101111;//11110110;
10: seg = ~8'b01110111;//11101110;
11: seg = ~8'b01111100;//00111110;
12: seg = ~8'b01011000;//00011010;
13: seg = ~8'b01011110;//01111010;
14: seg = ~8'b01111001;//10011110;
15: seg = ~8'b01110001;//10001110;
endcase
end
endfunction
endmodule
 
 
module seg7led_interface(
input clk,rst,
input [7:0]din,
output reg [7:0]dout,
input wr,rd ,
input [2:0]wr_addr,
input [2:0]rd_addr,
output reg [7:0] seg7_sel,
output reg [7:0] seg7_data
);
reg [7:0]buff[0:7];
 
always @ (posedge clk)if (wr)buff[wr_addr] = din;
 
always @(posedge clk)if (rd)dout = buff[rd_addr] ;else dout=0;
 
reg [22:0] cntr ;
always @ (posedge clk)
cntr = cntr +1;
reg [2:0]sel ;
always @ (posedge clk)
sel= cntr[22:19];
 
always @(posedge clk)
case (sel)
0:seg7_data=buff[0];
1:seg7_data=buff[1];
2:seg7_data=buff[2];
3:seg7_data=buff[3];
4:seg7_data=buff[4];
5:seg7_data=buff[5];
6:seg7_data=buff[6];
7:seg7_data=buff[7];
endcase
always @(posedge clk)
seg7_sel = 1<<sel;
 
endmodule
 
 
module sw_interface(
input clk,rst,rd,
input [7:0]sw,
output reg[7:0] dout
);
reg [7:0]sw_r;
always @ (posedge clk)sw_r = sw;
always @ (posedge clk)if (rd)dout=sw_r;else dout =0;
endmodule
 
module key_interface(
input clk,rst,rd,
input [3:0]key,
output reg [7:0]dout
);
reg [3:0]key_r;
always @ (posedge clk)
key_r=key;
 
wire [3:0]w_key;
always @(posedge clk)
begin
dout[7:4]=0;
if (rd)dout[3:0] = w_key;else dout[3:0]=0;
end
 
`define KEY_FSM
`ifdef KEY_FSM
key_fsm ukey0(.clk(clk),.rst(rst),.key_i(key_r[0]),.key_o(w_key[0]),.rd(rd));
key_fsm ukey1(.clk(clk),.rst(rst),.key_i(key_r[1]),.key_o(w_key[1]),.rd(rd));
key_fsm ukey2(.clk(clk),.rst(rst),.key_i(key_r[2]),.key_o(w_key[2]),.rd(rd));
key_fsm ukey3(.clk(clk),.rst(rst),.key_i(key_r[3]),.key_o(w_key[3]),.rd(rd));
`else
assign w_key = key_r;
`endif
endmodule
 
module beep_interface(
input clk,rst,rd,wr,
output reg [7:0]dout ,
input [7:0]din,
output beep
);
reg beep_en;
always @ (posedge clk)
if (rst)beep_en=0;
else if (wr)
beep_en=din[0];
always @(posedge clk)
if (rd)
dout ={7'b0, beep_en};
else dout=0;
BELL uu(
.sys_clk(clk),
.beep(beep),
.beep_en(beep_en)
);
endmodule
`define ADDR_LED 8
`define ADDR_SEG 0
`define ADDR_SW 9
`define ADDR_KEY 10
`define ADDR_BEEP 11
`define ADDR_SECGEN 12
module devices_box(
input clk,rst,wr,rd,
input [7:0]din,
input [7:0]sw ,
input [3:0] key,
input [7:0]wr_addr,
input [7:0]rd_addr,
output [7:0]dout ,
output [7:0]seg7_sel,
output [7:0]seg7_data,
output [7:0]led
);
 
wire [7:0]dout_key;
wire sel_key_wr = wr_addr==`ADDR_KEY;
wire sel_key_rd = rd_addr==`ADDR_KEY;
key_interface u1(
.clk(clk),
.rst(rst),
.rd(rd&sel_key_rd),
.key(key),
.dout(dout_key)
);
 
wire [7:0]dout_sw;
wire sel_sw_wr = wr_addr==`ADDR_SW;
wire sel_sw_rd = rd_addr==`ADDR_SW;
sw_interface u2(
.clk(clk),
.rst(rst),
.rd(rd&sel_sw_rd),
.sw(sw),
.dout(dout_sw)
);
 
wire [7:0]dout_seg7led;
wire sel_seg7_wr = (wr_addr&(~7))== 0;
wire sel_seg7_rd = (rd_addr&(~7))== 0;
 
`ifdef HARD_CLOCK
hard_clock
`else
`ifdef SEG7_CLOCK_MODEL
clock_seg7led_interface
`else
seg7led_interface
`endif
`endif
 
clock(
.clk(clk),
.rst(rst),
.din(din ),
.dout(dout_seg7led),
.wr(wr&sel_seg7_wr ),
.rd(rd&sel_seg7_rd ) ,
.rd_addr(rd_addr[2:0]),
.wr_addr(wr_addr[2:0]),
.seg7_sel(seg7_sel),
.seg7_data(seg7_data)
);
 
 
wire [7:0] dout_led;
wire sel_led_wr = rd_addr==`ADDR_LED;
wire sel_led_rd = wr_addr==`ADDR_LED;
led_interface u4(
.clk(clk),
.rst(rst),
.wr(wr&sel_led_wr),
.rd(rd&sel_led_rd),
.din(din),
.dout(dout_led),
.led(led)
);
 
wire [7:0]dout_beep;
 
wire sel_beep_rd = rd_addr==`ADDR_BEEP;
wire sel_beep_wr = wr_addr==`ADDR_BEEP;
 
beep_interface u5(
.clk(clk),
.rst(rst),
.rd(rd&sel_beep_rd),
.wr(wr&sel_beep_wr),
.dout(dout_beep) ,
.din(din),
.beep(beep)
);
 
wire [7:0] dout_secgen ;
wire sel_secgen_rd = rd_addr==`ADDR_SECGEN;
wire sel_secgen_wr = wr_addr==`ADDR_SECGEN;
 
second_gen secgen(
.clk(clk),
.rst(rst),
.rd(rd&sel_secgen_rd),
.din(din),
.wr(wr&sel_secgen_wr),
.dout(dout_secgen)
);
 
assign dout = dout_key | dout_sw |dout_seg7led | dout_led | dout_beep | dout_secgen;
 
endmodule
 
`define CLK_HZ 25000000
 
module second_gen(
input clk,rst,
input rd,
input [7:0]din,
input wr,
output reg [7:0]dout
);
reg [31:0] cntr;
wire time_out = cntr==(`CLK_HZ-1);
 
wire clr = wr&(din[0]==0);
 
always @(posedge clk)
if (rst)cntr=0;
else
if (time_out)
cntr=0;
else
cntr=cntr+1;
reg int_req;
always @ (posedge clk)
if (clr)
int_req=0;
else
int_req = int_req|time_out ;
 
always @ (posedge clk)
if(rd)
dout={7'b0,int_req};
else dout=0;
endmodule
 
module hard_clock(
input clk,
input rst,
input wr,
input rd,
input [2:0]rd_addr,
input [2:0]wr_addr,
output reg [7:0] seg7_data,
output reg [7:0] seg7_sel,
input [7:0]din,
output reg[7:0]dout
);
`define CTL_ADDR 3
`define HOUR_ADDR 2
`define MIN_ADDR 1
`define SEC_ADDR 0
reg [7:0]hour;
reg [7:0]min;
reg [7:0]sec;
reg [7:0]ctl;
always @ (posedge clk)if (rst)hour=0; else if (wr&wr_addr==`HOUR_ADDR)hour=din;
always @ (posedge clk)if (rst)min=0; else if (wr&wr_addr==`MIN_ADDR)min=din;
always @ (posedge clk)if (rst)sec=0; else if (wr&wr_addr==`SEC_ADDR)sec=din;
always @(posedge clk) if (rd)
case (rd_addr[2:0])
`SEC_ADDR:dout = sec;
`MIN_ADDR :dout = min;
`HOUR_ADDR:dout = hour;
`CTL_ADDR:dout = ctl;
endcase else dout=0;
/*the main counter*/
reg [31:0] seg7_cntr;
always @(posedge clk)seg7_cntr=seg7_cntr+1;
wire [2:0] sel =seg7_cntr[17:15] ;
wire flash_bit = seg7_cntr[23];
always @(posedge clk)
case (sel[2:0])
0:seg7_data=(ctl[0]&flash_bit)?'hff:seg(sec[3:0]);
1:seg7_data=(ctl[1]&flash_bit)?'hff:seg(sec[7:4]);
2:seg7_data=(ctl[2]&flash_bit)?'hff:~8'b01000000;
3:seg7_data=(ctl[3]&flash_bit)?'hff:seg(min[3:0]);
4:seg7_data=(ctl[4]&flash_bit)?'hff:seg(min[7:4]);
5:seg7_data=(ctl[5]&flash_bit)?'hff:~8'b01000000;
6:seg7_data=(ctl[6]&flash_bit)?'hff:seg(hour[3:0]);
7:seg7_data=(ctl[7]&flash_bit)?'hff:seg(hour[7:4]);
endcase
 
always @(posedge clk) seg7_sel=~(1<<sel);
function [7:0] seg;
input [3:0] data;
begin
case(data)
0: seg = ~8'b00111111;//b11111100;
1: seg = ~8'b00000110;//01100000;
2: seg = ~8'b01011011;//11011010;
3: seg = ~8'b01001111;//11010010;
4: seg = ~8'b01100110;//1100110;
5: seg = ~8'b01101101;//10110110;
6: seg = ~8'b01111101;//10111110;
7: seg = ~8'b00000111;//11100000;
8: seg = ~8'b01111111;//11111110;
9: seg = ~8'b01101111;//11110110;
10: seg = ~8'b01110111;//11101110;
11: seg = ~8'b01111100;//00111110;
12: seg = ~8'b01011000;//00011010;
13: seg = ~8'b01011110;//01111010;
14: seg = ~8'b01111001;//10011110;
15: seg = ~8'b01110001;//10001110;
endcase
end
endfunction
endmodule
 
 
`define KEY_ACTIVE_LEVEL 1
`define TIME_OUT_VALUE 25000000/2
 
module key_fsm(
input clk,rst,
input key_i,
output reg key_o,
input rd
);
reg [3:0]curr_state,next_state;
reg [31:0] cntr ;
always @ (posedge clk)
if (rst)cntr =0;
else if (curr_state==1)
cntr=cntr+1;
else cntr=0;
always @ (posedge clk)
if (rst)curr_state=0;
else
curr_state = next_state;
always @*
case (curr_state)
0:if (key_i==`KEY_ACTIVE_LEVEL&rd)
//read a active key value ,then we need delay for a period
next_state = 1;else next_state = 0;
1:if(cntr==`TIME_OUT_VALUE)
next_state = 0;else next_state = 1;
endcase
always @*
key_o=key_i&(~curr_state);
endmodule
/trunk/RTL/risc_core.v
1,25 → 1,14
/******************************************************************
* *
* Author: Liwei *
* *
* This file is part of the "ClaiRISC" project, *
* The folder in CVS is named as "lwrisc" *
* Downloaded from: *
* http://www.opencores.org/pdownloads.cgi/list/lwrisc *
* *
* If you encountered any problem, please contact me via *
* Email:mcupro@opencores.org or mcupro@163.com *
* *
******************************************************************/
 
`include "clairisc_def.h"
module ClaiRISC_core (
input clk,
input rst ,
input [7:0] in0,
input [7:0] in1,
output [7:0] out0,
output [7:0] out1
input rst,
output [7:0]dvc_wr_addr,
output [7:0]dvc_rd_addr,
output [7:0]data_mem2dvc,
input [7:0]data_dvc2mem,
output dvc_wr ,
output dvc_rd
);
supply0 GND;
35,8 → 24,8
reg w_reg_muxb_r;
reg w_skip;
reg w_w_wr;
reg w_w_wr_r;
wire w_z;
reg w_w_wr_r;
wire w_z;
reg w_z_wr;
reg w_z_wr_r;
reg [7:0] w_alu_in_a;
43,7 → 32,7
reg [7:0] w_alu_in_b;
reg [4:0] w_alu_op;
reg [4:0] w_alu_op_r;
reg [7:0] w_alu_res;
reg [7:0] w_alu_res;
wire [1:0] w_bank;
reg [7:0] w_bd_r;
reg [1:0] w_brc_ctl;
54,7 → 43,7
reg [10:0] w_pc;
reg [2:0] w_pc_gen_ctl;
reg [10:0] w_pc_nxt;
wire [6:0] w_rd_addr;
wire [4:0] w_rd_addr;
wire [7:0] w_status;
reg [1:0] w_stk_op;
wire [10:0] w_stk_pc;
61,12 → 50,20
reg[4:0] w_wbadd_r;
wire [4:0] w_wd_addr;
reg [7:0] w_wreg;
wire [6:0] w_wr_addr;
wire [4:0] w_wr_addr;
 
always @(posedge clk)
w_pc<=w_pc_nxt;
reg [10:0] stack1, stack2, stack3, stack4;
reg [10:0] stack1, stack2,stack3, stack4;
initial begin
stack1=0;
stack2=0;
stack3=0;
stack4=0;
end
assign w_stk_pc = stack1;
 
always @(posedge clk)
73,27 → 70,26
begin
case (w_stk_op)
`STK_PSH :// PUSH stack
begin
begin
stack4 <= stack3;
stack3 <= stack2;
stack3 <= stack2;
stack2 <= stack1;
stack1 <= w_pc;
stack1 <= w_pc+1;
end
`STK_POP :// POP stack
begin
stack1 <= stack2;
stack2 <= stack3;
stack3 <= stack4;
end
stack1 <= stack2;
stack2 <= stack3;
stack3 <= stack4;
end
// default ://do nothing
endcase
end
assign w_rd_addr ={ w_bank[1:0],w_wd_addr[4:0]};
assign w_rd_addr =w_wd_addr[4:0];
 
wb_mem_man mem_man
(
.bank(w_bank),
mem_man mem_man
(
.c_wr(w_c_wr_r),
.ci(w_c_2mem),
.clk(clk),
100,54 → 96,56
.co(w_c_2alu),
.din(w_alu_res),
.dout(w_file_o),
.rd_addr(w_rd_addr),
.rd_addr(w_rd_addr[4:0]),
.rst(rst),
.status(w_status),
.wr_addr(w_wr_addr),
.wr_addr(w_wr_addr[4:0]),
.wr_en(w_mem_wr_r),
.z_wr(w_z_wr_r),
.zi(w_z),
.in0(in0),
.in1(in1),
.out0(out0),
.out1(out1)
.zi(w_z),
.dvc_wr_addr(dvc_wr_addr),
.dvc_rd_addr(dvc_rd_addr),
.data_mem2dvc(data_mem2dvc),
.data_dvc2mem(data_dvc2mem),
.dvc_wr(dvc_wr),
.dvc_rd(dvc_rd)
);
 
always @(posedge clk)
if (w_skip==1)
always @(posedge clk)
if (w_skip)
w_alu_op_r<=0;
else
w_alu_op_r<=w_alu_op;
 
always@(posedge clk)
if (w_skip==1) w_br_ctl_r<=0;
if (w_skip) w_br_ctl_r<=0;
else w_br_ctl_r<=w_brc_ctl;
 
always@(posedge clk)
if (w_skip==1) w_z_wr_r<=0;
if (w_skip) w_z_wr_r<=0;
else w_z_wr_r<=w_z_wr;
 
always @ (posedge clk)
if (w_skip==1)
if (w_skip)
w_c_wr_r<=0;
else
w_c_wr_r<=w_c_wr;
 
always @(posedge clk)
if(w_skip==1)
if(w_skip)
w_mem_wr_r<=0;
else
else
w_mem_wr_r<=w_mem_wr;
always @(posedge clk)
if (w_w_wr_r==1)
if (w_w_wr_r)
w_wreg<=w_alu_res;
always @ (posedge clk)
w_bd_r<=1<<w_ins[7:5];
 
always @(posedge clk)
w_w_wr_r <=w_w_wr ;
always @(posedge clk)
w_w_wr_r <=w_w_wr ;
 
always @(posedge clk)
w_ek_r<=w_ins[8:0];
156,10 → 154,9
 
always@(posedge clk)
w_wbadd_r<=w_wd_addr;
 
assign w_wr_addr = {w_bank[1:0],w_wbadd_r[4:0]};
 
 
assign w_wr_addr = w_wbadd_r[4:0];
reg addercout;
always @(*) begin
case (w_alu_op_r) // synsys parallel_case
218,14 → 215,13
//then skip the next instruction
default w_skip = 0;
endcase
 
 
pram program_rom
com_prom program_rom
(
.clk(clk),
.dout(w_ins),
.rd_addr(w_pc_nxt)
);
);
 
always @ (*)
if (rst)
239,8 → 235,8
begin
case(w_pc_gen_ctl)
`PC_GOTO,
`PC_CALL: w_pc_nxt= {w_status[7:6],w_ins[8:0]};
`PC_RET: w_pc_nxt= w_stk_pc;
`PC_CALL: w_pc_nxt= w_ins[7:0];//{w_status[7:6],1'b0,w_ins[7:0]};
`PC_RET : w_pc_nxt= w_stk_pc;
default
w_pc_nxt= w_pc+1;
endcase
247,7 → 243,7
end
 
 
always @(*) begin
always @(*) begin
casex (w_ins)
 
12'b0000_001X_XXXX: //Checked 2008_11_22
822,7 → 818,7
//REPLACE ID = RETLW
//REPLACE ID = RETLW
begin
w_pc_gen_ctl = `PC_NEXT;
w_pc_gen_ctl = `PC_RET ;
w_stk_op = `STK_POP;
w_muxa_ctl = `MUXA_IGN;
w_muxb_ctl = `MUXB_EK; //check 2008_11_22
946,6 → 942,5
w_brc_ctl = `BG_NOP;
end //end of NOP ;
endcase
end
 
end
endmodule
/trunk/RTL/mem_man.v
1,74 → 1,70
/******************************************************************
* *
* Author: Liwei *
* *
* This file is part of the "ClaiRISC" project, *
* The folder in CVS is named as "lwrisc" *
* Downloaded from: *
* http://www.opencores.org/pdownloads.cgi/list/lwrisc *
* *
* If you encountered any problem, please contact me via *
* Email:mcupro@opencores.org or mcupro@163.com *
* *
******************************************************************/
 
`include "clairisc_def.h"
`define ADDR_FSR 4
`define ADDR_STATUS 3
`define ADDR_IN0 5
`define ADDR_IN1 1
`define ADDR_OUT0 6
`define ADDR_OUT1 7
`define ADDR_DVC_DATA 0
`define ADDR_DVC_WR_ADDR 2
`define ADDR_DVC_RD_ADDR 1
 
module wb_mem_man(
/*
#define PORT_DATA *(unsigned char*)0
#define IN_PORT_ADDR *(unsigned char*)1
#define OUT_PORT_ADDR *(unsigned char*)2
#define STATUS *(unsigned char*)3
*/
 
module mem_man(
input wr_en,
input clk,
input rst,
input rst,
input ci,
input zi,
input z_wr,
input c_wr,
output reg [7:0] dout,
output reg [7:0] dout,
output co,
output [1:0] bank,
input [7:0] din ,
output reg [7:0]status ,
 
input [7:0] rd_addr, //[6:0]Should be also OK,For there is only 128byte RAM
input [7:0] wr_addr , //[6:0]Should be also OK,For there is only 128byte RAM
input [4:0] rd_addr,
input [4:0] wr_addr ,
output reg [7:0]dvc_wr_addr,
output reg [7:0]dvc_rd_addr,
output reg [7:0]data_mem2dvc,
input [7:0]data_dvc2mem,
output reg dvc_wr ,
output /*reg */dvc_rd
);
 
input [7:0] in0,
input [7:0] in1,
output reg [7:0] out0,
output reg [7:0] out1
);
reg wr_en_r;
reg [7:0] din_r, wr_addr_r;
reg [7:0] rd_addr_r;
reg [7:0] din_r;
reg [4:0] wr_addr_r;
reg [4:0] rd_addr_r;
 
always @(posedge clk)
begin //used to bypass the data
//which wrote anf then be read in the followwing period
begin
wr_addr_r<=wr_addr;
rd_addr_r<=rd_addr;
wr_en_r<=wr_en;
din_r<=din;
end
 
end
wire [7:0] ram_q ;
wire [7:0] alt_ram_q;
 
`ifdef SIM
 
// `ifdef SIM
sim_reg_file i_reg_file(
.data(din),
.wren(wr_en),
.wraddress(wr_addr),
.rdaddress(rd_addr),
.wraddress(wr_addr[4:0]),
.rdaddress(rd_addr[4:0]),
.clock(clk),
.q(alt_ram_q));
`else
/* `else
ram128x8 i_reg_file(
.data(din),
.wren(wr_en),
76,11 → 72,11
.rdaddress(rd_addr),
.clock(clk),
.q(alt_ram_q)
);
);
`endif
*/
assign ram_q =/* ((wr_addr_r==rd_addr_r)&&(wr_en_r))?din_r:*/alt_ram_q;
 
assign ram_q = ((wr_addr_r==rd_addr_r)&&(wr_en_r))?din_r:alt_ram_q;
 
/*status register*/
wire write_status = wr_addr[4:0] ==`ADDR_STATUS && wr_en;
always@(posedge clk)
91,62 → 87,34
else
begin
if (c_wr)status[0]<=ci;
if (z_wr)status[2]<=zi;
if (z_wr)status[2]<=zi;
end
end
 
end
assign co = status[0];
 
`ifdef SIM
wire write_disp = wr_addr == 'h1f && wr_en;
always@(posedge clk)
`ifdef SIM
always@(*)
begin
if (write_disp)
$display("hex=>%x< char=>%c<",din,din);
if (wr_en)
$display("hex=>%x< char=>%x<",wr_addr[4:0],din[7:0]);
end
`endif
 
/*fsr register*/
reg [7:0] fsr;
assign bank = fsr[6:5];
wire write_fsr = wr_addr[4:0] == `ADDR_FSR &&wr_en ;
always@(posedge clk)
begin
if (rst)fsr<=0;
else if(write_fsr) fsr<=din[7:0];
end
 
/*latch the input data*/
reg [7:0] reg_in1,reg_in0;
always@(posedge clk) reg_in0<=in0;
always@(posedge clk) reg_in1<=in1;
 
/*data output latch */
wire write_out0 = wr_addr[4:0] == `ADDR_OUT0 &&wr_en ;
always@(posedge clk)
begin
if (rst)out0<=0;
else if(write_out0)out0<=din[7:0];
end
 
/*data output latch */
wire write_out1 = wr_addr[4:0] == `ADDR_OUT1 &&wr_en ;
always@(posedge clk)
begin
if (rst)out1<=0;
else if(write_out1)out1<=din[7:0];
end
 
/*data bus output select logic*/
always@(*)//select status,fsr,wb_data,ram,wb_din
case(rd_addr_r[4:0])
`ADDR_FSR:dout = fsr;
`ADDR_STATUS:dout = status;
`ADDR_IN0:dout = reg_in0;
`ADDR_IN1:dout = reg_in1;
`endif
always@(*)
case(rd_addr_r[4:0])
`ADDR_STATUS:dout = status;
`ADDR_DVC_DATA :dout = data_dvc2mem ;
default dout = ram_q ;
endcase
endcase
always @ (posedge clk) if ((wr_addr[4:0]==`ADDR_DVC_WR_ADDR)&&(1==wr_en))dvc_wr_addr <=din;
always @ (posedge clk) if ((wr_addr[4:0]==`ADDR_DVC_RD_ADDR)&&(1==wr_en)) dvc_rd_addr <=din;
always @ (posedge clk) if ((wr_addr[4:0]==`ADDR_DVC_DATA )&&(1==wr_en)) data_mem2dvc <=din;
always @ (*) dvc_wr <=wr_en_r&(wr_addr==0);
assign dvc_rd = 1'b1 ;
endmodule
 
 

powered by: WebSVN 2.1.0

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