题解 | #同步FIFO#
注意点1:
重写了一下,还是有好几个小错误的
注意点:如果是奇数位的FIFO怎么判断空满。题解 | #同步FIFO#_牛客博客 (nowcoder.net),没有全看懂,只初步了解FIFO深度为奇数时需要特殊处理。
注意点1:例化的格式。
注意点1:例化的格式。
注意点2:传入到RAM中的使能信号rinc & ~rempty,winc & ~wfull
注意点3:空满判断。
dual_port_RAM #( .WIDTH(WIDTH), .DEPTH(DEPTH) ) ram_inst .waddr(waddr[addr_width-1:0]), .raddr(raddr[addr_width-1:0]),
`timescale 1ns/1ns
/**********************************RAM************************************/
module dual_port_RAM #(parameter DEPTH = 16,
parameter WIDTH = 8)(
input wclk
,input wenc
,input [$clog2(DEPTH)-1:0] waddr //深度对2取对数,得到地址的位宽。
,input [WIDTH-1:0] wdata //数据写入
,input rclk
,input renc
,input [$clog2(DEPTH)-1:0] raddr //深度对2取对数,得到地址的位宽。
,output reg [WIDTH-1:0] rdata //数据输出
);
reg [WIDTH-1:0] ram1 [0:DEPTH-1];
//write data
always @(posedge wclk) begin
if (wenc) begin
ram1[waddr] <= wdata;
end
end
//read data
always @(posedge rclk) begin
if (renc) begin
rdata <= ram1[raddr];
end
end
// reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1];
// always @(posedge wclk) begin
// if(wenc)
// RAM_MEM[waddr] <= wdata;
// end
// always @(posedge rclk) begin
// if(renc)
// rdata <= RAM_MEM[raddr];
// end
endmodule
/**********************************SFIFO************************************/
module sfifo#(
parameter WIDTH = 8,
parameter DEPTH = 16
)(
input clk ,
input rst_n ,
input winc ,
input rinc ,
input [WIDTH-1:0] wdata ,
output reg wfull ,
output reg rempty ,
output wire [WIDTH-1:0] rdata
);
parameter addr_width = $clog2(DEPTH);
reg [addr_width:0] waddr, raddr;
//wirte waddr
always @ (posedge clk, negedge rst_n) begin
if(!rst_n) begin
waddr <= 'b0;
end
else begin
waddr <= (winc & ~wfull) ? waddr + 'b1 : waddr;
end
end
//wirte raddr
always @ (posedge clk, negedge rst_n) begin
if(!rst_n) begin
raddr <= 'b0;
end
else begin
raddr <= (rinc & ~rempty) ? raddr + 'b1 : raddr;
end
end
//judge
always @ (posedge clk, negedge rst_n) begin
if(!rst_n) begin
wfull <= 'b0;
rempty <= 'b0;
end
else begin
wfull <= {~waddr[addr_width],waddr[addr_width-1:0]} == raddr;
rempty <= waddr == raddr;
end
end
//例化
dual_port_RAM #(
.WIDTH(WIDTH),
.DEPTH(DEPTH)
) ram_inst(
.wclk(clk),
.rclk(clk),
.wenc(winc & ~wfull),
.renc(rinc & ~rempty),
.waddr(waddr[addr_width-1:0]),
.raddr(raddr[addr_width-1:0]),
.wdata(wdata),
.rdata(rdata)
);
endmodule

