摘 要: 介绍了在激光告警系统中采用异步FIFO解决A/D数据采样与FPGA数据处理模块之间的不同速率匹配问题。在分析异步FIFO设计难点基础上,提出利用Gray码计数器作为读写地址编码,有效地同步了异步信号,避免了亚稳态现象的产生,给不同速率间的数据传输提供了一种有效的解决方案。同时采用Verilog语言描述,提高了硬件设计的可移植性,减少了系统的复杂性,提高了激光告警接收系统的可靠性。
关键词: 激光告警接收系统;异步FIFO;Gray码
快速在片激光告警接收系统中,A/D信号采样频率与FPGA中数据处理系统的工作频率往往不一致,因此在这种情况下,为避免数据丢失,需要设计一种数据缓存。本文采用VerilogHDL语言设计了一种异步FIFO(时钟周期和相位相互独立),它不仅提供数据缓冲,而且能够实现不同时钟域间的转换等功能。
1 激光告警接收系统的数据采样和处理
对于高速在片激光告警接收系统,具有较高的采样速率、低功耗、体积小以及相应的高抗干扰性能是提高其成功获取敌方激光武器有效数据的关键,而采用线性CMOS芯片和提高系统的集成度是实现小体积、低功耗的最经济、最有效的途经。本系统采用Xilinx公司Spartan-Ⅲ系列芯片XC3S1500,设计完成异步FIFO缓存,包括采集控制电路、FFT数据处理、时钟控制信号、接口电路等。激光告警接收系统的数据采样和处理框图如图1所示。
2 异步FIFO设计
异步FIFO由读、写地址逻辑,存储单元和空满标志逻辑四部分组成,如图2所示。由图2可以看出,整个系统分为两个独立的时钟域(读时钟域和写时钟域),FIFO的存储介质为一块双口RAM,可以同时进行读写操作。在写时钟域部分,由写地址逻辑生成写控制信号和写地址;在读时钟域部分,由读地址逻辑生成读控制信号和读地址。空满标志信号,由写指针和读指针通过异步比较器相互比较生成。对于异步FIFO设计主要有以下两个难点:一是如何同步异步信号,避免触发器亚稳态的产生;二是如何根据FIFO的指针信号正确地判断FIFO的空满状态[1]。
2.1 亚稳态问题的解决
在数字电路中,触发器需要满足setup/hold时间要求。当一个信号被寄存器锁存时,如果信号和时钟之间不能满足这个要求,data2端的值就是不确定的,这个过程称为亚稳态。如图3所示为常用异步时钟和亚稳态[2]。
在异步FIFO中,由于时钟之间周期和相位完全独立,因此数据的丢失概率不为零。尽管亚稳态无法彻底消除,但是可以通过下面方法将其降低到一个可以接受的范围之内。
(1)对读地址/写地址采用Gray码设计。这是因为采用二进制计数时所有位都可能变化,不利于跨时钟域的同步。例如,3位二进制数从3变到4(即011~100)时,所有位都发生了变化,而Gray码的特点是每次只有一个数据位变化。由于同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率,因此,写地址指针和读地址指针均采用Gray码计数器,可以保证一个时钟域的指针尽可能安全地被转换到另一个时钟域,有效避免了亚稳态。
(2)采用触发器来同步异步输入信号,如图4中的两级触发器,可以将出现亚稳态几率降低到一个很小的程度。
不过,使用这种方法会增加一级延时。为了充分利用FPGA器件资源,提高系统运行速度,同时有效地避免亚稳定状态,结合系统实际应用,本设计采用Gray码设计读写地址。
2.2 空满状态的判断
在异步FIFO设计中,正确地产生“空”/“满”标志是最困难的部分,主要有两个问题:(1)异步时钟域问题,由上分析可知,可采用Gray码计数器解决;(2)因为FIFO“空”/“满”都表明读/写指针相等,因此必须准确区分是读“空”还是写“满”。“空”、“满”状态的产生需要两个条件:①对方向的判定:即判定具体是写地址指针将要接近读地址指针,还是读地址指针将要接近写地址指针;②读写地址是否相等[4]。
解决办法:将FIFO地址空间按最高两位划分成4个象限,每当读/写地址相等时,通过对最高两位译码以产生正确的“空”/“满”标志。
若写指针比读指针滞后一个象限,则FIFO为“接近满”状态,此时置标志“direction”为1,并且锁存其值,相应等式为:
wire disrest_n=~((wptr[n]^rptr[n-1]))&~((wptr[n-1])^rptr[n] ))
若写指针比读指针超前一个象限,则FIFO为“接近空”状态,此时置标志“direction”为0,并且锁定其值,相应等式为:
wire dirclr_n=~((~(wptr[n]^rptr[n-1])&(wptr[n-1]^rptr[n]))∣~wrst_n
3 模块设计的Verilog实现[3-4]
3.1 存储模块RAM
为增加设计的可移植性,本设计的存储单元没有采用ISE8.1软件中的IP核,而是通过Verilog HDL语句设计一个二维数组,通过修改参数可得到相应数据宽度的输入/输出存储空间。主要语句如下:
module dp_ram(rdata,wdata,waddr,raddr,wclken,wclk);
parameter DATA_WIDTH=12;
parameter ADDR_WIDTH=10;
parameter DEPTH=1<<ADDR_WIDTH;
always @(posedge wclk)
if (wclken) MEM[waddr]<=wdata;
assign rdata=MEM[raddr];
endmodule
3.2 读/写、空/满标志逻辑模块
读写地址设计中引用了Gray码,因Gray码是一种在相邻计数之间只有一位发生变化的编码方式,用Gray码做地址计数可以消除在电路中的模糊现象,避免亚稳态。Gray码可以借助二进制计数器实现。
3.3 异步比较器
异步比较器用于判断比较读指针、写指针的大小,输出控制信号,判断存储器中数据是“接近满”还是“接近空”。其主要程序语句如下:
module async_cmp(aempty_n,afull_n,wptr,rptr,wrst_n);
always @(posedge high or negedge dirset_n or negedge dirclr_n)
if (!dirclr_n) direction <= 1'b0;
else if (!dirset_n) direction <= 1'b1;
else direction <= high;
endmodule
3.4 异步FIFO模块及RTL级硬件电路[5]
利用Verilog硬件设计描述语言,在Xilinx公司ISE 8.1软件开发环境中编译后得出如图5所示的异步FIFO模块。
采用综合工具Synplify Pro软件对该设计进行综合,得出RTL级硬件电路结果图如图6所示。
3.5 芯片资源利用
表1列出了设计高速在片激光告警接收系统的异步FIFO占用FPGA(XC3S1500)芯片内部资源的情况。由表1可知,FIFO模块完成后,还有大量的资源可以利用,因此剩余资源可用于实现FFT数据处理、采集控制、显示等功能,从而在一块芯片上完成多种功能,可有效减少激光告警接收机的体积,朝小型化发展。
4 系统波形仿真
读写时钟异步使得FIFO存储器的输入和输出数据速率不相等,在读操作时钟频率高于写操作时钟频率时,可能出现“读空”状态;当写操作时钟频率高于读操作时钟频率时,可能出现“写满”状态。在高速在片激光告警接收系统中,数据读取时钟比写时钟要高,本文选取第一种情况进行仿真。无论是“读空”还是“写空”,对于异步FIFO来说,读取的数据一定等于写入的数据。利用Modelsim SE6.0仿真软件进行仿真,其波形如图7所示。结果表明,该设计是正确的。
本文提出的FIFO设计方法解决了不同时钟域间的数据缓冲和时钟转换功能问题,避免了数据的丢失;通过运用Gray码计数器一次只变换一位的特点,有效地同步了异步信号,避免了亚稳态的产生;与二进制计数器相比,还能减少线路切换,进而减少功率的消耗[3];采用VerilogHDL语言描述设计,可移植性好、生成的硬件电路面积小、速度快、系统可靠性高。目前,该FIFO设计已经在所研制的激光告警接收系统中得到应用。
参考文献
[1] 黄平,何虎刚,徐定杰.导航接收机的非对称异步FIFO设计[J].弹箭与制导学报,2008(2):265-268.
[2] 杨军,孔兵,宋克俭,等.基于FPGA的高速异步FIFO存储器设计[J].云南大学学报(自然科学版),2007,29(6):560-565.
[3] 刘波.精通Verilog HDL语言[M].北京:电子工业出版社,2007.
[4] (美)CZLETTZ MD,著. Verilog HDL高级数字设计[M].张雅绮,李锵,等译.北京:电子工业出版社,2006.
[5] 简宏伦.精通Verilog HDL:IC设计核心技术实例详解[M].北京:电子工业出版社,2005.
本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念
本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“
课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了
@2003-2020 中国电子顶级开发网