手撕代码——同步FIFO
module synfifo(
input clk,
input rst_n,
input rd_en,
input wr_en,
output reg full,
output reg empty,
input [7:0] datain,
output reg [7:0] dataout
);
reg [7:0] RAM_DATA [511:0];
reg [8:0] r_addr;
reg [8:0] w_addr;
reg [8:0] f_cnt;
wire rd_allow;
wire wr_allow;
assign rd_allow = rd_en && !empty;
assign wr_allow = wr_en && !full;
always @(posedge clk) begin
if(wr_allow) begin
RAM_DATA[w_addr] <=datain;
end
end
always @(posedge clk) begin
if(rd_allow) begin
dataout<=RAM_DATA[r_addr];
end
end
always @(posedge clk ) begin
if(rst_n) begin
empty <=1'b1;
end
else begin
empty <= (!wr_en) && (f_cnt[8:1]==8'b0) &&(f_cnt[0]==0 || rd_en);
end
end
always @(posedge clk ) begin
if(rst_n) begin
full <=1'b1;
end
else begin
full <= (!rd_en) && (f_cnt[8:1]==8'hff) &&(f_cnt[0]==1 || wr_en);
end
end
always @(posedge clk) begin
if(rst_n) begin
r_addr <=9'd0;
end
else if (rd_allow) begin
r_addr <=r_addr+1'b1;
end
else begin
r_addr <=r_addr;
end
end
always @(posedge clk) begin
if(rst_n) begin
w_addr <=9'd0;
end
else if (wr_allow) begin
w_addr <=w_addr+1'b1;
end
else begin
w_addr <=w_addr;
end
end
always @(posedge clk) begin
if(rst_n)
begin
f_cnt <=9'd0;
end
else if ((rd_allow && !wr_allow ) ||(!rd_allow && wr_allow))begin
if (wr_allow) begin
f_cnt<=f_cnt+1'b1;
end
else begin
f_cnt <=f_cnt-1'b1;
end
end
else begin
f_cnt <=f_cnt;
end
end
endmodule
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具