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

Subversion Repositories dma_ahb

[/] [dma_ahb/] [trunk/] [src/] [dma_ahb64/] [dma_ahb64_core0_ahbm_wr.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:32:59 2011
5
//--
6
//-- Source file: dma_core_ahbm_wr.v
7
//---------------------------------------------------------
8
 
9
 
10
 
11
module dma_ahb64_core0_ahbm_wr(clk,reset,rd_transfer,rd_transfer_size,joint_req,joint_in_prog,joint_stall,wr_last_cmd,wr_ch_num,wr_ch_num_resp,wr_port_num,wr_cmd_port,wr_burst_start,wr_burst_addr,wr_burst_size,wr_cmd_pending,wr_line_cmd,ch_fifo_rd,ch_fifo_rd_num,ch_fifo_rdata,ch_fifo_rd_valid,ch_fifo_rsize,ch_fifo_wr_ready,wr_transfer,wr_transfer_num,wr_transfer_size,wr_next_size,wr_slverr,wr_clr,wr_clr_last,wr_clr_line,wr_clr_line_num,wr_cmd_full,wr_hold,ahb_wr_timeout,ahb_wr_timeout_num,HADDR,HBURST,HSIZE,HTRANS,HLAST,HWDATA,HREADY,HRESP,HOLD,SYNC);
12
 
13
 
14
   input               clk;
15
   input               reset;
16
 
17
   input               rd_transfer;
18
   input [4-1:0]      rd_transfer_size;
19
   input               joint_req;
20
   input               joint_in_prog;
21
   output               joint_stall;
22
 
23
   //command
24
   input               wr_last_cmd;
25
   input [2:0]               wr_ch_num;
26
   output [2:0]           wr_ch_num_resp;
27
   output               wr_port_num;
28
   input               wr_cmd_port;
29
   input               wr_burst_start;
30
   input [32-1:0]      wr_burst_addr;
31
   input [8-1:0]     wr_burst_size;
32
   output               wr_cmd_pending;
33
   input               wr_line_cmd;
34
 
35
   //data
36
   output               ch_fifo_rd;
37
   output [2:0]           ch_fifo_rd_num;
38
   input [64-1:0]      ch_fifo_rdata;
39
   input               ch_fifo_rd_valid;
40
   output [4-1:0]     ch_fifo_rsize;
41
   input               ch_fifo_wr_ready;
42
   output               wr_transfer;
43
   output [2:0]           wr_transfer_num;
44
   output [4-1:0]     wr_transfer_size;
45
   output [4-1:0]     wr_next_size;
46
 
47
   //resp
48
   output               wr_slverr;
49
   output               wr_clr;
50
   output               wr_clr_last;
51
   output               wr_clr_line;
52
   output [2:0]           wr_clr_line_num;
53
   output               wr_cmd_full;
54
   output               wr_hold;
55
   output               ahb_wr_timeout;
56
   output [2:0]           ahb_wr_timeout_num;
57
 
58
   output [32-1:0]     HADDR;
59
   output [2:0]           HBURST;
60
   output [1:0]           HSIZE;
61
   output [1:0]           HTRANS;
62
   output               HLAST;
63
   output [64-1:0]     HWDATA;
64
   input               HREADY;
65
   input               HRESP;
66
   input               HOLD;
67
   input               SYNC;
68
 
69
 
70
 
71
   wire [32-1:0]       HADDR_base;
72
   wire [2:0]               HBURST_pre;
73
   wire [1:0]               HSIZE_pre;
74
   wire [2:0]               HBURST;
75
   wire [1:0]               HSIZE;
76
   reg [1:0]               HTRANS;
77
   wire [64-1:0]       HWDATA;
78
   wire               wr_last_cmd_out;
79
 
80
   wire               ch_fifo_rd_last;
81
   wire               data_ready_pre;
82
   wire               data_ready;
83
   reg                   data_phase;
84
   reg [3:0]               data_counter;
85
   wire [3:0]               data_num_pre;
86
   wire [3:0]               data_num;
87
   wire               data_last;
88
   wire               data_pending_pre;
89
   wire               data_pending;
90
   wire [8-1:3] strb_num;
91
   reg [3:0]              cmd_counter;
92
   reg [3:0]               last_counter;
93
   wire [3:0]               cmd_num;
94
   wire               cmd_single_in;
95
   wire               cmd_single_out;
96
   wire               cmd_last;
97
   wire               cmd_empty;
98
   wire               cmd_full;
99
   wire               cmd_data_empty;
100
   wire               cmd_data_full;
101
   wire               data_empty;
102
   wire               data_full;
103
   wire [2:0]               data_fullness_pre;
104
   reg [2:0]               data_fullness;
105
   reg [1:0]               data_on_the_way;
106
   wire [4-1:0]       data_width;
107
   wire               ahb_cmd;
108
   wire               ahb_cmd_first;
109
   wire               ahb_cmd_last;
110
   wire               ahb_data_last;
111
   wire               ahb_idle;
112
   wire               ahb_busy;
113
   wire [4-1:0]       wr_next_size_in;
114
   wire               wr_transfer_pre;
115
   reg [4-1:0]           wr_transfer_size_pre;
116
   reg [2:0]               wr_transfer_num_pre;
117
   wire               wr_transfer;
118
   reg [4-1:0]           wr_transfer_size;
119
   reg [2:0]               wr_transfer_num;
120
   reg [2:0]               wr_ch_num_resp;
121
   wire               wr_port_num;
122
   wire [2:0]               wr_ch_num_out;
123
   wire [2:0]               ch_fifo_rd_num;
124
   wire               wr_clr_pre;
125
   wire               wr_clr;
126
   wire               wr_clr_last_pre;
127
   wire               wr_clr_last;
128
   wire               wr_clr_line_pre;
129
   wire               wr_clr_line_pre_d;
130
   wire               wr_clr_line_stall;
131
   wire               wr_clr_line;
132
   wire               wr_line_out;
133
   wire               port_change;
134
   wire               port_change_end;
135
   reg [2:0]               wr_clr_line_num_reg;
136
   reg                   ahb_cmd_last_d;
137
   reg                   wr_last_cmd_d;
138
   wire               wr_last_cmd_valid;
139
   wire               cmd_pending_pre;
140
   wire               wr_slverr_pre;
141
   reg                   wr_slverr_reg;
142
 
143
   wire               joint_req_out;
144
   wire [4-1:0]       rd_transfer_size_joint;
145
   wire               rd_transfer_full;
146
   wire               joint_stall;
147
   wire               joint_fifo_rd_valid;
148
 
149
 
150
 
151
 
152
   parameter                  TRANS_IDLE   = 2'b00;
153
   parameter                  TRANS_BUSY   = 2'b01;
154
   parameter                  TRANS_NONSEQ = 2'b10;
155
   parameter               TRANS_SEQ    = 2'b11;
156
 
157
   parameter                  BURST_SINGLE = 3'b000;
158
   parameter               BURST_INCR4  = 3'b011;
159
   parameter               BURST_INCR8  = 3'b101;
160
   parameter               BURST_INCR16 = 3'b111;
161
 
162
 
163
 
164
   prgen_joint_stall #(4)
165
     gen_joint_stall (
166
              .clk(clk),
167
              .reset(reset),
168
              .joint_req_out(joint_req_out),
169
              .rd_transfer(rd_transfer),
170
              .rd_transfer_size(rd_transfer_size),
171
              .ch_fifo_rd(ch_fifo_rd),
172
              .data_fullness_pre(data_fullness_pre),
173
              .HOLD(HOLD),
174
              .joint_fifo_rd_valid(joint_fifo_rd_valid),
175
              .rd_transfer_size_joint(rd_transfer_size_joint),
176
              .rd_transfer_full(rd_transfer_full),
177
              .joint_stall(joint_stall)
178
              );
179
 
180
 
181
 
182
 
183
   prgen_delay #(2) delay_fifo_rd0 (.clk(clk), .reset(reset), .din(ch_fifo_rd), .dout(data_ready_pre));
184
   prgen_delay #(1) delay_fifo_rd1 (.clk(clk), .reset(reset), .din(data_ready_pre), .dout(data_ready));
185
 
186
 
187
   assign               ch_fifo_rd =
188
                  joint_fifo_rd_valid |
189
 
190
                  ((~cmd_data_empty) &
191
                   (~data_pending) &
192
                   (~wr_clr_line_stall) &
193
                   (~joint_in_prog) &
194
                   & ch_fifo_wr_ready);
195
 
196
 
197
   assign               wr_hold          = cmd_full;
198
   assign               ch_fifo_rd_last  = ch_fifo_rd & data_last;
199
   assign               cmd_pending_pre  = HTRANS[1] & (~HREADY);
200
 
201
   assign               ahb_cmd          = HTRANS[1] & HREADY & (~HOLD);
202
   assign               ahb_cmd_first    = ahb_cmd & (HTRANS[1:0] == TRANS_NONSEQ);
203
   assign               ahb_cmd_last     = ahb_cmd & cmd_last;
204
   assign               ahb_idle         = HTRANS[1:0] == TRANS_IDLE;
205
   assign               ahb_busy         = HTRANS[1:0] == TRANS_BUSY;
206
 
207
   assign               wr_transfer_pre  = data_phase & HREADY;
208
   assign               wr_slverr_pre    = data_phase & HREADY & HRESP;
209
   assign               wr_clr_line_pre  = ch_fifo_rd_last & wr_line_out;
210
 
211
   assign               wr_cmd_full      = cmd_data_full | cmd_full;
212
 
213
   prgen_stall stall_wr_clr (.clk(clk), .reset(reset), .din(ahb_data_last), .stall(SYNC), .dout(wr_clr_pre));
214
   prgen_stall stall_wr_clr_last (.clk(clk), .reset(reset), .din(wr_last_cmd_valid), .stall(SYNC), .dout(wr_clr_last_pre));
215
 
216
   prgen_delay #(1) delay_wr_clr (.clk(clk), .reset(reset), .din(wr_clr_pre), .dout(wr_clr));
217
   prgen_delay #(1) delay_wr_clr_last (.clk(clk), .reset(reset), .din(wr_clr_last_pre), .dout(wr_clr_last));
218
 
219
   prgen_delay #(1) delay_cmd_pending (.clk(clk), .reset(reset), .din(cmd_pending_pre), .dout(wr_cmd_pending));
220
 
221
   always @(posedge clk or posedge reset)
222
     if (reset)
223
       ahb_cmd_last_d <= #1 1'b0;
224
     else if (ahb_cmd_last)
225
       ahb_cmd_last_d <= #1 1'b1;
226
     else if (ahb_data_last)
227
       ahb_cmd_last_d <= #1 1'b0;
228
 
229
   always @(posedge clk or posedge reset)
230
     if (reset)
231
       wr_last_cmd_d <= #1 1'b0;
232
     else if (ahb_cmd_last)
233
       wr_last_cmd_d <= #1 wr_last_cmd_out;
234
     else if (ahb_data_last)
235
       wr_last_cmd_d <= #1 1'b0;
236
 
237
   always @(posedge clk or posedge reset)
238
     if (reset)
239
       wr_slverr_reg <= #1 1'b0;
240
     else if (wr_slverr_pre)
241
       wr_slverr_reg <= #1 1'b1;
242
     else if (wr_slverr)
243
       wr_slverr_reg <= #1 1'b0;
244
 
245
   assign               wr_slverr = wr_slverr_reg & wr_clr;
246
 
247
   assign               ahb_data_last     = ahb_cmd_last_d & HREADY;
248
   assign               wr_last_cmd_valid = wr_last_cmd_d & ahb_data_last;
249
 
250
 
251
 
252
   assign               wr_clr_line       = 1'b0;
253
   assign               wr_clr_line_stall = 1'b0;
254
   assign               wr_clr_line_num   = 3'd0;
255
 
256
 
257
 
258
   assign               cmd_num          =
259
                  HBURST == BURST_INCR16 ? 4'd15 :
260
                  HBURST == BURST_INCR8  ? 4'd7 :
261
                  HBURST == BURST_INCR4  ? 4'd3 : 4'd0;
262
 
263
   assign               cmd_last         = cmd_single_out | (last_counter == 'd0);
264
 
265
   always @(posedge clk or posedge reset)
266
     if (reset)
267
       last_counter <= #1 4'hf;
268
     else if (ahb_cmd & (HTRANS == TRANS_NONSEQ))
269
       last_counter <= #1 cmd_num - 1'b1;
270
     else if (ahb_cmd)
271
       last_counter <= #1 last_counter - 1'b1;
272
 
273
   always @(posedge clk or posedge reset)
274
     if (reset)
275
       cmd_counter <= #1 4'd0;
276
     else if (ahb_cmd_last)
277
       cmd_counter <= #1 4'd0;
278
     else if (ahb_cmd)
279
       cmd_counter <= #1 cmd_counter + 1'b1;
280
 
281
   assign               data_last        = data_counter == data_num;
282
 
283
   always @(posedge clk or posedge reset)
284
     if (reset)
285
       data_counter <= #1 4'd0;
286
     else if (ch_fifo_rd & data_last)
287
       data_counter <= #1 4'd0;
288
     else if (ch_fifo_rd)
289
       data_counter <= #1 data_counter + 1'b1;
290
 
291
   always @(posedge clk or posedge reset)
292
     if (reset)
293
       data_phase <= #1 1'b0;
294
     else if (ahb_cmd)
295
       data_phase <= #1 1'b1;
296
     else if (ahb_data_last)
297
       data_phase <= #1 1'b0;
298
 
299
 
300
   assign               data_width =
301
                  HSIZE == 2'b00 ? 'd1 :
302
                  HSIZE == 2'b01 ? 'd2 :
303
                  HSIZE == 2'b10 ? 'd4 : 'd8;
304
 
305
   assign               wr_next_size_in = {|wr_burst_size[8-1:3], wr_burst_size[3-1:0]};
306
 
307
   assign               ch_fifo_rsize = joint_fifo_rd_valid ? rd_transfer_size_joint : wr_next_size;
308
 
309
   assign               HADDR = HADDR_base | {cmd_counter, {3{1'b0}}};
310
 
311
   assign               strb_num = wr_burst_size[8-1:3];
312
 
313
   assign               cmd_single_in = strb_num <= 'd1;
314
 
315
   assign               data_num_pre =
316
                  strb_num == 'd16 ? 'd15 :
317
                  strb_num == 'd8  ? 'd7  :
318
                  strb_num == 'd4  ? 'd3  : 'd0;
319
 
320
   assign               HBURST_pre =
321
                  strb_num == 'd16 ? BURST_INCR16 :
322
                  strb_num == 'd8  ? BURST_INCR8  :
323
                  strb_num == 'd4  ? BURST_INCR4  : BURST_SINGLE;
324
 
325
   assign               HSIZE_pre =
326
                  wr_burst_size == 'd1 ? 2'b00 :
327
                  wr_burst_size == 'd2 ? 2'b01 :
328
                  wr_burst_size == 'd4 ? 2'b10 : 3;
329
 
330
   assign               HLAST = cmd_last & (~cmd_empty);
331
 
332
   always @(posedge clk or posedge reset)
333
     if (reset)
334
       HTRANS <= #1 TRANS_IDLE;
335
     else if (port_change)
336
       HTRANS <= #1 TRANS_IDLE;
337
     else if (ahb_idle & port_change_end & (data_fullness_pre > 'd0))
338
       HTRANS <= #1 TRANS_NONSEQ;
339
     else if (ahb_cmd_last & ((data_fullness > 'd2) | data_ready_pre)) //burst end and data ready
340
       HTRANS <= #1 TRANS_NONSEQ;
341
     else if (ahb_idle & ((data_fullness > 'd1) | data_ready_pre)) //bus idle and data ready
342
       HTRANS <= #1 TRANS_NONSEQ;
343
     else if (ahb_cmd_last)
344
       HTRANS <= #1 TRANS_IDLE;
345
     else if (ahb_cmd & (data_fullness_pre <= 'd1) & (~data_ready_pre))
346
       HTRANS <= #1 TRANS_BUSY;
347
     else if (ahb_cmd | (ahb_busy & data_ready_pre))
348
       HTRANS <= #1 TRANS_SEQ;
349
 
350
   always @(posedge clk or posedge reset)
351
     if (reset)
352
       begin
353
      wr_transfer_size_pre <= #1 {4{1'b0}};
354
      wr_transfer_num_pre  <= #1 3'd0;
355
       end
356
     else if (ahb_cmd)
357
       begin
358
      wr_transfer_size_pre <= #1 data_width;
359
      wr_transfer_num_pre  <= #1 wr_ch_num_out;
360
       end
361
 
362
   prgen_delay #(1) delay_wr_transfer (.clk(clk), .reset(reset), .din(wr_transfer_pre), .dout(wr_transfer));
363
 
364
   always @(posedge clk or posedge reset)
365
     if (reset)
366
       begin
367
      wr_transfer_num  <= #1 3'd0;
368
      wr_transfer_size <= #1 3'd0;
369
       end
370
     else if (wr_transfer_pre)
371
       begin
372
      wr_transfer_num  <= #1 wr_transfer_num_pre;
373
      wr_transfer_size <= #1 wr_transfer_size_pre;
374
       end
375
 
376
   always @(posedge clk or posedge reset)
377
     if (reset)
378
       wr_ch_num_resp <= #1 3'd0;
379
     else if (ahb_data_last)
380
       wr_ch_num_resp <= #1 wr_transfer_num_pre;
381
 
382
 
383
   prgen_fifo #(32+3+2+1+1+3+1+1, 2+1)
384
   cmd_fifo(
385
        .clk(clk),
386
        .reset(reset),
387
        .push(wr_burst_start),
388
        .pop(ahb_cmd_last),
389
        .din({wr_burst_addr,
390
          HBURST_pre,
391
          HSIZE_pre,
392
          wr_last_cmd,
393
          wr_cmd_port,
394
          wr_ch_num,
395
          joint_req,
396
          cmd_single_in
397
          }),
398
        .dout({HADDR_base,
399
           HBURST,
400
           HSIZE,
401
           wr_last_cmd_out,
402
           wr_port_num,
403
           wr_ch_num_out,
404
           joint_req_out,
405
           cmd_single_out
406
           }),
407
        .empty(cmd_empty),
408
        .full(cmd_full)
409
        );
410
 
411
 
412
   prgen_fifo #(4+4+3+1, 2+1)
413
   cmd_data_fifo(
414
         .clk(clk),
415
         .reset(reset),
416
         .push(wr_burst_start),
417
         .pop(ch_fifo_rd_last),
418
         .din({wr_next_size_in,
419
               data_num_pre,
420
               wr_ch_num,
421
               wr_line_cmd
422
               }),
423
         .dout({wr_next_size,
424
            data_num,
425
            ch_fifo_rd_num,
426
            wr_line_out
427
            }),
428
         .empty(cmd_data_empty),
429
         .full(cmd_data_full)
430
         );
431
 
432
 
433
   assign port_change     = 1'b0;
434
   assign port_change_end = 1'b0;
435
 
436
 
437
   assign data_fullness_pre = data_fullness + data_ready - wr_transfer_pre;
438
 
439
   always @(posedge clk or posedge reset)
440
     if (reset)
441
       data_fullness <= #1 3'd0;
442
     else if (data_ready | wr_transfer_pre)
443
       data_fullness <= #1 data_fullness_pre;
444
 
445
   always @(posedge clk or posedge reset)
446
     if (reset)
447
       data_on_the_way <= #1 2'd0;
448
     else if (ch_fifo_rd | data_ready)
449
       data_on_the_way <= #1 data_on_the_way + ch_fifo_rd - data_ready;
450
 
451
   assign data_pending_pre =  ((data_fullness + data_on_the_way) > 'd3) & (~wr_transfer_pre);
452
 
453
   prgen_delay #(1) delay_data_pending (.clk(clk), .reset(reset), .din(data_pending_pre), .dout(data_pending));
454
 
455
   //depth is set by maximum fifo read data latency
456
   prgen_fifo #(64, 5+2)
457
   data_fifo(
458
                      .clk(clk),
459
                      .reset(reset),
460
                      .push(data_ready),
461
                      .pop(wr_transfer_pre),
462
                      .din(ch_fifo_rdata),
463
                      .dout(HWDATA),
464
                      .empty(data_empty),
465
                      .full(data_full)
466
                      );
467
 
468
 
469
   dma_ahb64_core0_ahbm_timeout  dma_ahb64_core0_ahbm_timeout (
470
                             .clk(clk),
471
                             .reset(reset),
472
                             .HTRANS(HTRANS),
473
                             .HREADY(HREADY),
474
                             .ahb_timeout(ahb_wr_timeout)
475
                             );
476
 
477
   assign                     ahb_wr_timeout_num = wr_ch_num_out;
478
 
479
 
480
 
481
endmodule
482
 
483
 
484
 
485
 

powered by: WebSVN 2.1.0

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