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

Subversion Repositories dma_axi

[/] [dma_axi/] [trunk/] [src/] [dma_axi64/] [dma_axi64_core0_axim_wdata.v] - Blame information for rev 2

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

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

powered by: WebSVN 2.1.0

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