异步fifo读写同步的设计分析_第1页
异步fifo读写同步的设计分析_第2页
异步fifo读写同步的设计分析_第3页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程论文(设计)题 目院 系电子与信息工程学院专 业 电子与通信工程学生姓名卢兴森学 号 20132281370指导教师刘建成二O 四年元月三日1.1指针以及满空信号的产生 11.2二进制指针和格雷码指针的同步 21.3保守的满空判断 31.4二进制指针和格雷码指针的比较 4二程序及其介绍 4三仿真结果图 13四总结 14一异步FIFO的介绍使用FIFO同步源自不同时钟域的数据是在数字IC设计中经常使用的方法, 设计功能正确的FIFO会遇到很多问题,探讨了两种不同的异步FIFO的设计思路。 两种思路都能够实现功能正确的 FIFO。本文所研究的FIFO,从硬件的观点来看,就是一块数据内存。它有两

2、个端口, 一个用来写数据,就是将数据存入 FIFO;另一个用来读数据,也就是将数据从 FIFO当中取出。与FIFO操作相关的有两个指针,写指针指向要写的内存部分, 读指针指向要读的内存部分。FIFO控制器通过外部的读写信号控制这两个指针 移动,并由此产生FIFO空信号或满信号。对于异步FIFO而言,数据是由某一个时钟域的控制信号写入FIFO,而由另一个时钟域的控制信号将数据读出 FIFO。也就是说,读写指针的变化动作是由 不同的时钟产生的。因此,对 FIFO空或满的判断是跨时钟域的。如何根据异步 的指针信号对FIFO的满状态或空状态进行正确的判断是本文研究的重点。此外,设计过程中的一些细节问题

3、也将在文中涉及到。1.1指针以及满空信号的产生为了更好地说明问题,先探讨一下同步FIFO指针移动以及满空信号的产生过程。对于同步FIFO,读写指针都指向一个内存的初始位置,每进行一次读写 操作,相应的指针就递增一次,指向下一个内存位置。当指针移动到了内存的最 后一个位置时,它又重新跳回初始位置。在FIFO非满或非空的情况下,这个过程将随着读写控制信号的变化一直进行下去。如果FIFO处于空的状态,下一个读动作将会导致向下溢出(underflow),个无效的数据被读人;同样,对于一 个满了的FIFO,进行写动作将会导致向上溢出(overflow),一个有用的数据被 新写入的数据覆盖。这两种情况都属

4、于误动作,因此需要设置满和空两个信号, 对满信号置位表示FIFO处于满状态,对满信号复位表示FIFO非满,还有空间可 以写入数据;对空信号置位表示FIFO处于空状态,对空信号复位表示FIFO非空, 还有有效的数据可以读出。当读指针和写指针相等也就是指向同一个内存位置的时候, FIFO可能处于满 或空两种状态。可以通过不同的方法判断或区分 FIFO究竟是处于满状态还是空 状态,也就是究竟是写指针从后赶上了读指针,还是读指针从后赶上了写指针。本文所应用的方法是设置一个额外的状态位,指针由它的地址位以及状态位组 成。地址位随着相应的操作递增,指针由内存的最后位置返回到初始位置的时候 状态位取反。因此

5、,当读写指针的地址位和状态位全部吻合的时候,读写指针经历了相同次数的循环移动,也就是说,FIFO处于空状态;如果读写指针的地址 位相同而状态位相反,写指针比读指针多循环一次,标志FIFO处于满状态。(2) 二进制指针可以用于任意大小的 FIFO;格雷码指针只能用于大小为2的幕的 FIFO。1.2二进制指针和格雷码指针的同步二进制指针(如图1)是由一位状态位和若干位二进制编码的地址位组成的(例如由三位地址和一位状态位构成的指针的变化:000"0001001" 0011010" 01010110 0111100" 10011010 1011 11001101

6、11101111)。如果在不同的时钟域内直接同步二进制指针,有可能产生问题。例如,当读指针从0111向1000变化的时侯,指针所有的位都要 变化,如果写时钟恰好在读指针的变化时刻采样,写者得到的读指针值有可能是 从0000到1111中的任何一个。所以二进制指针不宜被直接同步, 但可以通过一 对握手信号同步二进制指针。图1例如,读指针被读者存人一个寄存器时,读者就发出一个就绪信号。当写者 看到就绪信号时,读取读指针,发出一个收到数据的确认信号。当读者看到确认 信号时,就收回就绪信号,然后用当前的读指针值刷新寄存器。 在收到确认信号 前,存放读指针的寄存器内容保持不变,确保了被读取的指针的正确性。

