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

Subversion Repositories lwrisc

[/] [lwrisc/] [trunk/] [RTL/] [mem_man.v] - Blame information for rev 14

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 mcupro
/******************************************************************
2
 *                                                                *
3
 *    Author: Liwei                                               *
4
 *                                                                *
5
 *    This file is part of the "ClaiRISC" project,                *
6
 *    The folder in CVS is named as "lwrisc"                      *
7
 *    Downloaded from:                                            *
8
 *    http://www.opencores.org/pdownloads.cgi/list/lwrisc         *
9
 *                                                                *
10
 *    If you encountered any problem, please contact me via       *
11
 *    Email:mcupro@opencores.org  or mcupro@163.com               *
12
 *                                                                *
13
 ******************************************************************/
14
 
15 7 mcupro
`include "clairisc_def.h"
16
 
17
`define ADDR_FSR                   4
18
`define ADDR_STATUS                3
19
`define ADDR_IN0               5
20
`define ADDR_IN1               1
21
`define ADDR_OUT0                6
22
`define ADDR_OUT1                7
23
 
24
module wb_mem_man(
25
        input wr_en,
26
        input clk,
27
        input rst,
28
        input ci,
29
        input zi,
30
        input z_wr,
31
        input c_wr,
32
        output reg [7:0] dout,
33
        output co,
34
        output [1:0] bank,
35
        input [7:0] din     ,
36
        output reg [7:0]status     ,
37
 
38 14 mcupro
        input  [7:0] rd_addr, //[6:0]Should be also OK,For there is only 128byte RAM
39
        input  [7:0] wr_addr , //[6:0]Should be also OK,For there is only 128byte RAM
40 7 mcupro
 
41
        input  [7:0] in0,
42
        input  [7:0] in1,
43
        output reg [7:0] out0,
44
        output reg [7:0] out1
45
    );
46
    reg wr_en_r;
47 14 mcupro
    reg [7:0] din_r, wr_addr_r;
48
    reg [7:0] rd_addr_r;
49 7 mcupro
 
50
    always @(posedge clk)
51
    begin  //used to bypass the data
52
        //which wrote anf then be read in the followwing period
53
        wr_addr_r<=wr_addr;
54
        rd_addr_r<=rd_addr;
55
        wr_en_r<=wr_en;
56
        din_r<=din;
57
    end
58
 
59
    wire [7:0] ram_q ;
60
    wire [7:0] alt_ram_q;
61
 
62
    `ifdef SIM
63
 
64
    sim_reg_file i_reg_file(
65
                     .data(din),
66
                     .wren(wr_en),
67
                     .wraddress(wr_addr),
68
                     .rdaddress(rd_addr),
69
                     .clock(clk),
70
                     .q(alt_ram_q));
71
    `else
72
    ram128x8 i_reg_file(
73
                 .data(din),
74
                 .wren(wr_en),
75
                 .wraddress(wr_addr),
76
                 .rdaddress(rd_addr),
77
                 .clock(clk),
78
                 .q(alt_ram_q)
79
             );
80
    `endif
81
 
82
    assign ram_q = ((wr_addr_r==rd_addr_r)&&(wr_en_r))?din_r:alt_ram_q;
83
 
84
    /*status register*/
85
    wire write_status = wr_addr[4:0] ==`ADDR_STATUS && wr_en;
86
    always@(posedge clk)
87
    begin
88
        if (rst)status<=8'h3f;//default value
89
        else
90
            if (write_status)status<=din;
91
            else
92
            begin
93
                if (c_wr)status[0]<=ci;
94
                if (z_wr)status[2]<=zi;
95
            end
96
    end
97
 
98
    assign co = status[0];
99
 
100
    `ifdef SIM
101
 
102
    wire write_disp = wr_addr == 'h1f && wr_en;
103
    always@(posedge clk)
104
    begin
105
        if (write_disp)
106
            $display("hex=>%x< char=>%c<",din,din);
107
    end
108
    `endif
109
 
110
    /*fsr register*/
111
    reg [7:0] fsr;
112
    assign bank = fsr[6:5];
113
    wire write_fsr = wr_addr[4:0] == `ADDR_FSR &&wr_en ;
114
    always@(posedge clk)
115
    begin
116
        if (rst)fsr<=0;
117
        else  if(write_fsr) fsr<=din[7:0];
118
    end
119
 
120
    /*latch the input data*/
121
    reg [7:0]     reg_in1,reg_in0;
122
    always@(posedge clk) reg_in0<=in0;
123
    always@(posedge clk) reg_in1<=in1;
124
 
125
    /*data output latch */
126
    wire write_out0 = wr_addr[4:0] == `ADDR_OUT0 &&wr_en ;
127
    always@(posedge clk)
128
    begin
129
        if (rst)out0<=0;
130
        else  if(write_out0)out0<=din[7:0];
131
    end
132
 
133
    /*data output latch */
134
    wire write_out1 = wr_addr[4:0] == `ADDR_OUT1 &&wr_en ;
135
    always@(posedge clk)
136
    begin
137
        if (rst)out1<=0;
138
        else  if(write_out1)out1<=din[7:0];
139
    end
140
 
141
    /*data bus output select logic*/
142
    always@(*)//select status,fsr,wb_data,ram,wb_din
143
    case(rd_addr_r[4:0])
144
        `ADDR_FSR:dout    = fsr;
145
        `ADDR_STATUS:dout = status;
146
        `ADDR_IN0:dout    = reg_in0;
147
        `ADDR_IN1:dout    = reg_in1;
148
        default dout = ram_q ;
149
    endcase
150
endmodule
151
 
152
 
153
 

powered by: WebSVN 2.1.0

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