]> git.zerfleddert.de Git - raggedstone/blame - ethernet/source/pci/pci_wbw_wbr_fifos.v
clock
[raggedstone] / ethernet / source / pci / pci_wbw_wbr_fifos.v
CommitLineData
40a1f26c 1//////////////////////////////////////////////////////////////////////
2//// ////
3//// File name "wbw_wbr_fifos.v" ////
4//// ////
5//// This file is part of the "PCI bridge" project ////
6//// http://www.opencores.org/cores/pci/ ////
7//// ////
8//// Author(s): ////
9//// - Miha Dolenc (mihad@opencores.org) ////
10//// ////
11//// All additional information is avaliable in the README ////
12//// file. ////
13//// ////
14//// ////
15//////////////////////////////////////////////////////////////////////
16//// ////
17//// Copyright (C) 2001 Miha Dolenc, mihad@opencores.org ////
18//// ////
19//// This source file may be used and distributed without ////
20//// restriction provided that this copyright statement is not ////
21//// removed from the file and that any derivative work contains ////
22//// the original copyright notice and the associated disclaimer. ////
23//// ////
24//// This source file is free software; you can redistribute it ////
25//// and/or modify it under the terms of the GNU Lesser General ////
26//// Public License as published by the Free Software Foundation; ////
27//// either version 2.1 of the License, or (at your option) any ////
28//// later version. ////
29//// ////
30//// This source is distributed in the hope that it will be ////
31//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
32//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
33//// PURPOSE. See the GNU Lesser General Public License for more ////
34//// details. ////
35//// ////
36//// You should have received a copy of the GNU Lesser General ////
37//// Public License along with this source; if not, download it ////
38//// from http://www.opencores.org/lgpl.shtml ////
39//// ////
40//////////////////////////////////////////////////////////////////////
41//
42// CVS Revision History
43//
44// $Log: pci_wbw_wbr_fifos.v,v $
45// Revision 1.1 2007-03-20 17:50:56 sithglan
46// add shit
47//
48// Revision 1.7 2006/07/04 13:16:19 mihad
49// Write burst performance patch applied.
50// Not tested. Everything should be backwards
51// compatible, since functional code is ifdefed.
52//
53// Revision 1.6 2003/12/19 11:11:30 mihad
54// Compact PCI Hot Swap support added.
55// New testcases added.
56// Specification updated.
57// Test application changed to support WB B3 cycles.
58//
59// Revision 1.5 2003/10/17 09:11:52 markom
60// mbist signals updated according to newest convention
61//
62// Revision 1.4 2003/08/14 13:06:03 simons
63// synchronizer_flop replaced with pci_synchronizer_flop, artisan ram instance updated.
64//
65// Revision 1.3 2003/03/26 13:16:18 mihad
66// Added the reset value parameter to the synchronizer flop module.
67// Added resets to all synchronizer flop instances.
68// Repaired initial sync value in fifos.
69//
70// Revision 1.2 2003/01/30 22:01:09 mihad
71// Updated synchronization in top level fifo modules.
72//
73// Revision 1.1 2003/01/27 16:49:31 mihad
74// Changed module and file names. Updated scripts accordingly. FIFO synchronizations changed.
75//
76// Revision 1.9 2002/10/18 03:36:37 tadejm
77// Changed wrong signal name mbist_sen into mbist_ctrl_i.
78//
79// Revision 1.8 2002/10/17 22:49:22 tadejm
80// Changed BIST signals for RAMs.
81//
82// Revision 1.7 2002/10/11 10:09:01 mihad
83// Added additional testcase and changed rst name in BIST to trst
84//
85// Revision 1.6 2002/10/08 17:17:06 mihad
86// Added BIST signals for RAMs.
87//
88// Revision 1.5 2002/09/30 16:03:04 mihad
89// Added meta flop module for easier meta stable FF identification during synthesis
90//
91// Revision 1.4 2002/09/25 15:53:52 mihad
92// Removed all logic from asynchronous reset network
93//
94// Revision 1.3 2002/02/01 15:25:14 mihad
95// Repaired a few bugs, updated specification, added test bench files and design document
96//
97// Revision 1.2 2001/10/05 08:20:12 mihad
98// Updated all files with inclusion of timescale file for simulation purposes.
99//
100// Revision 1.1.1.1 2001/10/02 15:33:47 mihad
101// New project directory structure
102//
103//
104
105`include "pci_constants.v"
106
107// synopsys translate_off
108`include "timescale.v"
109// synopsys translate_on
110
111
112
113module pci_wbw_wbr_fifos
114(
115 wb_clock_in,
116 pci_clock_in,
117 reset_in,
118 wbw_wenable_in,
119 wbw_addr_data_in,
120 wbw_cbe_in,
121 wbw_control_in,
122 wbw_renable_in,
123 wbw_addr_data_out,
124 wbw_cbe_out,
125 wbw_control_out,
126// wbw_flush_in, write fifo flush not used
127 wbw_almost_full_out,
128 wbw_full_out,
129 wbw_empty_out,
130 wbw_transaction_ready_out,
131 wbw_half_full_out, ////Robert, burst issue
132 wbr_wenable_in,
133 wbr_data_in,
134 wbr_be_in,
135 wbr_control_in,
136 wbr_renable_in,
137 wbr_data_out,
138 wbr_be_out,
139 wbr_control_out,
140 wbr_flush_in,
141 wbr_empty_out
142
143
144`ifdef PCI_BIST
145 ,
146 // debug chain signals
147 mbist_si_i, // bist scan serial in
148 mbist_so_o, // bist scan serial out
149 mbist_ctrl_i // bist chain shift control
150`endif
151) ;
152
153/*-----------------------------------------------------------------------------------------------------------
154System inputs:
155wb_clock_in - WISHBONE bus clock
156pci_clock_in - PCI bus clock
157reset_in - reset from control logic
158-------------------------------------------------------------------------------------------------------------*/
159input wb_clock_in, pci_clock_in, reset_in ;
160
161/*-----------------------------------------------------------------------------------------------------------
162WISHBONE WRITE FIFO interface signals prefixed with wbw_ - FIFO is used for posted writes initiated by
163WISHBONE master, traveling through FIFO and are completed on PCI by PCI master interface
164
165write enable signal:
166wbw_wenable_in = write enable input for WBW_FIFO - driven by WISHBONE slave interface
167
168data input signals:
169wbw_addr_data_in = data input - data from WISHBONE bus - first entry of transaction is address others are data entries
170wbw_cbe_in = bus command/byte enable(~SEL[3:0]) input - first entry of transaction is bus command, other are byte enables
171wbw_control_in = control input - encoded control bus input
172
173read enable signal:
174wbw_renable_in = read enable input driven by PCI master interface
175
176data output signals:
177wbw_addr_data_out = data output - data from WISHBONE bus - first entry of transaction is address, others are data entries
178wbw_cbe_out = bus command/byte enable output - first entry of transaction is bus command, others are byte enables
179wbw_control_out = control input - encoded control bus input
180
181status signals - monitored by various resources in the core
182wbw_flush_in = flush signal input for WBW_FIFO - when asserted, fifo is flushed(emptied)
183wbw_almost_full_out = almost full output from WBW_FIFO
184wbw_full_out = full output from WBW_FIFO
185wbw_empty_out = empty output from WBW_FIFO
186wbw_transaction_ready_out = output indicating that one complete transaction is waiting in WBW_FIFO
187-----------------------------------------------------------------------------------------------------------*/
188// input control and data
189input wbw_wenable_in ;
190input [31:0] wbw_addr_data_in ;
191input [3:0] wbw_cbe_in ;
192input [3:0] wbw_control_in ;
193
194// output control and data
195input wbw_renable_in ;
196output [31:0] wbw_addr_data_out ;
197output [3:0] wbw_cbe_out ;
198output [3:0] wbw_control_out ;
199
200// flush input
201// input wbw_flush_in ; // not used
202
203// status outputs
204output wbw_almost_full_out ;
205output wbw_full_out ;
206output wbw_empty_out ;
207output wbw_transaction_ready_out ;
208output wbw_half_full_out; ////Robert, burst issue
209
210/*-----------------------------------------------------------------------------------------------------------
211WISHBONE READ FIFO interface signals prefixed with wbr_ - FIFO is used for holding delayed read completions
212initiated by master on WISHBONE bus and completed on PCI bus,
213
214write enable signal:
215wbr_wenable_in = write enable input for WBR_FIFO - driven by PCI master interface
216
217data input signals:
218wbr_data_in = data input - data from PCI bus - there is no address entry here, since address is stored in separate register
219wbr_be_in = byte enable(~BE#[3:0]) input - byte enables - same through one transaction
220wbr_control_in = control input - encoded control bus input
221
222read enable signal:
223wbr_renable_in = read enable input driven by WISHBONE slave interface
224
225data output signals:
226wbr_data_out = data output - data from PCI bus
227wbr_be_out = byte enable output(~#BE)
228wbr_control_out = control output - encoded control bus output
229
230status signals - monitored by various resources in the core
231wbr_flush_in = flush signal input for WBR_FIFO - when asserted, fifo is flushed(emptied)
232wbr full_out = full output from WBR_FIFO
233wbr_empty_out = empty output from WBR_FIFO
234-----------------------------------------------------------------------------------------------------------*/
235// input control and data
236input wbr_wenable_in ;
237input [31:0] wbr_data_in ;
238input [3:0] wbr_be_in ;
239input [3:0] wbr_control_in ;
240
241// output control and data
242input wbr_renable_in ;
243output [31:0] wbr_data_out ;
244output [3:0] wbr_be_out ;
245output [3:0] wbr_control_out ;
246
247// flush input
248input wbr_flush_in ;
249
250output wbr_empty_out ;
251
252`ifdef PCI_BIST
253/*-----------------------------------------------------
254BIST debug chain port signals
255-----------------------------------------------------*/
256input mbist_si_i; // bist scan serial in
257output mbist_so_o; // bist scan serial out
258input [`PCI_MBIST_CTRL_WIDTH - 1:0] mbist_ctrl_i; // bist chain shift control
259`endif
260
261/*-----------------------------------------------------------------------------------------------------------
262FIFO depth parameters:
263WBW_DEPTH = defines WBW_FIFO depth
264WBR_DEPTH = defines WBR_FIFO depth
265WBW_ADDR_LENGTH = defines WBW_FIFO's location address length = log2(WBW_DEPTH)
266WBR_ADDR_LENGTH = defines WBR_FIFO's location address length = log2(WBR_DEPTH)
267-----------------------------------------------------------------------------------------------------------*/
268parameter WBW_DEPTH = `WBW_DEPTH ;
269parameter WBW_ADDR_LENGTH = `WBW_ADDR_LENGTH ;
270parameter WBR_DEPTH = `WBR_DEPTH ;
271parameter WBR_ADDR_LENGTH = `WBR_ADDR_LENGTH ;
272
273/*-----------------------------------------------------------------------------------------------------------
274wbw_wallow = WBW_FIFO write allow wire - writes to FIFO are allowed when FIFO isn't full and write enable is 1
275wbw_rallow = WBW_FIFO read allow wire - reads from FIFO are allowed when FIFO isn't empty and read enable is 1
276-----------------------------------------------------------------------------------------------------------*/
277wire wbw_wallow ;
278wire wbw_rallow ;
279
280/*-----------------------------------------------------------------------------------------------------------
281wbr_wallow = WBR_FIFO write allow wire - writes to FIFO are allowed when FIFO isn't full and write enable is 1
282wbr_rallow = WBR_FIFO read allow wire - reads from FIFO are allowed when FIFO isn't empty and read enable is 1
283-----------------------------------------------------------------------------------------------------------*/
284wire wbr_wallow ;
285wire wbr_rallow ;
286
287/*-----------------------------------------------------------------------------------------------------------
288wires for address port conections from WBW_FIFO control logic to RAM blocks used for WBW_FIFO
289-----------------------------------------------------------------------------------------------------------*/
290wire [(WBW_ADDR_LENGTH - 1):0] wbw_raddr ;
291wire [(WBW_ADDR_LENGTH - 1):0] wbw_waddr ;
292
293/*-----------------------------------------------------------------------------------------------------------
294wires for address port conections from WBR_FIFO control logic to RAM blocks used for WBR_FIFO
295-----------------------------------------------------------------------------------------------------------*/
296wire [(WBR_ADDR_LENGTH - 1):0] wbr_raddr ;
297wire [(WBR_ADDR_LENGTH - 1):0] wbr_waddr ;
298
299/*-----------------------------------------------------------------------------------------------------------
300WBW_FIFO transaction counters: used to count incoming transactions and outgoing transactions. When number of
301input transactions is equal to number of output transactions, it means that there isn't any complete transaction
302currently present in the FIFO.
303-----------------------------------------------------------------------------------------------------------*/
304reg [(WBW_ADDR_LENGTH - 2):0] wbw_inTransactionCount ;
305reg [(WBW_ADDR_LENGTH - 2):0] wbw_outTransactionCount ;
306
307/*-----------------------------------------------------------------------------------------------------------
308wires monitoring control bus. When control bus on a write transaction has a value of `LAST, it means that
309complete transaction is in the FIFO. When control bus on a read transaction has a value of `LAST,
310it means that there was one complete transaction taken out of FIFO.
311-----------------------------------------------------------------------------------------------------------*/
312wire wbw_last_in = wbw_control_in[`LAST_CTRL_BIT] ;
313wire wbw_last_out = wbw_control_out[`LAST_CTRL_BIT] ;
314
315wire wbw_empty ;
316wire wbr_empty ;
317
318assign wbw_empty_out = wbw_empty ;
319assign wbr_empty_out = wbr_empty ;
320
321// clear wires for fifos
322wire wbw_clear = reset_in /*|| wbw_flush_in*/ ; // WBW_FIFO clear flush not used
323wire wbr_clear = reset_in /*|| wbr_flush_in*/ ; // WBR_FIFO clear - flush changed from asynchronous to synchronous
324
325/*-----------------------------------------------------------------------------------------------------------
326Definitions of wires for connecting RAM instances
327-----------------------------------------------------------------------------------------------------------*/
328wire [39:0] dpram_portA_output ;
329wire [39:0] dpram_portB_output ;
330
331wire [39:0] dpram_portA_input = {wbw_control_in, wbw_cbe_in, wbw_addr_data_in} ;
332wire [39:0] dpram_portB_input = {wbr_control_in, wbr_be_in, wbr_data_in} ;
333
334/*-----------------------------------------------------------------------------------------------------------
335Fifo output assignments - each ram port provides data for different fifo
336-----------------------------------------------------------------------------------------------------------*/
337assign wbw_control_out = dpram_portB_output[39:36] ;
338assign wbr_control_out = dpram_portA_output[39:36] ;
339
340assign wbw_cbe_out = dpram_portB_output[35:32] ;
341assign wbr_be_out = dpram_portA_output[35:32] ;
342
343assign wbw_addr_data_out = dpram_portB_output[31:0] ;
344assign wbr_data_out = dpram_portA_output[31:0] ;
345
346`ifdef WB_RAM_DONT_SHARE
347
348 /*-----------------------------------------------------------------------------------------------------------
349 Piece of code in this ifdef section is used in applications which can provide enough RAM instances to
350 accomodate four fifos - each occupying its own instance of ram. Ports are connected in such a way,
351 that instances of RAMs can be changed from two port to dual port ( async read/write port ). In that case,
352 write port is always port a and read port is port b.
353 -----------------------------------------------------------------------------------------------------------*/
354
355 /*-----------------------------------------------------------------------------------------------------------
356 Pad redundant address lines with zeros. This may seem stupid, but it comes in perfect for FPGA impl.
357 -----------------------------------------------------------------------------------------------------------*/
358 /*
359 wire [(`WBW_FIFO_RAM_ADDR_LENGTH - WBW_ADDR_LENGTH - 1):0] wbw_addr_prefix = {( `WBW_FIFO_RAM_ADDR_LENGTH - WBW_ADDR_LENGTH){1'b0}} ;
360 wire [(`WBR_FIFO_RAM_ADDR_LENGTH - WBR_ADDR_LENGTH - 1):0] wbr_addr_prefix = {( `WBR_FIFO_RAM_ADDR_LENGTH - WBR_ADDR_LENGTH){1'b0}} ;
361 */
362
363 // compose complete port addresses
364 wire [(`WB_FIFO_RAM_ADDR_LENGTH-1):0] wbw_whole_waddr = wbw_waddr ;
365 wire [(`WB_FIFO_RAM_ADDR_LENGTH-1):0] wbw_whole_raddr = wbw_raddr ;
366
367 wire [(`WB_FIFO_RAM_ADDR_LENGTH-1):0] wbr_whole_waddr = wbr_waddr ;
368 wire [(`WB_FIFO_RAM_ADDR_LENGTH-1):0] wbr_whole_raddr = wbr_raddr ;
369
370 wire wbw_read_enable = 1'b1 ;
371 wire wbr_read_enable = 1'b1 ;
372
373 `ifdef PCI_BIST
374 wire mbist_so_o_internal ; // wires for connection of debug ports on two rams
375 wire mbist_si_i_internal = mbist_so_o_internal ;
376 `endif
377
378 // instantiate and connect two generic rams - one for wishbone write fifo and one for wishbone read fifo
379 pci_wb_tpram #(`WB_FIFO_RAM_ADDR_LENGTH, 40) wbw_fifo_storage
380 (
381 /////////////////Generic synchronous two-port RAM interface
382 .clk_a(wb_clock_in),
383 .rst_a(reset_in),
384 .ce_a(1'b1),
385 .we_a(wbw_wallow),
386 .oe_a(1'b1),
387 .addr_a(wbw_whole_waddr),
388 .di_a(dpram_portA_input),
389 .do_a(),
390
391 .clk_b(pci_clock_in),
392 .rst_b(reset_in),
393 .ce_b(wbw_read_enable),
394 .we_b(1'b0),
395 .oe_b(1'b1),
396 .addr_b(wbw_whole_raddr),
397 .di_b(40'h00_0000_0000),
398 .do_b(dpram_portB_output)
399
400 `ifdef PCI_BIST
401 ,
402 .mbist_si_i (mbist_si_i),
403 .mbist_so_o (mbist_so_o_internal),
404 .mbist_ctrl_i (mbist_ctrl_i)
405 `endif
406 );
407
408 pci_wb_tpram #(`WB_FIFO_RAM_ADDR_LENGTH, 40) wbr_fifo_storage
409 (
410 // Generic synchronous two-port RAM interface
411 .clk_a(pci_clock_in),
412 .rst_a(reset_in),
413 .ce_a(1'b1),
414 .we_a(wbr_wallow),
415 .oe_a(1'b1),
416 .addr_a(wbr_whole_waddr),
417 .di_a(dpram_portB_input),
418 .do_a(),
419
420 .clk_b(wb_clock_in),
421 .rst_b(reset_in),
422 .ce_b(wbr_read_enable),
423 .we_b(1'b0),
424 .oe_b(1'b1),
425 .addr_b(wbr_whole_raddr),
426 .di_b(40'h00_0000_0000),
427 .do_b(dpram_portA_output)
428
429 `ifdef PCI_BIST
430 ,
431 .mbist_si_i (mbist_si_i_internal),
432 .mbist_so_o (mbist_so_o),
433 .mbist_ctrl_i (mbist_ctrl_i)
434 `endif
435 );
436
437
438`else // RAM blocks sharing between two fifos
439
440 /*-----------------------------------------------------------------------------------------------------------
441 Code section under this ifdef is used for implementation where RAM instances are too expensive. In this
442 case one RAM instance is used for both - WISHBONE read and WISHBONE write fifo.
443 -----------------------------------------------------------------------------------------------------------*/
444 /*-----------------------------------------------------------------------------------------------------------
445 Address prefix definition - since both FIFOs reside in same RAM instance, storage is separated by MSB
446 addresses. WISHBONE write fifo addresses are padded with zeros on the MSB side ( at least one address line
447 must be used for this ), WISHBONE read fifo addresses are padded with ones on the right ( at least one ).
448 -----------------------------------------------------------------------------------------------------------*/
449 wire [(`WB_FIFO_RAM_ADDR_LENGTH - WBW_ADDR_LENGTH - 1):0] wbw_addr_prefix = {( `WB_FIFO_RAM_ADDR_LENGTH - WBW_ADDR_LENGTH){1'b0}} ;
450 wire [(`WB_FIFO_RAM_ADDR_LENGTH - WBR_ADDR_LENGTH - 1):0] wbr_addr_prefix = {( `WB_FIFO_RAM_ADDR_LENGTH - WBR_ADDR_LENGTH){1'b1}} ;
451
452 /*-----------------------------------------------------------------------------------------------------------
453 Port A address generation for RAM instance. RAM instance must be full two port RAM - read and write capability
454 on both sides.
455 Port A is clocked by WISHBONE clock, DIA is input for wbw_fifo, DOA is output for wbr_fifo.
456 Address is multiplexed so operation can be switched between fifos. Default is a read on port.
457 -----------------------------------------------------------------------------------------------------------*/
458 wire [(`WB_FIFO_RAM_ADDR_LENGTH-1):0] portA_addr = wbw_wallow ? {wbw_addr_prefix, wbw_waddr} : {wbr_addr_prefix, wbr_raddr} ;
459
460 /*-----------------------------------------------------------------------------------------------------------
461 Port B is clocked by PCI clock, DIB is input for wbr_fifo, DOB is output for wbw_fifo.
462 Address is multiplexed so operation can be switched between fifos. Default is a read on port.
463 -----------------------------------------------------------------------------------------------------------*/
464 wire [(`WB_FIFO_RAM_ADDR_LENGTH-1):0] portB_addr = wbr_wallow ? {wbr_addr_prefix, wbr_waddr} : {wbw_addr_prefix, wbw_raddr} ;
465
466 wire portA_enable = 1'b1 ;
467
468 wire portB_enable = 1'b1 ;
469
470 // instantiate RAM for these two fifos
471 pci_wb_tpram #(`WB_FIFO_RAM_ADDR_LENGTH, 40) wbu_fifo_storage
472 (
473 // Generic synchronous two-port RAM interface
474 .clk_a(wb_clock_in),
475 .rst_a(reset_in),
476 .ce_a(portA_enable),
477 .we_a(wbw_wallow),
478 .oe_a(1'b1),
479 .addr_a(portA_addr),
480 .di_a(dpram_portA_input),
481 .do_a(dpram_portA_output),
482 .clk_b(pci_clock_in),
483 .rst_b(reset_in),
484 .ce_b(portB_enable),
485 .we_b(wbr_wallow),
486 .oe_b(1'b1),
487 .addr_b(portB_addr),
488 .di_b(dpram_portB_input),
489 .do_b(dpram_portB_output)
490
491 `ifdef PCI_BIST
492 ,
493 .mbist_si_i (mbist_si_i),
494 .mbist_so_o (mbist_so_o),
495 .mbist_ctrl_i (mbist_ctrl_i)
496 `endif
497 );
498
499`endif
500
501
502/*-----------------------------------------------------------------------------------------------------------
503Instantiation of two control logic modules - one for WBW_FIFO and one for WBR_FIFO
504-----------------------------------------------------------------------------------------------------------*/
505pci_wbw_fifo_control #(WBW_ADDR_LENGTH) wbw_fifo_ctrl
506(
507 .rclock_in(pci_clock_in),
508 .wclock_in(wb_clock_in),
509 .renable_in(wbw_renable_in),
510 .wenable_in(wbw_wenable_in),
511 .reset_in(reset_in),
512////////////////////////////// .flush_in(wbw_flush_in),
513 .almost_full_out(wbw_almost_full_out),
514 .full_out(wbw_full_out),
515 .empty_out(wbw_empty),
516 .waddr_out(wbw_waddr),
517 .raddr_out(wbw_raddr),
518 .rallow_out(wbw_rallow),
519 .wallow_out(wbw_wallow),
520 .half_full_out(wbw_half_full_out) ////Robert, burst issue
521);
522
523pci_wbr_fifo_control #(WBR_ADDR_LENGTH) wbr_fifo_ctrl
524( .rclock_in(wb_clock_in),
525 .wclock_in(pci_clock_in),
526 .renable_in(wbr_renable_in),
527 .wenable_in(wbr_wenable_in),
528 .reset_in(reset_in),
529 .flush_in(wbr_flush_in),
530 .empty_out(wbr_empty),
531 .waddr_out(wbr_waddr),
532 .raddr_out(wbr_raddr),
533 .rallow_out(wbr_rallow),
534 .wallow_out(wbr_wallow)
535);
536
537
538// in and out transaction counters and grey codes
539reg [(WBW_ADDR_LENGTH-2):0] inGreyCount ;
540reg [(WBW_ADDR_LENGTH-2):0] outGreyCount ;
541wire [(WBW_ADDR_LENGTH-2):0] inNextGreyCount = {wbw_inTransactionCount[(WBW_ADDR_LENGTH-2)], wbw_inTransactionCount[(WBW_ADDR_LENGTH-2):1] ^ wbw_inTransactionCount[(WBW_ADDR_LENGTH-3):0]} ;
542wire [(WBW_ADDR_LENGTH-2):0] outNextGreyCount = {wbw_outTransactionCount[(WBW_ADDR_LENGTH-2)], wbw_outTransactionCount[(WBW_ADDR_LENGTH-2):1] ^ wbw_outTransactionCount[(WBW_ADDR_LENGTH-3):0]} ;
543
544// input transaction counter increment - when last data of transaction is written to fifo
545wire in_count_en = wbw_wallow && wbw_last_in ;
546
547// output transaction counter increment - when last data is on top of fifo and read from it
548wire out_count_en = wbw_renable_in && wbw_last_out ;
549
550// register holding grey coded count of incoming transactions
551always@(posedge wb_clock_in or posedge wbw_clear)
552begin
553 if (wbw_clear)
554 begin
555 inGreyCount <= #3 0 ;
556 end
557 else
558 if (in_count_en)
559 inGreyCount <= #3 inNextGreyCount ;
560end
561
562wire [(WBW_ADDR_LENGTH-2):0] pci_clk_sync_inGreyCount ;
563reg [(WBW_ADDR_LENGTH-2):0] pci_clk_inGreyCount ;
564pci_synchronizer_flop #((WBW_ADDR_LENGTH - 1), 0) i_synchronizer_reg_inGreyCount
565(
566 .data_in (inGreyCount),
567 .clk_out (pci_clock_in),
568 .sync_data_out (pci_clk_sync_inGreyCount),
569 .async_reset (wbw_clear)
570) ;
571
572always@(posedge pci_clock_in or posedge wbw_clear)
573begin
574 if (wbw_clear)
575 pci_clk_inGreyCount <= #`FF_DELAY 0 ;
576 else
577 pci_clk_inGreyCount <= # `FF_DELAY pci_clk_sync_inGreyCount ;
578end
579
580// register holding grey coded count of outgoing transactions
581always@(posedge pci_clock_in or posedge wbw_clear)
582begin
583 if (wbw_clear)
584 begin
585 outGreyCount <= #`FF_DELAY 0 ;
586 end
587 else
588 if (out_count_en)
589 outGreyCount <= #`FF_DELAY outNextGreyCount ;
590end
591
592// incoming transactions counter
593always@(posedge wb_clock_in or posedge wbw_clear)
594begin
595 if (wbw_clear)
596 wbw_inTransactionCount <= #`FF_DELAY 1 ;
597 else
598 if (in_count_en)
599 wbw_inTransactionCount <= #`FF_DELAY wbw_inTransactionCount + 1'b1 ;
600end
601
602// outgoing transactions counter
603always@(posedge pci_clock_in or posedge wbw_clear)
604begin
605 if (wbw_clear)
606 wbw_outTransactionCount <= 1 ;
607 else
608 if (out_count_en)
609 wbw_outTransactionCount <= #`FF_DELAY wbw_outTransactionCount + 1'b1 ;
610end
611
612assign wbw_transaction_ready_out = pci_clk_inGreyCount != outGreyCount ;
613
614endmodule
615
Impressum, Datenschutz