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 22

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
input [data_width*nr_of_queues-1:0] d;
14
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
// and-or mux write data
99
generate
100
    for (i=0;i<nr_of_queues;i=i+1) begin : vector2array
101
        assign wdataa[i] = d[(nr_of_queues-i)*data_width-1:(nr_of_queues-1-i)*data_width];
102
    end
103
endgenerate
104
 
105
always @*
106
begin
107
    wdata = {data_width{1'b0}};
108
    for (l=0;l<nr_of_queues;l=l+1) begin
109
        wdata = (wdataa[l] & {data_width{write[l]}}) | wdata;
110
    end
111
end
112
 
113
vfifo_dual_port_ram_dc_sw # ( .DATA_WIDTH(data_width), .ADDR_WIDTH(a_hi_size+a_lo_size))
114
    dpram (
115
    .d_a(wdata),
116
    .adr_a({onehot2bin(write),wadr}),
117
    .we_a(|(write)),
118
    .clk_a(clk1),
119
    .q_b(q),
120
    .adr_b({onehot2bin(read),radr}),
121
    .clk_b(clk2) );
122
 
123
endmodule

powered by: WebSVN 2.1.0

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