"); //-->
//FIFO采用四个always块处理写、读、更新读写指针、FIFO计数
module FIFO (
input [7:0] data_in,
input clk,rst,rd,wr,
output empty,full,
output reg [3:0] fifo_cnt,
output reg [7:0] data_out
);
reg [7:0] fifo_ram[0:7] ;
reg [2:0] wr_prt,rd_prt;
always@ ( posedge clk)
begin:write
if(wr&&!full)
fifo_ram[wr_prt] <= data_in;
else if( wr&&rd)
fifo_ram[wr_prt] <= data_in;
end
always @ (posedge clk)
begin :read
if(rd&&!empty)
data_out <= fifo_ram[rd_prt];
else if( rd && wr &&!empty)
data_out <= fifo_ram[rd_prt];
end
always @ (posedge clk or negedge reset)
begin : pointer
if(!rst)
begin
wr_prt <= 0;
rd_prt <= 0;
end
else
case({rd,wr})
2'b00:begin
wr_prt <= wr_prt;
rd_prt <= rd_prt;
end
2'b01:begin
if(!full)
wr_prt <= wr_prt+1;
rd_prt <= rd_prt;
end
2'b10:begin
wr_prt <= wr_prt;
if(!empty)
rd_prt <= rd_prt+1;
end
2'b11:begin
wr_prt <= wr_prt+1;
rd_prt <= rd_prt+1;
end
default:begin
wr_prt <= wr_prt;
rd_prt <= rd_prt;
end
endcase
end
always @ ( posedge clk)
begin:count
if(!rst)
fifo_cnt <= 0;
else begin
case ({wr,rd})
2'b00: fifo_cnt <= fifo_cnt;
2'b01: fifo_cnt <= (fifo_cnt==0)?0:fifo_cnt - 1;
2'b10: fifo_cnt <= (fifo_cnt==8)?8:fifo_cnt + 1;
2'b11: fifo_cnt <= fifo_cnt;
default: fifo_cnt <= fifo_cnt;
endcase
end
end
assign empty = (fifo_cnt == 0);
assign full = (fifo_cnt ==8);
endmodule
endmodule
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
[原创]初学VXWORKS,请教大虾
Analog Devices通过CodeFusion Studio 2.0简化嵌入式人工智能
声控、调光商用彩灯控制电路
3相永磁同步电机(PMSM)矢量控制
SmartPRO 5000U脱机产量控制功能
Connext Drive 4.0 将 AI 加入 SDV 通信
[求助]我装了ADS1.2,还要装ADW吗?
NXP将EIS纳入电动车电池管理
求助:win2003装不了ccs
板对板连接器市场预计到2030年将接近160亿美元
500 w灯光调变电路
油压显示电路
灯光音频控触电路
pcb电路图中的电源疑问?为啥在有的电源附近要接一些电感呢?
SmartARM2200平台专题报导
应用 V.I 晶片驱动LED I - 恒流示范
音乐彩色图电路
MC56F8006 DSC简介
SmartARM2200教学实验开发平台
电子战市场加速发展
飞思卡尔智能电表演示
安全气囊概念车展示现代汽车安全性
传罗唯仁决心转战英特尔 若成真台积电将提告退休大将
防干扰GNSS天线的进展
倒计时2天丨魏少军教授主旨报告主题、数据出炉!
Arm加入英伟达的NVLink Fusion生态系统
SmartPRO X5功能简介
通过瑞萨RA系列解决16位MCU平台的关键挑战构想
轮转调度算法
SmartPRO X8功能简介