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

Subversion Repositories versatile_fifo

[/] [versatile_fifo/] [trunk/] [rtl/] [verilog/] [async_fifo_mq_md.v] - Blame information for rev 24

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 23 unneback
// async FIFO with multiple queues, multiple data
2
 
3
module async_fifo_mq_md (
4 24 unneback
    d, fifo_full, write, write_enable, clk1, rst1,
5
    q, fifo_empty, read, read_enable, clk2, rst2
6 23 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
input [data_width*nr_of_queues-1:0] d;
14
output [0:nr_of_queues-1] fifo_full;
15 24 unneback
input                     write;
16
input  [0:nr_of_queues-1] write_enable;
17 23 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 23 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 23 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 23 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 23 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 23 unneback
    end
98
end
99
 
100
// and-or mux write data
101
generate
102
    for (i=0;i<nr_of_queues;i=i+1) begin : vector2array
103
        assign wdataa[i] = d[(nr_of_queues-i)*data_width-1:(nr_of_queues-1-i)*data_width];
104
    end
105
endgenerate
106
 
107
always @*
108
begin
109
    wdata = {data_width{1'b0}};
110
    for (l=0;l<nr_of_queues;l=l+1) begin
111 24 unneback
        wdata = (wdataa[l] & {data_width{write_enable[l]}}) | wdata;
112 23 unneback
    end
113
end
114
 
115
vfifo_dual_port_ram_dc_sw # ( .DATA_WIDTH(data_width), .ADDR_WIDTH(a_hi_size+a_lo_size))
116
    dpram (
117
    .d_a(wdata),
118 24 unneback
    .adr_a({onehot2bin(write_enable),wadr}),
119
    .we_a(write),
120 23 unneback
    .clk_a(clk1),
121
    .q_b(q),
122 24 unneback
    .adr_b({onehot2bin(read_enable),radr}),
123 23 unneback
    .clk_b(clk2) );
124
 
125
endmodule

powered by: WebSVN 2.1.0

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