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

Subversion Repositories dma_ahb

[/] [dma_ahb/] [trunk/] [src/] [dma_ahb32/] [dma_ahb32_core0_ahbm_rd.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:31:23 2011
33
//--
34
//-- Source file: dma_core_ahbm_rd.v
35
//---------------------------------------------------------
36
 
37
 
38
 
39
module dma_ahb32_core0_ahbm_rd(clk,reset,load_wr,load_wr_cycle,joint_stall,load_req_in_prog,rd_ch_num,rd_port_num,rd_cmd_port,rd_burst_start,rd_burst_addr,rd_burst_size,rd_cmd_pending,rd_line_cmd,rd_cmd_line,rd_cmd_num,ch_fifo_wr,ch_fifo_wdata,ch_fifo_wsize,ch_fifo_wr_num,rd_transfer,rd_transfer_size,rd_transfer_num,rd_slverr,rd_clr,rd_clr_last,rd_clr_load,rd_clr_line,rd_clr_line_num,rd_hold,ahb_rd_timeout,ahb_rd_timeout_num,HADDR,HBURST,HSIZE,HTRANS,HLAST,HRDATA,HREADY,HRESP,HOLD,SYNC);
40
 
41
   input               clk;
42
   input               reset;
43
 
44
   output               load_wr;
45
   output [1:0]           load_wr_cycle;
46
   input               joint_stall;
47
 
48
   //command
49
   input               load_req_in_prog;
50
   input [2:0]               rd_ch_num;
51
   output               rd_port_num;
52
   input               rd_cmd_port;
53
   input               rd_burst_start;
54
   input [32-1:0]      rd_burst_addr;
55
   input [7-1:0]     rd_burst_size;
56
   output               rd_cmd_pending;
57
   input               rd_line_cmd;
58
   output               rd_cmd_line;
59
   output [2:0]           rd_cmd_num;
60
 
61
   //data
62
   output               ch_fifo_wr;
63
   output [32-1:0]     ch_fifo_wdata;
64
   output [3-1:0]     ch_fifo_wsize;
65
   output [2:0]           ch_fifo_wr_num;
66
   output               rd_transfer;
67
   output [3-1:0]     rd_transfer_size;
68
   output [2:0]           rd_transfer_num;
69
 
70
   //resp
71
   output               rd_slverr;
72
   output               rd_clr;
73
   output               rd_clr_last;
74
   output               rd_clr_load;
75
   output               rd_clr_line;
76
   output [2:0]           rd_clr_line_num;
77
   output               rd_hold;
78
   output               ahb_rd_timeout;
79
   output [2:0]           ahb_rd_timeout_num;
80
 
81
   output [32-1:0]     HADDR;
82
   output [2:0]           HBURST;
83
   output [1:0]           HSIZE;
84
   output [1:0]           HTRANS;
85
   output               HLAST;
86
   input [32-1:0]      HRDATA;
87
   input               HREADY;
88
   input               HRESP;
89
   input               HOLD;
90
   input               SYNC;
91
 
92
 
93
   wire [32-1:0]       HADDR_base;
94
   wire [2:0]               HBURST_pre;
95
   wire [1:0]               HSIZE_pre;
96
   wire [1:0]               HSIZE_data;
97
   wire [32-1:0]       HADDR;
98
   wire [2:0]               HBURST;
99
   wire [1:0]               HSIZE;
100
   reg [1:0]               HTRANS;
101
 
102
 
103
   wire               ch_fifo_wr_pre;
104
   wire               ch_fifo_wr_pre_d;
105
   wire               ch_fifo_wr;
106
   wire               ch_fifo_wr_stall;
107
   wire               ch_fifo_wr_last;
108
   reg [32-1:0]           ch_fifo_wdata;
109
   wire [3-1:0]       ch_fifo_wsize_pre;
110
   reg [3-1:0]           ch_fifo_wsize;
111
   reg [2:0]               ch_fifo_wr_num;
112
 
113
   wire               rd_slverr_pre;
114
   wire               rd_slverr;
115
   wire               wr_data;
116
   wire               load_wr_pre;
117
   reg [1:0]               load_wr_cycle;
118
   wire               load_wr_last;
119
   reg                   data_phase;
120
   wire [7-1:2] strb_num;
121
   reg [4:0]               cmd_counter;
122
   wire [4:0]               cmd_num;
123
   wire               cmd_last;
124
   wire [3-1:0]       data_width;
125
   wire               ahb_cmd;
126
   wire               ahb_cmd_first;
127
   wire               ahb_cmd_last;
128
   reg                   ahb_cmd_last_d;
129
   wire               ahb_data_last;
130
   wire               ahb_idle;
131
   wire               ahb_busy;
132
   wire               cmd_pop_stall;
133
   wire               cmd_pop;
134
   wire               cmd_empty;
135
   wire               cmd_full;
136
   wire               cmd_next;
137
   wire               cmd_data_empty;
138
   wire               cmd_data_full;
139
   wire               cmd_pending_pre;
140
   wire               load_data_in_prog;
141
   wire               rd_port_num;
142
   wire [2:0]               rd_ch_num_out_cmd;
143
   wire [2:0]               rd_ch_num_out_data;
144
   wire               rd_line_out;
145
   wire               port_change;
146
   wire               port_change_end;
147
   wire               port_change_stall;
148
   wire               rd_clr_pre;
149
   wire               rd_clr;
150
   wire               rd_clr_last_pre;
151
   wire               rd_clr_last;
152
   wire               rd_clr_line_pre;
153
   wire               rd_clr_line;
154
   reg                   rd_clr_line_wait_reg;
155
   wire               rd_clr_line_wait;
156
   wire               rd_clr_line_idle;
157
   reg [2:0]               rd_clr_line_num_reg;
158
   wire               rd_cmd_line_pre;
159
   wire               rd_cmd_line;
160
   reg [2:0]               rd_cmd_num_reg;
161
   wire               ahb_cmd_line;
162
   wire               joint_stall_change_pre;
163
   wire               joint_stall_change;
164
   wire               joint_stall_last_pre;
165
   reg                   joint_stall_last;
166
   wire               rd_burst_stall;
167
   wire               rd_burst_start_d;
168
 
169
 
170
 
171
 
172
   parameter                  TRANS_IDLE   = 2'b00;
173
   parameter                  TRANS_BUSY   = 2'b01;
174
   parameter               TRANS_NONSEQ = 2'b10;
175
   parameter                  TRANS_SEQ    = 2'b11;
176
 
177
   parameter                  BURST_SINGLE = 3'b000;
178
   parameter               BURST_INCR4  = 3'b011;
179
   parameter               BURST_INCR8  = 3'b101;
180
   parameter               BURST_INCR16 = 3'b111;
181
 
182
 
183
 
184
 
185
   assign               rd_hold          = cmd_data_full | load_data_in_prog;
186
 
187
   assign               wr_data          = data_phase & HREADY;
188
   assign               load_wr_pre      = load_data_in_prog & wr_data;
189
 
190
   assign               ch_fifo_wr_pre   = (~load_data_in_prog) & wr_data;
191
   assign               ch_fifo_wr_last  = ch_fifo_wr_pre & ahb_cmd_last_d;
192
   assign               cmd_pending_pre  = HTRANS[1] & (~HREADY);
193
 
194
   assign               ahb_cmd          = HTRANS[1] & HREADY & (~HOLD);
195
   assign               ahb_cmd_first    = ahb_cmd & (HTRANS[1:0] == TRANS_NONSEQ);
196
   assign               ahb_cmd_last     = ahb_cmd & cmd_last;
197
   assign               ahb_idle         = HTRANS[1:0] == TRANS_IDLE;
198
   assign               ahb_busy         = HTRANS[1:0] == TRANS_BUSY;
199
 
200
   assign               rd_transfer      = ch_fifo_wr;
201
   assign               rd_transfer_size = ch_fifo_wsize;
202
   assign               rd_transfer_num  = ch_fifo_wr_num;
203
 
204
   assign               rd_slverr_pre    = data_phase & HREADY & HRESP;
205
   assign               rd_clr_pre       = ahb_data_last & (~load_data_in_prog);
206
   assign               rd_clr_last_pre  = ahb_data_last & load_data_in_prog;
207
   assign               rd_clr_load      = rd_clr_last;
208
 
209
 
210
   prgen_delay #(1) delay_rd_slverr (.clk(clk), .reset(reset), .din(rd_slverr_pre), .dout(rd_slverr));
211
 
212
   prgen_delay #(1) delay_load_wr (.clk(clk), .reset(reset), .din(load_wr_pre), .dout(load_wr));
213
 
214
   prgen_delay #(1) delay_rd_clr (.clk(clk), .reset(reset), .din(rd_clr_pre), .dout(rd_clr));
215
   prgen_delay #(1) delay_rd_clr_last (.clk(clk), .reset(reset), .din(rd_clr_last_pre), .dout(rd_clr_last));
216
 
217
   prgen_delay #(1) delay_cmd_pending (.clk(clk), .reset(reset), .din(cmd_pending_pre), .dout(rd_cmd_pending));
218
 
219
 
220
   assign               rd_clr_line_wait = 1'b0;
221
   assign               rd_clr_line_idle = 1'b0;
222
   assign               rd_cmd_line_pre  = 1'b0;
223
   assign               rd_clr_line_pre  = 1'b0;
224
   assign               rd_cmd_line      = 1'b0;
225
   assign               rd_cmd_num       = 3'd0;
226
   assign               rd_clr_line      = 1'b0;
227
   assign               rd_clr_line_num  = 3'd0;
228
 
229
 
230
   prgen_delay #(1) delay_fifo_wr (.clk(clk), .reset(reset), .din(ch_fifo_wr_pre), .dout(ch_fifo_wr_pre_d));
231
 
232
 
233
   assign               joint_stall_change_pre = joint_stall & ((rd_transfer_num != rd_ch_num_out_data) | (HOLD & HREADY));
234
 
235
   assign               joint_stall_last_pre = joint_stall & ahb_data_last & ahb_idle;
236
 
237
   prgen_delay #(1) delay_joint_stall_change (.clk(clk), .reset(reset), .din(joint_stall_change_pre), .dout(joint_stall_change));
238
 
239
   always @(posedge clk or posedge reset)
240
     if (reset)
241
       joint_stall_last <= #1 1'b0;
242
     else if (joint_stall_last_pre)
243
       joint_stall_last <= #1 1'b1;
244
     else if (!joint_stall)
245
       joint_stall_last <= #1 1'b0;
246
 
247
   assign               ch_fifo_wr_stall = (joint_stall_change & (~ahb_idle)) | joint_stall_last | ahb_busy;
248
 
249
   prgen_stall stall_fifo_wr (.clk(clk), .reset(reset), .din(ch_fifo_wr_pre_d), .stall(ch_fifo_wr_stall), .dout(ch_fifo_wr));
250
 
251
 
252
   assign               cmd_pop_stall = joint_stall | port_change;
253
 
254
   prgen_stall stall_cmd_pop (.clk(clk), .reset(reset), .din(ahb_cmd_last), .stall(cmd_pop_stall), .dout(cmd_pop));
255
 
256
   assign               cmd_num =
257
                  HBURST == BURST_INCR16 ? 5'd16 :
258
                  HBURST == BURST_INCR8  ? 5'd8 :
259
                  HBURST == BURST_INCR4  ? 5'd4 : 5'd1;
260
 
261
 
262
   assign               load_wr_last = load_wr_pre & ahb_cmd_last_d;
263
 
264
   always @(posedge clk or posedge reset)
265
     if (reset)
266
       load_wr_cycle <= #1 2'b00;
267
     else if (load_wr)
268
       load_wr_cycle <= #1 load_wr_cycle + 1'b1;
269
 
270
   assign               ahb_data_last = ch_fifo_wr_last | load_wr_last;
271
 
272
   always @(posedge clk or posedge reset)
273
     if (reset)
274
       ahb_cmd_last_d <= #1 1'b0;
275
     else if (ahb_cmd_last)
276
       ahb_cmd_last_d <= #1 1'b1;
277
     else if (ahb_data_last)
278
       ahb_cmd_last_d <= #1 1'b0;
279
 
280
   assign               cmd_last         = cmd_counter == (cmd_num - 1'b1);
281
 
282
   always @(posedge clk or posedge reset)
283
     if (reset)
284
       cmd_counter <= #1 5'd0;
285
     else if (ahb_cmd_last)
286
       cmd_counter <= #1 5'd0;
287
     else if (ahb_cmd)
288
       cmd_counter <= #1 cmd_counter + 1'b1;
289
 
290
   always @(posedge clk or posedge reset)
291
     if (reset)
292
       data_phase <= #1 1'b0;
293
     else if (ahb_cmd)
294
       data_phase <= #1 1'b1;
295
     else if (ahb_data_last)
296
       data_phase <= #1 1'b0;
297
 
298
 
299
   assign               data_width =
300
                  HSIZE == 2'b00 ? 'd1 :
301
                  HSIZE == 2'b01 ? 'd2 :
302
                  HSIZE == 2'b10 ? 'd4 : 'd8;
303
 
304
   assign               ch_fifo_wsize_pre =
305
                  HSIZE_data == 2'b00 ? 'd1 :
306
                  HSIZE_data == 2'b01 ? 'd2 :
307
                  HSIZE_data == 2'b10 ? 'd4 : 'd8;
308
 
309
 
310
 
311
   always @(posedge clk or posedge reset)
312
     if (reset)
313
       begin
314
      ch_fifo_wsize  <= #1 2'b00;
315
      ch_fifo_wdata  <= #1 {32{1'b0}};
316
      ch_fifo_wr_num <= #1 3'b000;
317
       end
318
     else if (wr_data)
319
       begin
320
      ch_fifo_wsize  <= #1 ch_fifo_wsize_pre;
321
      ch_fifo_wdata  <= #1 HRDATA;
322
      ch_fifo_wr_num <= #1 rd_ch_num_out_data;
323
       end
324
 
325
 
326
   assign               cmd_next = 2 > 1 ? cmd_full : 1'b0;
327
 
328
   assign               HLAST = cmd_last & (~cmd_empty);
329
 
330
 
331
   assign               rd_burst_stall = (ahb_idle & cmd_empty & ahb_cmd_last_d & (~ahb_data_last)) | joint_stall;
332
 
333
   prgen_stall stall_burst_start (.clk(clk), .reset(reset), .din(rd_burst_start), .stall(rd_burst_stall), .dout(rd_burst_start_d));
334
 
335
   always @(posedge clk or posedge reset)
336
     if (reset)
337
       HTRANS <= #1 TRANS_IDLE;
338
     else if (port_change)
339
       HTRANS <= #1 TRANS_IDLE;
340
     else if (ahb_idle & port_change_end & (~cmd_data_empty))
341
       HTRANS <= #1 TRANS_NONSEQ;
342
     else if (rd_clr_line & ahb_idle & ((~cmd_empty) | rd_burst_start))
343
       HTRANS <= #1 TRANS_NONSEQ;
344
     else if (((rd_line_out | rd_cmd_line_pre | joint_stall) & ahb_cmd_last) | rd_clr_line_idle)
345
       HTRANS <= #1 TRANS_IDLE;
346
     else if ((rd_burst_start_d & (ahb_idle | ahb_cmd_last)) | (cmd_next & cmd_pop))
347
       HTRANS <= #1 TRANS_NONSEQ;
348
     else if (ahb_cmd_last)
349
       HTRANS <= #1 TRANS_IDLE;
350
     else if (ahb_cmd & joint_stall)
351
       HTRANS <= #1 TRANS_BUSY;
352
     else if (ahb_cmd | (ahb_busy & (~joint_stall)))
353
       HTRANS <= #1 TRANS_SEQ;
354
 
355
 
356
   assign               HADDR = HADDR_base | {cmd_counter, {2{1'b0}}};
357
 
358
   assign               strb_num = rd_burst_size[7-1:2];
359
 
360
   assign               HBURST_pre =
361
                  strb_num == 'd16 ? BURST_INCR16 :
362
                  strb_num == 'd8  ? BURST_INCR8  :
363
                  strb_num == 'd4  ? BURST_INCR4  : BURST_SINGLE;
364
 
365
   assign               HSIZE_pre =
366
                  rd_burst_size == 'd1 ? 2'b00 :
367
                  rd_burst_size == 'd2 ? 2'b01 :
368
                  rd_burst_size == 'd4 ? 2'b10 : 2;
369
 
370
 
371
 
372
   prgen_fifo #(32+3+2+1+3+1, 2)
373
   cmd_fifo(
374
        .clk(clk),
375
        .reset(reset),
376
        .push(rd_burst_start),
377
        .pop(cmd_pop),
378
        .din({rd_burst_addr,
379
          HBURST_pre,
380
          HSIZE_pre,
381
          rd_cmd_port,
382
          rd_ch_num,
383
          rd_line_cmd
384
          }),
385
        .dout({HADDR_base,
386
           HBURST,
387
           HSIZE,
388
           rd_port_num,
389
           rd_ch_num_out_cmd,
390
           ahb_cmd_line
391
           }),
392
        .empty(cmd_empty),
393
        .full(cmd_full)
394
        );
395
 
396
 
397
 
398
   prgen_fifo #(3+2+1+1, 2)
399
   cmd_data_fifo(
400
         .clk(clk),
401
         .reset(reset),
402
         .push(rd_burst_start),
403
         .pop(ahb_data_last),
404
         .din({rd_ch_num,
405
               HSIZE_pre,
406
               load_req_in_prog,
407
               rd_line_cmd
408
               }),
409
         .dout({rd_ch_num_out_data,
410
            HSIZE_data,
411
            load_data_in_prog,
412
            rd_line_out
413
            }),
414
         .empty(cmd_data_empty),
415
         .full(cmd_data_full)
416
         );
417
 
418
 
419
 
420
   assign               port_change     = 1'b0;
421
   assign               port_change_end = 1'b0;
422
 
423
 
424
   dma_ahb32_core0_ahbm_timeout  dma_ahb32_core0_ahbm_timeout (
425
                             .clk(clk),
426
                             .reset(reset),
427
                             .HTRANS(HTRANS),
428
                             .HREADY(HREADY),
429
                             .ahb_timeout(ahb_rd_timeout)
430
                             );
431
 
432
   assign                     ahb_rd_timeout_num = rd_ch_num_out_cmd;
433
 
434
 
435
 
436
endmodule
437
 
438
 
439
 
440
 
441
 

powered by: WebSVN 2.1.0

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