Line 1... |
Line 1... |
/******************************************************************
|
|
* *
|
|
* 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"
|
`include "clairisc_def.h"
|
|
|
`define ADDR_FSR 4
|
|
`define ADDR_STATUS 3
|
`define ADDR_STATUS 3
|
`define ADDR_IN0 5
|
`define ADDR_DVC_DATA 0
|
`define ADDR_IN1 1
|
`define ADDR_DVC_WR_ADDR 2
|
`define ADDR_OUT0 6
|
`define ADDR_DVC_RD_ADDR 1
|
`define ADDR_OUT1 7
|
|
|
/*
|
|
#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 wb_mem_man(
|
module mem_man(
|
input wr_en,
|
input wr_en,
|
input clk,
|
input clk,
|
input rst,
|
input rst,
|
|
|
input ci,
|
input ci,
|
input zi,
|
input zi,
|
input z_wr,
|
input z_wr,
|
input c_wr,
|
input c_wr,
|
|
|
output reg [7:0] dout,
|
output reg [7:0] dout,
|
output co,
|
output co,
|
output [1:0] bank,
|
|
input [7:0] din ,
|
input [7:0] din ,
|
output reg [7:0]status ,
|
output reg [7:0]status ,
|
|
|
input [7:0] rd_addr, //[6:0]Should be also OK,For there is only 128byte RAM
|
input [4:0] rd_addr,
|
input [7:0] wr_addr , //[6:0]Should be also OK,For there is only 128byte RAM
|
input [4:0] wr_addr ,
|
|
|
input [7:0] in0,
|
output reg [7:0]dvc_wr_addr,
|
input [7:0] in1,
|
output reg [7:0]dvc_rd_addr,
|
output reg [7:0] out0,
|
output reg [7:0]data_mem2dvc,
|
output reg [7:0] out1
|
input [7:0]data_dvc2mem,
|
|
output reg dvc_wr ,
|
|
output /*reg */dvc_rd
|
);
|
);
|
|
|
|
|
reg wr_en_r;
|
reg wr_en_r;
|
reg [7:0] din_r, wr_addr_r;
|
reg [7:0] din_r;
|
reg [7:0] rd_addr_r;
|
reg [4:0] wr_addr_r;
|
|
reg [4:0] rd_addr_r;
|
|
|
always @(posedge clk)
|
always @(posedge clk)
|
begin //used to bypass the data
|
begin
|
//which wrote anf then be read in the followwing period
|
|
wr_addr_r<=wr_addr;
|
wr_addr_r<=wr_addr;
|
rd_addr_r<=rd_addr;
|
rd_addr_r<=rd_addr;
|
wr_en_r<=wr_en;
|
wr_en_r<=wr_en;
|
din_r<=din;
|
din_r<=din;
|
end
|
end
|
|
|
wire [7:0] ram_q ;
|
wire [7:0] ram_q ;
|
wire [7:0] alt_ram_q;
|
wire [7:0] alt_ram_q;
|
|
|
`ifdef SIM
|
// `ifdef SIM
|
|
|
sim_reg_file i_reg_file(
|
sim_reg_file i_reg_file(
|
.data(din),
|
.data(din),
|
.wren(wr_en),
|
.wren(wr_en),
|
.wraddress(wr_addr),
|
.wraddress(wr_addr[4:0]),
|
.rdaddress(rd_addr),
|
.rdaddress(rd_addr[4:0]),
|
.clock(clk),
|
.clock(clk),
|
.q(alt_ram_q));
|
.q(alt_ram_q));
|
`else
|
/* `else
|
ram128x8 i_reg_file(
|
ram128x8 i_reg_file(
|
.data(din),
|
.data(din),
|
.wren(wr_en),
|
.wren(wr_en),
|
.wraddress(wr_addr),
|
.wraddress(wr_addr),
|
.rdaddress(rd_addr),
|
.rdaddress(rd_addr),
|
.clock(clk),
|
.clock(clk),
|
.q(alt_ram_q)
|
.q(alt_ram_q)
|
);
|
);
|
`endif
|
`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*/
|
/*status register*/
|
wire write_status = wr_addr[4:0] ==`ADDR_STATUS && wr_en;
|
wire write_status = wr_addr[4:0] ==`ADDR_STATUS && wr_en;
|
always@(posedge clk)
|
always@(posedge clk)
|
begin
|
begin
|
Line 96... |
Line 92... |
end
|
end
|
|
|
assign co = status[0];
|
assign co = status[0];
|
|
|
`ifdef SIM
|
`ifdef SIM
|
|
always@(*)
|
wire write_disp = wr_addr == 'h1f && wr_en;
|
|
always@(posedge clk)
|
|
begin
|
begin
|
if (write_disp)
|
if (wr_en)
|
$display("hex=>%x< char=>%c<",din,din);
|
$display("hex=>%x< char=>%x<",wr_addr[4:0],din[7:0]);
|
end
|
end
|
`endif
|
`endif
|
|
|
/*fsr register*/
|
always@(*)
|
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])
|
case(rd_addr_r[4:0])
|
`ADDR_FSR:dout = fsr;
|
|
`ADDR_STATUS:dout = status;
|
`ADDR_STATUS:dout = status;
|
`ADDR_IN0:dout = reg_in0;
|
`ADDR_DVC_DATA :dout = data_dvc2mem ;
|
`ADDR_IN1:dout = reg_in1;
|
|
default dout = ram_q ;
|
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
|
endmodule
|
|
|
|
|
|
|
|
|
No newline at end of file
|
No newline at end of file
|