同步FIFO原理剖析

上传人:飞*** 文档编号:32977554 上传时间:2018-02-13 格式:DOC 页数:12 大小:104.50KB
返回 下载 相关 举报
同步FIFO原理剖析_第1页
第1页 / 共12页
同步FIFO原理剖析_第2页
第2页 / 共12页
同步FIFO原理剖析_第3页
第3页 / 共12页
同步FIFO原理剖析_第4页
第4页 / 共12页
同步FIFO原理剖析_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《同步FIFO原理剖析》由会员分享,可在线阅读,更多相关《同步FIFO原理剖析(12页珍藏版)》请在金锄头文库上搜索。

1、一、同步 FIFO 的意思是说 FIFO 的读写时钟是同一个时钟,不同于异步FIFO,异步 FIFO 的读写时钟是完全异步的。同步 FIFO 的对外接口包括时钟,清零,读请求,写请求,数据输入总线,数据输出总线,空以及满信号。下面分别对同步 FIFO 的对外接口信号作一描述:1 时钟,输入,用于同步 FIFO 的读和写,上升沿有效;2 清零,输入,异步清零信号,低电平有效,该信号有效时,FIFO 被清空;3 写请求,输入,低电平有效,该信号有效时,表明外部电路请求向FIFO 写入数据;4 读请求,输入,低电平有效,该信号有效时,表明外部电路请求从FIFO 中读取数据;5 数据输入总线,输入,当

2、写信号有效时,数据输入总线上的数据被写入到 FIFO 中;6 数据输出总线,输出,当读信号有效时,数据从 FIFO 中被读出并放到数据输出总线上;7 空,输出,高电平有效,当该信号有效时,表明 FIFO 中没有任何数据,全部为空;8 满,输出,高电平有效,当该信号有效时,表明 FIFO 已经满了,没有空间可用来存贮数据。使用 VHDL 描述的 FIFO 将以上面的接口为基础,并且可以参数化配置 FIFO的宽度和深度。二、同步 FIFO 内部通过控制电路和 RAM 实现,控制电路主要包括写指针管理电路,读指针管理电路,以及 FIFO 状态判断电路,对于同步 FIFO 来讲,读和写的指针管理电路实

3、际上就是二进制计数器。现在的 FPGA 都具有 Block RAM,通过 VHDL 描述可以对其进行调用,为了能够实现任意深度和宽度的 FIFO,那么在用 VHDL 描述 RAM 的时候需要使用generic 使得 RAM 的调用能够参书化。同样,对于读写指针计数器,也需要参数化的描述方法。下面主要对 FIFO 的状态判断如何判断进行一些说明。假设宽度任意而深度为 8 的 FIFO,当读指针 read_pointer 和写指针 write_pointer 的值一样的时候,很显然,这时 FIFO 的状态为空。比较麻烦的是对 FIFO 是否已经满的状态的判断,因为存在两种情况,第一种情况时写指针

4、write_pointer 比读指针read_pointer 大,比如 writer_pointer = 7 而 read_pointer = 0,还有一种情况时写指针 writer_pointer 比读指针 read_pointer 小,比如writer_pointer = 2 而 read_pointer = 3。由于读写电路在循环的读写 RAM,所以在上面的两种情况下 FIFO 实际上都已经满了。那么如何对读写指针的判断比较容易的得出 FIFO 已经满了,同时这样的判断电路还要容易参数化?第一种情况下,write_pointer read_pointer = 7,实际上就是 FIFO 深

5、度减一,第二种情况下,(write_pointer + 8) read_pointer = 7,也是 FIFO 深度减一。从上面的讨论就可以很容易进行判断 FIFO 状态了,假设 FIFO 的深度用depth 表示,则 FIFO 状态判断用伪码表示如下:1 Empty 状态判断:If writer_pointer = read_pointerFIFO is empty;ElseFIFO is not empty;End if;2. Full 状态判断:If writer_pointer read_pointerIf write_pointer read_pointer = depthFIFO

6、is full;ElseFIFO is not full;End if;ElseIf write_pointer read_pointer = 1FIFO is full;ElseFIFO is not full;End if;End if;下面的框图主要描述同步 FIFO 的内部结构,画出框图有助于对电路结构的理解,同样也有助于 RTL 代码的编写三、用于实现 FIFO 的 RAM 必须是真正意义上的双口 RAM,也就是读写可以同时进行的,以前只是用 VHDL 描述过单端口的 RAM,双口 RAM 还没有描述过,不过曾经看到过 Xilinx FPGA/CPLD 的开发工具 ISE 的 Cor

7、e Genertor 好像提供双口 RAM 的软核,所以我想用 HDL 语言也就应该可以描述从而调用双口 RAM,这个等到具体写双口 RAM 的 RTL 代码的时候再研究。还有一个问题就是 FIFO 的读写请求控制信号必须要控制 FIFO 读写指针的产生电路,只有读写信号信号有效的时候,FIFO 读写指针才能是有效的,负责是无效而且要保持不变,这个容易理解。今天,就先完成写指针产生和管理电路的 RTL 代码吧,其实很简单,就是一个二进制计数器。下面就是 VHDL 的代码,大家看看有没有什么问题。- Designer : skycanny- Date : 2007-2-2- Descriptio

8、n : write_pointer is created library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity write_pointer isgeneric(depth : positive);port(clk : in std_logic;rst : in std_logic;wq : in std_logic;wr_pt : outstd_logic_vector(depth - 1 downto 0);architectur

9、e RTL of write_pointer issignal wr_pt_t : std_logic_vector(depth - 1 downto 0); - writer pointer counterbeginprocess(rst, clk)beginif rst = 0 thenwr_pt_t 0);elsif clkevent and clk = 1 thenif wq = 0 thenwr_pt_t 0);elsif clkevent and clk = 1 thenif rq = 0 and empty = 0 thenrd_pt_t rd_pt thenif (rd_pt

10、+ depth) = wr_pt thenfull clka, wr = wr, addra = addra, datain = datain, -= - -= - clkb = clkb, rd = rd, addrb = addrb, dataout = dataout );-processbeginclka = 0;wait for 13 ns;loopclka = not clka;wait for 10 ns;end loop;end process;processbeginclkb = 0;wait for 12 ns;loopclkb = not clkb; wait for 7

11、 ns;end loop; end process;processbeginwr = 1;rd = 1;wait for 24 ns;wr = 0;wait for 60 ns;rd = 0;wait for 300 ns;wr = 1;wait;end process;process(clka)beginif clkaevent and clka = 1 thenif wr = 0 thenaddra = addra + 1 after delay;end if;datain= datain + 1 after delay;end if;end process;process(clkb)beginif clkbevent and clkb = 1 thenif rd = 0 thenaddrb = addrb + 1 after delay;end if;end if;end process;end Behavioral;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号