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

Subversion Repositories mips789

[/] [mips789/] [tags/] [arelease/] [rtl/] [verilog/] [mem_module.v] - Blame information for rev 56

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

Line No. Rev Author Line
1 35 mcupro
/******************************************************************
2
 *                                                                *
3
 *    Author: Liwei                                               *
4
 *                                                                *
5
 *    This file is part of the "mips789" project.                 *
6
 *    Downloaded from:                                            *
7
 *    http://www.opencores.org/pdownloads.cgi/list/mips789        *
8
 *                                                                *
9
 *    If you encountered any problem, please contact me via       *
10
 *    Email:mcupro@opencores.org  or mcupro@163.com               *
11
 *                                                                *
12
 ******************************************************************/
13 10 mcupro
 
14 35 mcupro
`include "mips789_defs.v"
15 10 mcupro
 
16 35 mcupro
 
17 10 mcupro
module mem_module  (
18
        clk,din,dmem_addr_i,dmem_ctl,
19 35 mcupro
        zZ_din,Zz_addr,Zz_dout,Zz_wr_en,dout
20
    ) ;
21 10 mcupro
 
22
    input clk;
23
    wire clk;
24
    input [31:0] din;
25
    wire [31:0] din;
26
    input [31:0] dmem_addr_i;
27
    wire [31:0] dmem_addr_i;
28
    input [3:0] dmem_ctl;
29
    wire [3:0] dmem_ctl;
30
    input [31:0] zZ_din;
31
    wire [31:0] zZ_din;
32
    output [31:0] Zz_addr;
33
    wire [31:0] Zz_addr;
34
    output [31:0] Zz_dout;
35
    wire [31:0] Zz_dout;
36
    output [3:0] Zz_wr_en;
37
    wire [3:0] Zz_wr_en;
38
    output [31:0] dout;
39
    wire [31:0] dout;
40
 
41
    wire [3:0] BUS512;
42
    wire [1:0] BUS629;
43
    wire [31:0] BUS650;
44
 
45
 
46
    infile_dmem_ctl_reg dmem_ctl_post
47
                        (
48
                            .byte_addr_o(BUS629),
49
                            .clk(clk),
50
                            .ctl_i(dmem_ctl),
51
                            .ctl_o(BUS512),
52
                            .dmem_addr_i(BUS650)
53
                        );
54
 
55
 
56
 
57
    mem_addr_ctl i_mem_addr_ctl
58
                 (
59
                     .addr_i(BUS650),
60
                     .ctl(dmem_ctl),
61
                     .wr_en(Zz_wr_en)
62
                 );
63
 
64
 
65
 
66
    mem_din_ctl i_mem_din_ctl
67
                (
68
                    .ctl(dmem_ctl),
69
                    .din(din),
70
                    .dout(Zz_dout)
71
                );
72
 
73
 
74
 
75
    mem_dout_ctl i_mem_dout_ctl
76
                 (
77
                     .byte_addr(BUS629),
78
                     .ctl(BUS512),
79
                     .din(zZ_din),
80
                     .dout(dout)
81
                 );
82
 
83
 
84
 
85
    assign BUS650[31:0] = dmem_addr_i[31:0];
86
 
87
    assign Zz_addr[31:0] = BUS650[31:0];
88
 
89
endmodule
90
 
91
 
92
module infile_dmem_ctl_reg(
93
        input clk,
94
        input [3:0]ctl_i,
95
        input [31:0]dmem_addr_i,
96
        output reg [1:0]byte_addr_o,
97
        output reg [3:0]ctl_o
98
    );
99
 
100
    wire   [1:0]byte_addr_i;
101
    assign byte_addr_i = dmem_addr_i[1:0] ;
102
    always @(posedge clk)
103
    begin
104
        ctl_o<=(dmem_addr_i[31]==0)?ctl_i:0;
105
        byte_addr_o<=byte_addr_i;
106
    end
107
 
108
endmodule
109
 
110
module mem_addr_ctl(
111
        input [3:0]ctl,
112
        input [31:0]addr_i,
113
        output reg[3:0]wr_en
114
    );
115
    always@(*)
116
    case (ctl)
117
        `DMEM_SB:
118
        begin
119
            case(addr_i[1:0])
120
                0:wr_en = 4'b1000;
121
                1:wr_en = 4'b0100;
122
                2:wr_en = 4'b0010;
123
                3:wr_en = 4'b0001;
124 35 mcupro
                default :wr_en = 4'b000;
125 10 mcupro
            endcase
126
        end