7、 为了能够在不同的时钟域内直接同步指针,可以对指针使用格雷码的编码方式, 也就是指针每次移动只变化一位,这样就避免了由于指针多位同时变化而无法直 接同步的问题。图3表示了一个三位地址的内存用于格雷码编码的FIF0°n位地址的内存需要n+1位的格雷码。使用最高位(也就是第n-1位)作为状态位,从第 n2到第0位作为地址的第n-2位到第0位;对状态位(也就是第n-1位)和第 n-2位进行位异或运算产生地址的第 n-2位(也就是地址的最高位)。通过对图3 的观察可以得知,四位格雷码编码的指针和三位二进制加状态位编码的指针具有 同样的功能:指针产生的地址循环遍历8个内存地址,每一次遍历后状态

8、位取反。 值得注意的一点,是当指针从0100变化到1100的时候,相应的地址由100变为 000,状态位和一位地址同时发生了变化,所以不能同步由另一个时钟域格雷码 指针产生的状态位和地址位,此时应该直接由另一个时钟域同步指针来完成,由 同步后的指针产生相应的状态位和地址位。1.3保守的满空判断对于异步FIFO设计,无论是采用握手还是直接同步的方法来获取对方时钟 域的指针,对满空信号的判断总是“保守”的。(1)满空信号的复位(满信号复位表示FIFO非满,空信号复位表示FIFO非空)和实际FIFO的情况相比有一定的延迟。例如,空信号是由读者用读指针与同步 或握手后得到的写指针进行比较产生的。由于同

9、步或握手需要一定的时间,在这段时间,写者可能向FIFO写入新的数据,写指针发生了变化,此时FIFO已经非 空,但此刻空信号仍然没有复位。对于写者而言,满信号的复位也会遇到相同的 问题。不过,在通常情况下,FIFO只要确保不会向下溢出或向上溢出,复位的延迟就不会导致向下溢出或向上溢出,是可以接受的。(2)满空信号的置位(满信号置位表示FIFO满,空信号置位表示FIFO空)和 FIFO的实际情况相比没有延迟。例如,同样考虑 FIFO为空的情况,读者使用读 指针和同步或握手后的写指针进行比较,由于 FIFO为空,写动作不会发生,相 应的写指针也保持不变,因此读者获得的就是当时的写指针值。 这样就能马

10、上对 空信号置位。同样地,在FIFO满的情况下,由于读指针不发生变化,写者得到 的是当前的读指针值,能够马上判断 FIFO为满。从以上两点的讨论可以得出结论,FIFO满空判断是保守的,写者可能在FIFO 还有一定空间时停止写数据,但不会在 FIFO已经满了的情况下继续写数据;读 者可能在FIFO还有一些有效的数据时停止读数据,但是不会在FIFO已经空的情 况下继续读数据。保守的满空判断能够满足 FIFO的功能要求。1.4二进制指针和格雷码指针的比较二进制指针和格雷码指针两者各有优缺点:(1)由于通过握手同步,指针可以有多位同时变化,二进制指针每次移动可以跳跃过任意的长度,这样给FIFO的某些功

11、能的实现带来了方便(例如,硬件直 接控制FIFO从缓存的数据流中丢弃一个出错的包);而格雷码指针一般只能做递 增或递减的移动。(2)与直接同步相比,通过握手同步需要多时钟周期,因此二进制指针的满空判断比格雷码指针的满空判断更“保守”; 对于设计一个容量很大且由内存构 成的FIFO来说,由于保守判断而损失的空间可以忽略;但对于一个容量较小的 FIFO而言,这种“保守”可能是无法接受的。例如,一个由8个寄存器组成的FIFO,对于格雷码编码的指针,最坏情况下,FIFO被写者判断为满时,里面实际只存有五个数据(使用两级同步器,可能需要三个周期同步,而在这三个周期 内都有读动作发生);而对与二进制编码的

12、指针,FIFO被判为满时,FIFO里可能 只有三个数据或更少(使用两级同步器,最好的情况下,需要五个周期握手,而 在这五个周期里都有读动作发生)。设计者在两种方法的比较选择上应该考虑到以上的几点。本文介绍的异步FIFO的设计方法的两种不同尽路都能够实现功能正确的异 步FIFO。对这两种方法设计的FIFO的优缺点所做的简要分析,对 FIFO的设计 具有指导意义。国程序及其介绍该fifo缓冲器输入信号为10 khz,输出信号为20khz,可实现输入结束时输出同时结束;程序分为二部分,顶层文件fifo4080 为控制部分,fifo 为异步缓冲fifo程序具体如下图2;El O xq6slx75-2c

