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

Subversion Repositories genesys_ddr2

[/] [genesys_ddr2/] [trunk/] [rtl/] [DDR2_mem_wb_if.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 oana.bonca
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// Company: UPT
4
// Engineer: Oana Boncalo & Alexandru Amaricai
5
// 
6
// Create Date:    09:51:04 03/18/2013 
7
// Design Name: 
8
// Module Name:    DDR2_mem_wb_if 
9
// Project Name: 
10
// Target Devices: 
11
// Tool versions: 
12
// Description: 
13
//
14
// Dependencies: 
15
//
16
// Revision: 
17
// Revision 0.01 - File Created
18
// Additional Comments: 
19
//
20
//////////////////////////////////////////////////////////////////////////////////
21
module DDR2_mem_wb_if #
22
  (
23
   parameter APPDATA_WIDTH           = 128     // # of usr read/write data bus bits.                                 
24
        )
25
        (
26
         input clk,
27
         input rst,
28
         //wishbone if signals
29
         input                                                                  cyc_wb,
30
         input                                                                  stb_wb,
31
         input  [30:0]                                           address_wb,
32
         input  [(APPDATA_WIDTH/8)-1:0]  sel_wb, //write mask     
33
         input  [APPDATA_WIDTH-1:0]              wr_data_wb, // write data
34
         input                                                                  we_wb,
35
         input  [2:0]                                                    cti_wb,
36
         input   [1:0]                                                   bte_wb,
37
         //to wishbone from memory interface
38
         output reg                                                     ack_mem,
39
         output                                                                         err_mem, rty_mem,
40
         output [APPDATA_WIDTH-1:0]      rd_data_wb, // rd data
41
 
42
         //signals to/from memory user interface
43
         output  reg[30:0]                                                       bus_if_addr,
44
         output  reg [APPDATA_WIDTH-1:0]       bus_if_wr_data0, bus_if_wr_data1,
45
         output  reg [(APPDATA_WIDTH/8)-1:0]   bus_if_wr_mask_data0, bus_if_wr_mask_data1,
46
         output         reg                                                                     mem_rd_cmd,
47
         output reg                                                                     mem_wr_cmd,
48
         input                                                                                  rd_valid,
49
         input                                                                                  end_op,
50
         input  [APPDATA_WIDTH-1:0]                      bus_if_rd_data,
51
         input                                app_wdf_afull,
52
    input                                     app_af_afull,
53
         input                                     phy_init_done,
54
         input                                                                                  rd_failed, //signals the abnormal termination of a RD op
55
         output [3:0]                                                                    wb_state,
56
         output                                                                                 is_burst_flag_o
57
    );
58
 
59
        //for wishbone if state machine
60
        localparam WB_IDLE      = 4'b0000;
61
        localparam WR_LATCH_D0  = 4'b0001;
62
        localparam WR_WAIT_D1   = 4'b0010;
63
        localparam WR_LATCH_D1  = 4'b0011;
64
        localparam WR_WAIT_END_OP       = 4'b0100;
65
        localparam RD_REQ               = 4'b0101;
66
        localparam RD_WAIT_RSP= 4'b0110;
67
        localparam RD_RSP               = 4'b0111;
68
        localparam RD_WR_ERROR  = 4'b1000;
69
        localparam WB_END_BURST         = 4'b1001;
70
 
71
        reg [3:0]                                                wb_state_reg;
72
        reg                                                                                     is_burst_flag;
73
        //rd/wr commands to memory
74
        wire                                                                               rd_cmd;
75
        wire                                                                               wr_cmd;
76
        wire [APPDATA_WIDTH-1:0] rd_data_to_latch;
77
        reg  [APPDATA_WIDTH-1:0] rd_data_wb_reg;
78
        reg                                                             is_burst;
79
        reg     [3:0]                                            counter;
80
        //reg                                                           err_flag;
81
 
82
 
83
 
84
        assign rd_cmd = cyc_wb & stb_wb & (!we_wb);
85
        assign wr_cmd = cyc_wb & stb_wb &  we_wb;
86
        assign rty_mem = (!phy_init_done) && ((wr_cmd  && (app_af_afull || app_wdf_afull)) || (rd_cmd && app_af_afull))? 1'b1: 1'b0;
87
 
88
        assign wb_state = wb_state_reg;
89
        always @(posedge clk)
90
        begin
91
                if (rst)
92
                begin
93
                        wb_state_reg <= WB_IDLE;
94
                        mem_wr_cmd <= 1'b0;
95
                        mem_rd_cmd <= 1'b0;
96
                        //counter <= 0;
97
                end
98
                else
99
                        case (wb_state_reg)
100
                                WB_IDLE:
101
                                        begin
102
                                                mem_wr_cmd <= 1'b0;
103
                                                mem_rd_cmd <= 1'b0;
104
                                                if (wr_cmd && !rty_mem)
105
                                                        wb_state_reg <= WR_LATCH_D0;
106
                                                if (rd_cmd && !rty_mem)
107
                                                        wb_state_reg <= RD_REQ;
108
                                        end
109
                                WR_LATCH_D0:
110
                                        begin
111
                                                //latch data0 & mask, address
112
                                                //generate ack
113
                                                wb_state_reg <= WR_WAIT_D1;
114
                                                //counter <= 15;
115
                                        end
116
                                WR_WAIT_D1:
117
                                        begin
118
                                                if (cti_wb == 3'b000) //single write
119
                                                        begin
120
                                                                //no need for second data proceed with WR
121
                                                                mem_wr_cmd <= 1'b1;
122
                                                                wb_state_reg <= WR_WAIT_END_OP;
123
                                                        end
124
                                                else
125
                                                        begin
126
                                                                if (wr_cmd)
127
                                                                        wb_state_reg <= WR_LATCH_D1;
128
                                                                else if (counter == 0)
129
                                                                        wb_state_reg <= RD_WR_ERROR;
130
                                                        end
131
                                        end
132
                                WR_LATCH_D1:
133
                                        begin
134
                                                //latch data1 & mask and generate ack
135
                                                mem_wr_cmd <= 1'b1; // start write to mem
136
                                                wb_state_reg <= WR_WAIT_END_OP;
137
                                        end
138
                                WR_WAIT_END_OP:
139
                                        begin
140
                                                //wait for memory to signal end of wr to fifos
141
                                                mem_wr_cmd <= 1'b0;
142
                                                if (end_op)
143
                                                        wb_state_reg <= WB_IDLE;
144
                                        end
145
                                RD_REQ:
146
                                        begin
147
                                                //latch address from mem
148
                                                mem_rd_cmd <= 1'b1;
149
                                                wb_state_reg <= RD_WAIT_RSP;
150
                                        end
151
                                RD_WAIT_RSP:
152
                                        begin
153
                                                //check if rsp. available
154
                                                mem_rd_cmd <= 1'b0;
155
                                                if (rd_failed)
156
                                                begin
157
                                                        wb_state_reg <= RD_WR_ERROR; //todo: revise if WB_IDLE is not more suitable
158
                                                end
159
                                                else
160
                                                begin
161
                                                        if (rd_valid)
162
                                                                wb_state_reg <= RD_RSP;
163
                                                end
164
                                        end
165
                                RD_RSP:
166
                                        begin
167
                                                //based on (cti_wb == 3'b000) value - single read
168
                                                //deactivate ack /latch second data word for bus transfer
169
                                                wb_state_reg <= WB_IDLE;
170
                                        end
171
                                RD_WR_ERROR:
172
                                        begin
173
                                                wb_state_reg <= WB_IDLE;
174
                                        end
175
                                endcase
176
        end
177
        //latch address
178
        always @(posedge clk, posedge rst)
179
        begin
180
                if (rst == 1'b1)
181
                        bus_if_addr <= 0;
182
                else
183
                        if ((wb_state_reg == WR_LATCH_D0) || (wb_state_reg == RD_REQ))
184
                                bus_if_addr <= address_wb;
185
        end
186
        //latch data0
187
        always @(posedge clk, posedge rst)
188
        begin
189
                if (rst == 1'b1)
190
                begin
191
                        bus_if_wr_data0 <= 0;
192
                        bus_if_wr_mask_data0 <= 0;
193
                end
194
                else
195
                        if (wb_state_reg == WR_LATCH_D0)
196
                        begin
197
                                bus_if_wr_data0 <= wr_data_wb;
198
                                bus_if_wr_mask_data0 <= sel_wb;
199
                        end
200
        end
201
        //latch data1
202
        always @(posedge clk, posedge rst)
203
        begin
204
                if (rst == 1'b1)
205
                begin
206
                        bus_if_wr_data1 <= 0;
207
                        bus_if_wr_mask_data1 <= 0;
208
                end
209
                else
210
                        case (wb_state_reg)
211
                                WR_LATCH_D0:
212
                                begin
213
                                        bus_if_wr_data1 <= 0;
214
                                        bus_if_wr_mask_data1 <= 0;
215
                                end
216
                                WR_LATCH_D1:
217
                                begin
218
                                        bus_if_wr_data1 <= wr_data_wb;
219
                                        bus_if_wr_mask_data1 <= sel_wb;
220
                                end
221
                        endcase
222
        end
223
        //generate ack for write & rd
224
        //assign ack_mem = ((wb_state_reg == WR_WAIT_D1 && wr_cmd) || ((wb_state_reg == WR_WAIT_END_OP && wr_cmd) && (end_op == 1'b1)) || ((wb_state_reg == RD_WAIT_RSP) && rd_valid) || ((wb_state_reg == RD_RSP)  && is_burst) )? 1'b1: 1'b0;
225
        //latch rd data
226
        always @(posedge clk, posedge rst)
227
        begin
228
                if (rst == 1'b1)
229
                begin
230
                        rd_data_wb_reg <= 0;
231
                end
232
                else
233
                        rd_data_wb_reg <= rd_data_to_latch;
234
        end
235
        //assign rd_data_to_latch = rd_valid && ((wb_state_reg == RD_WAIT_RSP) || ((wb_state_reg == RD_RSP) && is_burst_flag))? bus_if_rd_data: rd_data_wb_reg;
236
        assign rd_data_to_latch = (rd_valid && ack_mem)? bus_if_rd_data: rd_data_wb_reg;
237
        assign rd_data_wb = rd_data_to_latch;
238
        //assign rd_data_to_latch = rd_valid? bus_if_rd_data: rd_data_wb_reg;
239
 
240
        //single/burst op signaling
241
        assign is_burst_flag_o = is_burst_flag;
242
 
243
        always @(posedge clk, posedge rst)
244
        begin
245
                if (rst == 1'b1)
246
                begin
247
                        is_burst_flag <= 0;
248
                end
249
                else
250
                                is_burst_flag <= is_burst;
251
        end
252
        always @*
253
        begin
254
                is_burst = is_burst_flag;
255
                if ((wb_state_reg == WR_LATCH_D0) || (wb_state_reg == RD_REQ))
256
                                if (cti_wb != 3'b000)
257
                                        is_burst = 1'b1;
258
                                else
259
                                        is_burst = 1'b0;
260
                if (wb_state_reg == WB_IDLE)
261
                        is_burst = 1'b0;
262
        end
263
        always @*
264
        begin
265
                ack_mem = 1'b0;
266
                if ((cyc_wb && stb_wb) &&((wb_state_reg == WR_WAIT_D1 && wr_cmd) || ((wb_state_reg == WR_WAIT_END_OP && wr_cmd)&& (end_op == 1'b1))))
267
                        ack_mem = 1'b1;
268
                if ((cyc_wb && stb_wb) &&( ((wb_state_reg == RD_WAIT_RSP) && rd_valid) || ((wb_state_reg == RD_RSP)  && is_burst) ))
269
                        ack_mem = 1'b1;
270
        end
271
        //wishbone error signaling
272
        assign err_mem = (wb_state_reg == RD_WR_ERROR)? 1'b1: 1'b0;
273
        //assign is_burst = (cti_wb == 3'b010);
274
        //timeout counter for WR
275
        always @(posedge clk, posedge rst)
276
        begin
277
                if (rst == 1'b1)
278
                begin
279
                        counter <= 0;
280
                end
281
                else
282
                        if ((wb_state_reg == WR_LATCH_D0))
283
                                counter <= 15;
284
                        else
285
                                if (wb_state_reg == WR_WAIT_D1)
286
                                        counter <= counter - 1'b1;
287
        end
288
endmodule

powered by: WebSVN 2.1.0

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