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

Subversion Repositories mips789

[/] [mips789/] [trunk/] [core/] [mem_module.v] - Blame information for rev 65

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

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

powered by: WebSVN 2.1.0

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