module sfifo
#(parameter DW = 8,AW = 4)//默认数据宽度8,FIFO深度16
(
input clk,
input rst_n,
input we,
input re,
input [DW-1:0] din,
output reg [DW-1:0] dout,
output empty,
output full
);
// internal signal
parameter Depth = 1 << AW;//depth of FIFO
reg [DW-1:0]ram[0:Depth-1];
reg [AW:0] cnt;
reg [AW-1:0]wp;
reg [AW-1:0]rp;
// FIFO declaration
// 空满检测
assign empty = (cnt == 0) ? 1'b1 : 1'b0;
assign full = (cnt == Depth) ? 1'b1 : 1'b0;
// cnt 计数
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 1'd0;
else if(!empty & re & !full & we)//同时读写
cnt <= cnt;
else if(!full & we)//写
cnt <= cnt + 1;
else if(!empty & re)//读
cnt <= cnt - 1;
else
cnt <= cnt;
end
// 读指针
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
rp <= 1'b0;
else if(!empty & re)
rp <= rp + 1'b1;
else
rp <= rp;
end
//写指针
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
wp <= 1'b0;
else if(!full & we)
wp <= wp + 1'b1;
else
wp <= wp;
end
// 读操作
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
dout <= {DW{1'bz}};
else if(!empty & re)
dout <= ram[rp];
else
dout <= dout;
end
//写操作
always@(posedge clk)
begin
if(!full & we)
ram[wp] <= din;
else
ram[wp] <= ram[wp];
end
endmodule
同步FIFO-Verilog
最新推荐文章于 2021-09-24 17:08:19 发布
该博客详细介绍了FIFO(先进先出)存储器的Verilog实现,包括参数定义、内部信号、读写指针的管理以及空满检测。模块使用了8位数据宽度和16级深度,并在上升沿时钟触发读写操作。此外,博客还涵盖了读写操作的逻辑以及对空和满状态的判断。
摘要由CSDN通过智能技术生成