13、s484® fifo4080 - Behavioral (fifo40B0fvhd阴 u - fifo - Behavioral (fiio.,vhd其fifo系统总体设计框图图3如下:winewelkwrst nwineWflillFIFOwptr&fullwddrrdatawcllkenFIFO Memory (DuM Port RAM)waddrraddrwarfdrroddrwptrrptrwr nrclkrrst nFIFO rptr & etTiply raddrwptr wmc本程序的使用xilinx ise11.4软件进行设计,仿真使用其自带的test

14、bench ;Fifo4080系统顶层框图图4如下:din(7:G)Ffifo1rdclkidclkdOut(7:0)rstrstemptyemptywrclkwrclkfullfullwrenwren| rdetikAU1图4Fifo4080程序如下library IEEE;-Uncomment the following library declaration if using-arithmetic functions with Signed or Un sig ned values-Uncomment the following library declaration if instan

15、tiating -any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VCompo nen ts.all;en tity fifo4080 isgen eric (w:i nteger:=1024;k:i nteger:=8 );复位高电平有效,port( rst,wrclk,rdclk,wre n: in stdo gic;-clk上升沿有效,使能端低电平有效din:in std_logic_vector(k-1 downto 0);dout:out std_logic_vector(k-1 downto 0);ful

16、l,empty:out std_logic);end fifo4080;architecture Behavioral of fifo4080 issignal count:integer range 0 to w-1; signal rden:std_logic:='1'component fifo generic (w:integer:=1024;k:integer:=8);port( rst,wrclk,rdclk,wren: in std_logic;-复位高电平有效, clk 上升沿有效,使能端低电平有效din:in std_logic_vector(k-1 down

17、to 0);dout:out std_logic_vector(k-1 downto 0); full,empty:out std_logic;rden:out std_logic;count:out integer range 0 to w-1);end component;beginu1:fifogeneric map(w=>w,k=>k)port map (rst=>rst,wrclk=>wrclk,rdclk=>rdclk,wren=>wren,din=>din,dout=>dout,full=>full,empty=>emp

18、ty,rden=>rden,count=>co unt);process(count)begin if(count>=512) then rden<='0'elserden<='1'end if;end process;end Behavioral;异步缓冲器 fifo 文件程序如下entity fifo is generic (w:integer:=1024;k:integer:=8复位高电);port( rst,wrclk,rdclk,wren: in std_logic;-平有效, clk 上升沿有效,使能端低电平有效 din

19、:in std_logic_vector(k-1 downto 0); dout:out std_logic_vector(k-1 downto 0); full,empty:out std_logic;rden:out std_logic;count:out integer range 0 to w-1);end fifo;architecture Behavioral of fifo istype memory is array (0 to w-1) of std_logic_vector (k-1 downto0);signal ram:memory;signal wradd,rdadd

20、: integer range 0 to w-1;signal infull,inempty:std_logic;signal rdens:std_logic;-signal cnen:std_logic;beginprocess(wrclk) - 写数据beginif (wrclk'event and wrclk='1') thenif (wren='0' and infull='0') thenram(wradd) <= din;end if;end if;end process;process(rst,wrclk)-写地址修改

21、beginif (rst='1') thenwradd<=0;elsif (wrclk'event and wrclk='1') then if (wren='0' and infull='0') then if(wradd=w-1) then wradd<=0;elsewradd<=wradd+1;end if;end if;end if;end process;process (rst,rdclk)-读地址修改beginif(rst='1') thenrdadd<=w-1;els

22、if (rdclk'event and rdclk='1') thenif (rdens='0' and inempty='0') thenif(rdadd=w-1) thenrdadd<=0;else rdadd<=rdadd+1;end if;end if;end if;end process;process (rst,rdclk)-empty产生beginif(rst='1') theninempty<='1'elsif (rdclk'event and rdclk='

23、;1') thenandif (rdadd=wradd-2 or(rdadd=w-1 and wradd=1)or(rdadd=w-2 wradd=0)and(rdens='0') theninempty<='1'elseinempty<='0'end if;end if;end process;process (rst,wrclk)-full产生beginif(rst='1') theninfull<='0'elsif (wrclk'event and wrclk='1&

24、#39;) thenif (rdadd=wradd and wren='0') then infull<='1'elseinfull<='0'end if;end if;end process;process(wrclk) - 计数variable counter:integer range 0 to w-1; beginif (wrclk'event and wrclk='1') and rst='0') then if (wren='0' and infull='0&

25、#39;) thencounter:=counter+1;end if;end if;if(counter>=512) thenrdens<='0'end if;if(counter=1024) or (rst='1') thencounter:=0;rdens<='1'end if;count<=counter;end process;dout<=ram(rdadd);full<=infull;empty<=inempty;rden<=rdens;end Behavioral;在上述程序综合成功后, 可在 ise 中新建 testbench 程序,在新建程序 test 的末端输入下列仿真时序程序即可进行仿真。仿真 testbench 程序如下u1 :processbeginwrclk <= '0'wait for 50 ns;wrclk <= '1'wait for 50 ns;end process;u2 :processbe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论