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

powered by: WebSVN 2.1.0

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