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

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [lib/] [gaisler/] [vlog/] [mem_module.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
/******************************************************************
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
 
14
`include "mips789_defs.v"
15
 
16
 
17
module mem_module  (
18
        clk,din,dmem_addr_i,dmem_ctl,
19
        zZ_din,Zz_addr,Zz_dout,Zz_wr_en,dout
20
    ) ;
21
 
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
 
103
    always @(posedge clk)
104
    begin
105
        ctl_o<=(dmem_addr_i[31]==0)?ctl_i:0;
106
        byte_addr_o<=byte_addr_i;
107
    end
108
 
109
endmodule
110
 
111
module mem_addr_ctl(
112
        input [3:0]ctl,
113
        input [31:0]addr_i,
114
        output reg[3:0]wr_en
115
    );
116
    always@(*)
117
    case (ctl)
118
        `DMEM_SB:
119
        begin
120
            case(addr_i[1:0])
121
                0:wr_en = 4'b1000;
122
                1:wr_en = 4'b0100;
123
                2:wr_en = 4'b0010;
124
                3:wr_en = 4'b0001;
125
                default :wr_en = 4'b000;
126
            endcase
127
        end
128
        `DMEM_SH  :
129
        begin
130
            case(addr_i[1:0])
131
                'd0:wr_en=4'b1100;
132
                'd2:wr_en=4'b0011;
133
                default :wr_en = 4'b0000;
134
            endcase
135
        end
136
        `DMEM_SW :
137
        begin
138
            wr_en=4'b1111;
139
        end
140
        default wr_en=4'b0000;
141
    endcase
142
 
143
endmodule
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
    always @(*)
154
    case (ctl)
155
 
156
        `DMEM_LBS :
157
        case (byte_addr)
158
 
159
                        'd0:dout={{24{din[31]}},din[31:24]};
160
            'd1:dout={{24{din[23]}},din[23:16]};
161
            'd2:dout={{24{din[15]}},din[15:8]};
162
            'd3:dout={{24{din[7]}},din[7:0] };
163
            default :
164
                dout=32'bX;
165
        endcase
166
        `DMEM_LBU :
167
        case (byte_addr)
168
            'd3:dout={24'b0,din[7:0]};
169
            'd2:dout={24'b0,din[15:8]};
170
            'd1:dout={24'b0,din[23:16]};
171
            'd0:dout={24'b0,din[31:24]};
172
            default :
173
                dout=32'bX;
174
        endcase
175
        `DMEM_LHU :
176
        case (byte_addr)
177
            'd0:dout={16'b0,din[31:24],din[23:16]};
178
            'd2:dout={16'b0,din[15:8],din[7 :0]};
179
            default:dout=32'bX;
180
        endcase
181
        `DMEM_LHS :
182
        case (byte_addr)
183
                        'd0 :dout={{16{din[31]}},din[31:24],din[23:16]};
184
            'd2 :dout={{16{din[15]}},din[15:8],din[7 :0]};
185
            default:dout=32'bX;
186
        endcase
187
        `DMEM_LW  :
188
            dout=din;
189
        default :
190
            dout=0;
191
    endcase
192
endmodule
193
 
194
module mem_din_ctl(
195
        input [3:0]ctl,
196
        input [31:0]din,
197
        output reg [31:0]dout
198
    );
199
 
200
    always @(*)
201
 
202
    case (ctl)
203
        `DMEM_SB   :
204
            dout={din[7:0],din[7:0],din[7:0],din[7:0]};
205
        `DMEM_SH   :
206
            dout = {din[15:0],din[15:0]};
207
        `DMEM_SW   :
208
            dout =din;
209
        default dout=32'bX;
210
    endcase
211
 
212
endmodule

powered by: WebSVN 2.1.0

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