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

Subversion Repositories versatile_fifo

[/] [versatile_fifo/] [trunk/] [rtl/] [verilog/] [async_fifo_mq.v] - Blame information for rev 23

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 22 unneback
// async FIFO with multiple queues
2
 
3
module async_fifo_mq (
4
    d, fifo_full, write, clk1, rst1,
5
    q, fifo_empty, read, clk2, rst2
6
);
7
 
8
parameter a_hi_size = 4;
9
parameter a_lo_size = 4;
10
parameter nr_of_queues = 16;
11
parameter data_width = 36;
12
 
13 23 unneback
input [data_width-1:0] d;
14 22 unneback
output [0:nr_of_queues-1] fifo_full;
15
input  [0:nr_of_queues-1] write;
16
input clk1;
17
input rst1;
18
 
19
output [data_width-1:0] q;
20
output [0:nr_of_queues-1] fifo_empty;
21
inout  [0:nr_of_queues-1] read;
22
input clk2;
23
input rst2;
24
 
25
wire [a_lo_size-1:0]  fifo_wadr_bin[0:nr_of_queues-1];
26
wire [a_lo_size-1:0]  fifo_wadr_gray[0:nr_of_queues-1];
27
wire [a_lo_size-1:0]  fifo_radr_bin[0:nr_of_queues-1];
28
wire [a_lo_size-1:0]  fifo_radr_gray[0:nr_of_queues-1];
29
reg [a_lo_size-1:0] wadr;
30
reg [a_lo_size-1:0] radr;
31
reg [data_width-1:0] wdata;
32
wire [data_width-1:0] wdataa[0:nr_of_queues-1];
33
 
34
genvar i;
35
integer j,k,l;
36
 
37
function [a_lo_size-1:0] onehot2bin;
38
input [0:nr_of_queues-1] a;
39
integer i;
40
begin
41
    onehot2bin = {a_lo_size{1'b0}};
42
    for (i=1;i<nr_of_queues;i=i+1) begin
43
        if (a[i])
44
            onehot2bin = i;
45
    end
46
end
47
endfunction
48
 
49
generate
50
    for (i=0;i<nr_of_queues;i=i+1) begin : fifo_adr
51
 
52
        gray_counter wadrcnt (
53
            .cke(write[i]),
54
            .q(fifo_wadr_gray[i]),
55
            .q_bin(fifo_wadr_bin[i]),
56
            .rst(rst1),
57
            .clk(clk1));
58
 
59
        gray_counter radrcnt (
60
            .cke(read[i]),
61
            .q(fifo_radr_gray[i]),
62
            .q_bin(fifo_radr_bin[i]),
63
            .rst(rst2),
64
            .clk(clk2));
65
 
66
        versatile_fifo_async_cmp
67
            #(.ADDR_WIDTH(a_lo_size))
68
            egresscmp (
69
                .wptr(fifo_wadr_gray[i]),
70
                .rptr(fifo_radr_gray[i]),
71
                .fifo_empty(fifo_empty[i]),
72
                .fifo_full(fifo_full[i]),
73
                .wclk(clk1),
74
                .rclk(clk2),
75
                .rst(rst1));
76
 
77
    end
78
endgenerate
79
 
80
// and-or mux write address
81
always @*
82
begin
83
    wadr = {a_lo_size{1'b0}};
84
    for (j=0;j<nr_of_queues;j=j+1) begin
85
        wadr = (fifo_wadr_bin[j] & {a_lo_size{write[j]}}) | wadr;
86
    end
87
end
88
 
89
// and-or mux read address
90
always @*
91
begin
92
    radr = {a_lo_size{1'b0}};
93
    for (k=0;k<nr_of_queues;k=k+1) begin
94
        radr = (fifo_radr_bin[k] & {a_lo_size{read[k]}}) | radr;
95
    end
96
end
97
 
98
vfifo_dual_port_ram_dc_sw # ( .DATA_WIDTH(data_width), .ADDR_WIDTH(a_hi_size+a_lo_size))
99
    dpram (
100 23 unneback
    .d_a(d),
101 22 unneback
    .adr_a({onehot2bin(write),wadr}),
102
    .we_a(|(write)),
103
    .clk_a(clk1),
104
    .q_b(q),
105
    .adr_b({onehot2bin(read),radr}),
106
    .clk_b(clk2) );
107
 
108
endmodule

powered by: WebSVN 2.1.0

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