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

powered by: WebSVN 2.1.0

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