127
        `DMEM_SH  :
128
        begin
129
            case(addr_i[1:0])
130
                'd0:wr_en=4'b1100;
131
                'd2:wr_en=4'b0011;
132 35 mcupro
                default :wr_en = 4'b0000;
133 10 mcupro
            endcase
134
        end
135
        `DMEM_SW :
136
        begin
137
            wr_en=4'b1111;
138
        end
139
        default wr_en=4'b0000;
140
    endcase
141
 
142
endmodule
143
 
144
 
145
 
146
module mem_dout_ctl(
147
        input [1:0]byte_addr,
148
        input [3:0]ctl,
149
        input [31:0] din,
150
        output reg [31:0] dout
151
    );
152
 
153
    wire [31:0] w31 = {
154
             din[31],din[31],din[31],din[31],din[31],din[31],din[31],din[31],
155
             din[31],din[31],din[31],din[31],din[31],din[31],din[31],din[31],
156
             din[31],din[31],din[31],din[31],din[31],din[31],din[31],din[31],
157
             din[31],din[31],din[31],din[31],din[31],din[31],din[31],din[31]} ;
158
 
159
    wire [31:0] w23 = {
160
             din[23],din[23],din[23],din[23],din[23],din[23],din[23],din[23],
161
             din[23],din[23],din[23],din[23],din[23],din[23],din[23],din[23],
162
             din[23],din[23],din[23],din[23],din[23],din[23],din[23],din[23],
163
             din[23],din[23],din[23],din[23],din[23],din[23],din[23],din[23]}  ;
164
 
165
    wire [31:0] w15 = {
166
             din[15],din[15],din[15],din[15],din[15],din[15],din[15],din[15],
167
             din[15],din[15],din[15],din[15],din[15],din[15],din[15],din[15],
168
             din[15],din[15],din[15],din[15],din[15],din[15],din[15],din[15],
169
             din[15],din[15],din[15],din[15],din[15],din[15],din[15],din[15]}   ;
170
    wire [31:0] w7 = {
171
             din[7],din[7],din[7],din[7],din[7],din[7],din[7],din[7],
172
             din[7],din[7],din[7],din[7],din[7],din[7],din[7],din[7],
173
             din[7],din[7],din[7],din[7],din[7],din[7],din[7],din[7],
174 35 mcupro
             din[7],din[7],din[7],din[7],din[7],din[7],din[7],din[7]}     ;
175 10 mcupro
 
176
    always @(*)
177
    case (ctl)
178
 
179
        `DMEM_LBS :
180
        case (byte_addr)
181
            'd0:dout={w31[23:0],din[31:24]};
182
            'd1:dout={w23[23:0],din[23:16]};
183
            'd2:dout={w15[23:0],din[15:8]};
184
            'd3:dout={w7[23:0],din[7:0] };
185
            default :
186
                dout=32'b0;
187
        endcase//checked
188
        `DMEM_LBU :
189
        case (byte_addr)
190
            'd3:dout={24'b0,din[7:0]};
191
            'd2:dout={24'b0,din[15:8]};
192
            'd1:dout={24'b0,din[23:16]};
193
            'd0:dout={24'b0,din[31:24]};
194
            default :
195
                dout=32'b0;
196
        endcase
197
        `DMEM_LHU :
198
        case (byte_addr)
199
            'd0:dout={16'b0,din[31:24],din[23:16]};
200
            'd2:dout={16'b0,din[15:8],din[7 :0]};
201 35 mcupro
            default:dout=0;
202 10 mcupro
        endcase
203
        `DMEM_LHS :
204
        case (byte_addr)
205
            'd0 :dout={w31[15:0],din[31:24],din[23:16]};
206
            'd2 :dout={w15[15:0],din[15:8],din[7 :0]};
207 35 mcupro
            default:dout=0;
208 10 mcupro
        endcase
209
        `DMEM_LW  :
210
            dout=din;
211
        default :
212 35 mcupro
            dout=0;
213 10 mcupro
    endcase
214
endmodule
215
 
216
module mem_din_ctl(
217
        input [3:0]ctl,
218
        input [31:0]din,
219
        output reg [31:0]dout
220
    );
221
 
222
    always @(*)
223
 
224
    case (ctl)
225
        `DMEM_SB   :
226
            dout={din[7:0],din[7:0],din[7:0],din[7:0]};
227
        `DMEM_SH   :
228
            dout = {din[15:0],din[15:0]};
229
        `DMEM_SW   :
230
            dout =din;
231
        default dout=din;
232
    endcase
233
 
234
endmodule

powered by: WebSVN 2.1.0

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