您的位置:首页 > 其它

FIFO结构与实现

2016-04-14 23:03 337 查看
大家好!好久不见,前一段时间出差没有来得及更新Blog,小小的愧疚一下。今天,主要介绍的是Xilinx 7 Series FIFO的结构,以及代码实现。

FIFO的结构如下图所示,分为状态标志产生模块、写指针模块、双端口Ram以及读指针模块。



本文先介绍一下同步FIFO的实现方式,next time详细介绍异步FIFO。其中,同步FIFO的状态标志产生模块,主要根据写/读的指针与设定的深度/Almost Full/Almost Empty进行比较,来产生Full/Afull/Empty/Aempty的标志信号,并在FIFO出现Full和Empty时对写/读进行保护。满标志信号产生代码如下:

always @(posedge clk or posedge rst)
if (rst)
full <= 1'b0;
else
case(winc,rinc)
2'b10   : full <= (left == C_DEP - 1) ? 1'b1 : 1'b0;
2'b01   : full <= (left == C_DEP) ? 1'b0 : 1'b1;
default : full <= full;
endcase


空标志产生代码如下:

always @(posedge clk or posedge rst)
if (rst)
empty <= 1'b0;
else
case(winc,rinc)
2'b01   : empty <= (left == 1) ? 1'b1 : 1'b0;
2'b10   : empty <= (left == 0) ? 1'b0 : 1'b1;
default : empty <= empty;
endcase


同理与以上full和empty的产生过程,afull和aempty只需要改变left的判断数值就可以了。

若full和empty的时候,则需要对写和读进行保护,代码如下:

winc  = wr_en && !full;
rinc  = rd_en && !empty;


Left状态产生代码如下:

always @(posedge clk or posedge rst)
if (rst)
left <= {C_PW{1'b0}}:
else
case(winc,rinc)
2'b10   : left <= left + 1'b1;
2'b01   : left <= left - 1'b1;
default : left <= left;
endcase


写/读指针产生模块代码:

always @(posedge clk or posedge rst)
if (rst)
wr_pointer <= {C_PW{1'b0}};
else if (winc)
wr_pointer <= wr_pointer + 1'b1;

always @(posedge clk or posedge rst)
if (rst)
rd_pointer <= {C_PW{1'b0}};
else if (rinc)
rd_pointer <= rd_pointer + 1'b1;


同步FIFO的实现较为简洁,也比较理解。异步FIFO不同与同步FIFO的时,读/写端口的时钟不同,其内部比较产生状态信号的指针不同,他是将二进制指针转化为格雷码指针,然后进行比对,下一篇bolg会进行详细介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息