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

Subversion Repositories mips789

[/] [mips789/] [branches/] [avendor/] [rtl/] [verilog/] [mem_module.v] - Blame information for rev 10

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

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

powered by: WebSVN 2.1.0

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