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

Subversion Repositories dma_axi

[/] [dma_axi/] [trunk/] [src/] [dma_axi32/] [dma_axi32_core0_axim_wdata.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 eyalhoc
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Author: Eyal Hochberg                                      ////
4
////          eyal@provartec.com                                 ////
5
////                                                             ////
6
////  Downloaded from: http://www.opencores.org                  ////
7
/////////////////////////////////////////////////////////////////////
8
////                                                             ////
9
//// Copyright (C) 2010 Provartec LTD                            ////
10
//// www.provartec.com                                           ////
11
//// info@provartec.com                                          ////
12
////                                                             ////
13
//// This source file may be used and distributed without        ////
14
//// restriction provided that this copyright statement is not   ////
15
//// removed from the file and that any derivative work contains ////
16
//// the original copyright notice and the associated disclaimer.////
17
////                                                             ////
18
//// This source file is free software; you can redistribute it  ////
19
//// and/or modify it under the terms of the GNU Lesser General  ////
20
//// Public License as published by the Free Software Foundation.////
21
////                                                             ////
22
//// This source is distributed in the hope that it will be      ////
23
//// useful, but WITHOUT ANY WARRANTY; without even the implied  ////
24
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR     ////
25
//// PURPOSE.  See the GNU Lesser General Public License for more////
26
//// details. http://www.gnu.org/licenses/lgpl.html              ////
27
////                                                             ////
28
/////////////////////////////////////////////////////////////////////
29 2 eyalhoc
//---------------------------------------------------------
30
//-- File generated by RobustVerilog parser
31
//-- Version: 1.0
32
//-- Invoked Fri Mar 25 23:34:51 2011
33
//--
34
//-- Source file: dma_core_axim_wdata.v
35
//---------------------------------------------------------
36
 
37
 
38
 
39
module dma_axi32_core0_axim_wdata(clk,reset,rd_transfer,rd_transfer_size,ch_fifo_rd,ch_fifo_rsize,ch_fifo_rdata,ch_fifo_rd_valid,ch_fifo_wr_ready,ch_fifo_rd_num,wr_transfer_num,wr_transfer,wr_transfer_size,wr_next_size,wr_resp_full,wr_cmd_full,wr_clr_line,wr_clr_line_num,joint_stall,axim_timeout_num,axim_timeout,AWID,AWADDR,AWLEN,AWSIZE,AWVALID,AWREADY,AJOINT,WDATA,WSTRB,WLAST,WVALID,WREADY);
40
 
41
   input               clk;
42
   input               reset;
43
 
44
   input               rd_transfer;
45
   input [3-1:0]      rd_transfer_size;
46
   output               ch_fifo_rd;
47
   output [3-1:0]     ch_fifo_rsize;
48
   input [32-1:0]      ch_fifo_rdata;
49
   input               ch_fifo_rd_valid;
50
   input               ch_fifo_wr_ready;
51
   output [2:0]           ch_fifo_rd_num;
52
   output [2:0]           wr_transfer_num;
53
   output               wr_transfer;
54
   output [3-1:0]     wr_transfer_size;
55
   output [3-1:0]     wr_next_size;
56
 
57
   input               wr_resp_full;
58
   output               wr_cmd_full;
59
   output               wr_clr_line;
60
   output [2:0]           wr_clr_line_num;
61
 
62
   output               joint_stall;
63
 
64
   output [2:0]           axim_timeout_num;
65
   output               axim_timeout;
66
 
67
 
68
   input [`CMD_BITS-1:0]       AWID;
69
   input [32-1:0]      AWADDR;
70
   input [`LEN_BITS-1:0]      AWLEN;
71
   input [1:0]               AWSIZE;
72
   input               AWVALID;
73
   input               AWREADY;
74
   input               AJOINT;
75
 
76
   output [32-1:0]     WDATA;
77
   output [4-1:0]     WSTRB;
78
   output               WLAST;
79
   output               WVALID;
80
   input               WREADY;
81
 
82
 
83
   wire [`CMD_BITS-1:0]       WID;
84
   wire [`CMD_BITS-1:0]       WID_pre;
85
   reg [4-1:0]           WSTRB_pre;
86
   wire [1:0]               WSIZE_pre;
87
   wire [`LEN_BITS-1:0]       WLEN_pre;
88
 
89
   wire [`CMD_BITS-1:0]       WID_data;
90
   wire [4-1:0]       WSTRB_data;
91
   wire [1:0]               WSIZE_data;
92
   wire [`LEN_BITS-1:0]       WLEN_data;
93
   wire               WVALID;
94
   wire               WLAST;
95
   wire               valid_last;
96
   wire               wr_clr_line_stall_pre;
97
   wire               wr_clr_line_stall;
98
   wire               wr_clr_line_pre;
99
   reg [2:0]               wr_clr_line_num;
100
   wire [2:0]               wr_transfer_num_pre;
101
   wire               wr_transfer_pre;
102
   wire [3-1:0]       wr_transfer_size_pre;
103
   reg [2:0]               wr_transfer_num;
104
   wire               wr_transfer;
105
   reg [3-1:0]           wr_transfer_size;
106
 
107
   reg [2:0]               last_channel;
108
 
109
   wire [`CMD_BITS-1:0]       WID_cmd;
110
   wire [1:0]               WSIZE_cmd;
111
   reg [3-1:0]           wr_next_size;
112
   wire [`LEN_BITS-1:0]       WLEN_cmd;
113
 
114
   wire               data_ready;
115
   wire [2:0]               data_fullness_pre;
116
   reg [2:0]               data_fullness;
117
   wire               joint_fifo_rd_valid;
118
   wire               joint_req_out;
119
   wire               joint_stall;
120
   wire               rd_transfer_joint;
121
   wire [3-1:0]       rd_transfer_size_joint;
122
   wire               rd_transfer_full;
123
 
124
   wire               cmd_push;
125
   wire               cmd_pop;
126
   wire               cmd_pop_d;
127
   wire               cmd_empty;
128
   wire               cmd_full;
129
 
130
   wire               cmd_data_push;
131
   wire               cmd_data_pop;
132
   wire               cmd_data_empty;
133
   wire               cmd_data_full;
134
 
135
   wire               data_push;
136
   wire               data_pop;
137
   wire               data_empty;
138
   wire               data_full;
139
 
140
   reg [`LEN_BITS-1:0]           rd_out_count;
141
   reg [`LEN_BITS-1:0]           rd_in_count;
142
 
143
   wire               data_pending_pre;
144
   wire               data_pending;
145
   wire               line_end;
146
   wire [2:0]               line_end_num;
147
 
148
 
149
   //joint
150
   assign               data_ready        = ch_fifo_rd_valid;
151
   assign               data_fullness_pre = data_fullness + data_ready - wr_transfer_pre;
152
 
153
   always @(posedge clk or posedge reset)
154
     if (reset)
155
       data_fullness <= #1 3'd0;
156
     else if (data_ready | wr_transfer_pre)
157
       data_fullness <= #1 data_fullness_pre;
158
 
159
   prgen_joint_stall #(3)
160
     gen_joint_stall (
161
              .clk(clk),
162
              .reset(reset),
163
              .joint_req_out(joint_req_out),
164
              .rd_transfer(rd_transfer),
165
              .rd_transfer_size(rd_transfer_size),
166
              .ch_fifo_rd(ch_fifo_rd),
167
              .data_fullness_pre(data_fullness_pre),
168
              .HOLD(1'b0),
169
              .joint_fifo_rd_valid(joint_fifo_rd_valid),
170
              .rd_transfer_size_joint(rd_transfer_size_joint),
171
              .rd_transfer_full(rd_transfer_full),
172
              .joint_stall(joint_stall)
173
              );
174
 
175
 
176
 
177
   //fifo rd command
178
   assign               data_pending_pre = WVALID & (~WREADY);
179
 
180
   prgen_delay #(1) delay_pending (.clk(clk), .reset(reset), .din(data_pending_pre), .dout(data_pending));
181
 
182
  //assign                   wr_next_size  = 1'b1 << WSIZE_cmd;
183
   always @(/*AUTOSENSE*/WSIZE_cmd)
184
     begin
185
        case (WSIZE_cmd)
186
          2'b00 : wr_next_size = 4'd1;
187
          2'b01 : wr_next_size = 4'd2;
188
          2'b10 : wr_next_size = 4'd4;
189
          2'b11 : wr_next_size = 4'd8;
190
        endcase
191
     end
192
 
193
   assign               ch_fifo_rd =
194
                  joint_fifo_rd_valid |
195
 
196
                  ((~cmd_empty) &
197
                  (~data_pending) &
198
                  (~wr_clr_line_stall) &
199
                  ch_fifo_wr_ready);
200
 
201
 
202
   assign               ch_fifo_rsize =
203
                  joint_fifo_rd_valid ? rd_transfer_size_joint :
204
                  WID_cmd[5:4] == 2'b00 ? 4'd1 :
205
                  WID_cmd[5:4] == 2'b01 ? 4'd2 :
206
                  WID_cmd[5:4] == 2'b10 ? 4'd4 : 4'd8;
207
 
208
   assign               ch_fifo_rd_num   =  WID_cmd[2:0];
209
 
210
 
211
   prgen_delay #(1) delay_cmd_pop (.clk(clk), .reset(reset), .din(cmd_pop), .dout(cmd_pop_d));
212
 
213
   always @(posedge clk or posedge reset)
214
     if (reset)
215
       last_channel <= #1 3'b000;
216
     else if (cmd_push)
217
       last_channel <= #1 WID_pre[2:0];
218
 
219
 
220
   //update pointers in channel
221
   assign               wr_transfer_num_pre  = WID_data[2:0];
222
 
223
   assign               wr_transfer_pre      = WVALID & WREADY;
224
 
225
   assign               wr_transfer_size_pre =
226
                  WID_data[5:4] == 2'b00 ? 4'd1 :
227
                  WID_data[5:4] == 2'b01 ? 4'd2 :
228
                  WID_data[5:4] == 2'b10 ? 4'd4 : 4'd8;
229
 
230
   prgen_delay #(1) delay_wr_transfer (.clk(clk), .reset(reset), .din(wr_transfer_pre), .dout(wr_transfer));
231
 
232
   always @(posedge clk or posedge reset)
233
     if (reset)
234
       begin
235
      wr_transfer_num  <= #1 3'd0;
236
      wr_transfer_size <= #1 3'd0;
237
       end
238
     else if (wr_transfer_pre)
239
       begin
240
      wr_transfer_num  <= #1 wr_transfer_num_pre;
241
      wr_transfer_size <= #1 wr_transfer_size_pre;
242
       end
243
 
244
 
245
   assign               valid_last      = ch_fifo_rd & (rd_out_count == WLEN_cmd) & (~cmd_empty);
246
 
247
   assign               wr_clr_line_pre = valid_last & line_end;
248
 
249
   always @(posedge clk or posedge reset)
250
     if (reset)
251
       wr_clr_line_num <= #1 3'd0;
252
     else if (wr_clr_line_pre)
253
       wr_clr_line_num <= #1 line_end_num;
254
 
255
   assign wr_clr_line_stall_pre = wr_clr_line_pre & (ch_fifo_rd_num == line_end_num);
256
 
257
   prgen_delay #(1) delay_stall (.clk(clk), .reset(reset), .din(wr_clr_line_stall_pre), .dout(wr_clr_line_stall));
258
 
259
   prgen_delay #(2) delay_clr_line (.clk(clk), .reset(reset), .din(wr_clr_line_pre), .dout(wr_clr_line));
260
 
261
 
262
   //command phase
263
   assign               wr_cmd_full = cmd_full | cmd_data_full | wr_resp_full;
264
 
265
   assign               cmd_push = AWVALID & AWREADY;
266
   assign               cmd_pop  = valid_last;
267
 
268
   assign               WID_pre   = AWID;
269
   assign               WLEN_pre  = AWLEN;
270
   assign               WSIZE_pre = AWSIZE;
271
 
272
 
273
   //always @(/*AUTOSENSE*/ - no AUTOSENSE due to defines
274
   always @(AWADDR or AWSIZE)
275
     begin
276
    case ({AWSIZE[1:0], AWADDR[1:0]})
277
      //8 bit
278
      {2'b00, 2'b00} : WSTRB_pre = 4'b0001;
279
      {2'b00, 2'b01} : WSTRB_pre = 4'b0010;
280
      {2'b00, 2'b10} : WSTRB_pre = 4'b0100;
281
      {2'b00, 2'b11} : WSTRB_pre = 4'b1000;
282
 
283
      //16 bit
284
      {2'b01, 2'b00} : WSTRB_pre = 4'b0011;
285
      {2'b01, 2'b10} : WSTRB_pre = 4'b1100;
286
 
287
      //32 bit
288
      default : WSTRB_pre = 4'b1111;
289
    endcase
290
     end
291
 
292
 
293
   prgen_fifo #(`CMD_BITS+`LEN_BITS+2+1, 2)
294
   cmd_fifo(
295
        .clk(clk),
296
        .reset(reset),
297
        .push(cmd_push),
298
        .pop(cmd_pop),
299
        .din({WID_pre,
300
          WSIZE_pre,
301
          WLEN_pre,
302
          AJOINT
303
          }
304
         ),
305
        .dout({WID_cmd,
306
           WSIZE_cmd,
307
           WLEN_cmd,
308
           joint_req_out
309
           }
310
          ),
311
        .empty(cmd_empty),
312
        .full(cmd_full)
313
        );
314
 
315
 
316
   assign               line_end     = WID_cmd[6];
317
   assign               line_end_num = WID_cmd[2:0];
318
 
319
   always @(posedge clk or posedge reset)
320
     if (reset)
321
       rd_out_count <= #1 {`LEN_BITS{1'b0}};
322
     else if (cmd_pop)
323
       rd_out_count <= #1 {`LEN_BITS{1'b0}};
324
     else if (ch_fifo_rd)
325
       rd_out_count <= #1 rd_out_count + 1'b1;
326
 
327
 
328
   //data phase
329
   assign               cmd_data_push = cmd_push;
330
   assign               cmd_data_pop  = WVALID & WREADY & WLAST;
331
 
332
   assign               WSTRB = WSTRB_data & {4{WVALID}};
333
 
334
   assign               WID   = WID_data;
335
 
336
 
337
 
338
   prgen_fifo #(4+`LEN_BITS+`CMD_BITS+2, 2)
339
   cmd_data_fifo(
340
         .clk(clk),
341
         .reset(reset),
342
         .push(cmd_data_push),
343
         .pop(cmd_data_pop),
344
         .din({WLEN_pre,
345
               WSIZE_pre,
346
               WSTRB_pre,
347
               WID_pre
348
               }),
349
         .dout({WLEN_data,
350
            WSIZE_data,
351
            WSTRB_data,
352
            WID_data
353
            }),
354
         .empty(cmd_data_empty),
355
         .full(cmd_data_full)
356
         );
357
 
358
 
359
   always @(posedge clk or posedge reset)
360
     if (reset)
361
       rd_in_count <= #1 {`LEN_BITS{1'b0}};
362
     else if (cmd_data_pop)
363
       rd_in_count <= #1 {`LEN_BITS{1'b0}};
364
     else if (wr_transfer_pre)
365
       rd_in_count <= #1 rd_in_count + 1'b1;
366
 
367
 
368
 
369
   //data fifo
370
   assign               data_push = ch_fifo_rd_valid;
371
   assign               data_pop  = wr_transfer_pre;
372
 
373
 
374
   //depth is set by maximum fifo read data latency
375
   prgen_fifo #(32, 5+2)
376
   data_fifo(
377
         .clk(clk),
378
         .reset(reset),
379
         .push(data_push),
380
         .pop(data_pop),
381
         .din(ch_fifo_rdata),
382
         .dout(WDATA),
383
         .empty(data_empty),
384
         .full(data_full)
385
         );
386
 
387
   assign               WVALID = ~data_empty;
388
 
389
   assign               WLAST  = WVALID & (rd_in_count == WLEN_data) & (~cmd_data_empty);
390
 
391
 
392
 
393
   dma_axi32_core0_axim_timeout  dma_axi32_axim_timeout (
394
                         .clk(clk),
395
                         .reset(reset),
396
                         .VALID(WVALID),
397
                         .READY(WREADY),
398
                         .ID(WID),
399
                         .axim_timeout_num(axim_timeout_num),
400
                         .axim_timeout(axim_timeout)
401
                         );
402
 
403
endmodule
404
 
405
 
406
 
407
 
408
 

powered by: WebSVN 2.1.0

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