Line 1... |
Line 1... |
// async FIFO with multiple queues, multiple data
|
// async FIFO with multiple queues, multiple data
|
|
|
module async_fifo_mq_md (
|
module async_fifo_mq_md (
|
d, fifo_full, write, clk1, rst1,
|
d, fifo_full, write, write_enable, clk1, rst1,
|
q, fifo_empty, read, clk2, rst2
|
q, fifo_empty, read, read_enable, clk2, rst2
|
);
|
);
|
|
|
parameter a_hi_size = 4;
|
parameter a_hi_size = 4;
|
parameter a_lo_size = 4;
|
parameter a_lo_size = 4;
|
parameter nr_of_queues = 16;
|
parameter nr_of_queues = 16;
|
parameter data_width = 36;
|
parameter data_width = 36;
|
|
|
input [data_width*nr_of_queues-1:0] d;
|
input [data_width*nr_of_queues-1:0] d;
|
output [0:nr_of_queues-1] fifo_full;
|
output [0:nr_of_queues-1] fifo_full;
|
input [0:nr_of_queues-1] write;
|
input write;
|
|
input [0:nr_of_queues-1] write_enable;
|
input clk1;
|
input clk1;
|
input rst1;
|
input rst1;
|
|
|
output [data_width-1:0] q;
|
output [data_width-1:0] q;
|
output [0:nr_of_queues-1] fifo_empty;
|
output [0:nr_of_queues-1] fifo_empty;
|
inout [0:nr_of_queues-1] read;
|
input read;
|
|
input [0:nr_of_queues-1] read_enable;
|
input clk2;
|
input clk2;
|
input rst2;
|
input rst2;
|
|
|
wire [a_lo_size-1:0] fifo_wadr_bin[0:nr_of_queues-1];
|
wire [a_lo_size-1:0] fifo_wadr_bin[0:nr_of_queues-1];
|
wire [a_lo_size-1:0] fifo_wadr_gray[0:nr_of_queues-1];
|
wire [a_lo_size-1:0] fifo_wadr_gray[0:nr_of_queues-1];
|
Line 48... |
Line 50... |
|
|
generate
|
generate
|
for (i=0;i<nr_of_queues;i=i+1) begin : fifo_adr
|
for (i=0;i<nr_of_queues;i=i+1) begin : fifo_adr
|
|
|
gray_counter wadrcnt (
|
gray_counter wadrcnt (
|
.cke(write[i]),
|
.cke(write & write_enable[i]),
|
.q(fifo_wadr_gray[i]),
|
.q(fifo_wadr_gray[i]),
|
.q_bin(fifo_wadr_bin[i]),
|
.q_bin(fifo_wadr_bin[i]),
|
.rst(rst1),
|
.rst(rst1),
|
.clk(clk1));
|
.clk(clk1));
|
|
|
gray_counter radrcnt (
|
gray_counter radrcnt (
|
.cke(read[i]),
|
.cke(read & read_enable[i]),
|
.q(fifo_radr_gray[i]),
|
.q(fifo_radr_gray[i]),
|
.q_bin(fifo_radr_bin[i]),
|
.q_bin(fifo_radr_bin[i]),
|
.rst(rst2),
|
.rst(rst2),
|
.clk(clk2));
|
.clk(clk2));
|
|
|
Line 80... |
Line 82... |
// and-or mux write address
|
// and-or mux write address
|
always @*
|
always @*
|
begin
|
begin
|
wadr = {a_lo_size{1'b0}};
|
wadr = {a_lo_size{1'b0}};
|
for (j=0;j<nr_of_queues;j=j+1) begin
|
for (j=0;j<nr_of_queues;j=j+1) begin
|
wadr = (fifo_wadr_bin[j] & {a_lo_size{write[j]}}) | wadr;
|
wadr = (fifo_wadr_bin[j] & {a_lo_size{write_enable[j]}}) | wadr;
|
end
|
end
|
end
|
end
|
|
|
// and-or mux read address
|
// and-or mux read address
|
always @*
|
always @*
|
begin
|
begin
|
radr = {a_lo_size{1'b0}};
|
radr = {a_lo_size{1'b0}};
|
for (k=0;k<nr_of_queues;k=k+1) begin
|
for (k=0;k<nr_of_queues;k=k+1) begin
|
radr = (fifo_radr_bin[k] & {a_lo_size{read[k]}}) | radr;
|
radr = (fifo_radr_bin[k] & {a_lo_size{read_enable[k]}}) | radr;
|
end
|
end
|
end
|
end
|
|
|
// and-or mux write data
|
// and-or mux write data
|
generate
|
generate
|
Line 104... |
Line 106... |
|
|
always @*
|
always @*
|
begin
|
begin
|
wdata = {data_width{1'b0}};
|
wdata = {data_width{1'b0}};
|
for (l=0;l<nr_of_queues;l=l+1) begin
|
for (l=0;l<nr_of_queues;l=l+1) begin
|
wdata = (wdataa[l] & {data_width{write[l]}}) | wdata;
|
wdata = (wdataa[l] & {data_width{write_enable[l]}}) | wdata;
|
end
|
end
|
end
|
end
|
|
|
vfifo_dual_port_ram_dc_sw # ( .DATA_WIDTH(data_width), .ADDR_WIDTH(a_hi_size+a_lo_size))
|
vfifo_dual_port_ram_dc_sw # ( .DATA_WIDTH(data_width), .ADDR_WIDTH(a_hi_size+a_lo_size))
|
dpram (
|
dpram (
|
.d_a(wdata),
|
.d_a(wdata),
|
.adr_a({onehot2bin(write),wadr}),
|
.adr_a({onehot2bin(write_enable),wadr}),
|
.we_a(|(write)),
|
.we_a(write),
|
.clk_a(clk1),
|
.clk_a(clk1),
|
.q_b(q),
|
.q_b(q),
|
.adr_b({onehot2bin(read),radr}),
|
.adr_b({onehot2bin(read_enable),radr}),
|
.clk_b(clk2) );
|
.clk_b(clk2) );
|
|
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|