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 24

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

powered by: WebSVN 2.1.0

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