基于FPGA的异步跨时钟域设计
2020-03-24胡成辉
黄 琳,王 新,胡成辉
(南京赛宝工业技术研究院,江苏 南京 210000)
0 引言
随着数字化时代的发展,FPGA的应用越来越广泛,在航空航天,雷达电子,汽车等领域中发挥了重要作用。国际的FPGA公司XILINX、ALTERA等所出产的FPGA芯片容量也越来越大,各个行业的FPGA设计师在使用时会出现各种各样的问题。跨时钟域设计是各设计师必然会碰到的问题[1]。由于跨时钟的异步系统内含有多个时钟源,它们存在频率和相位的差异,当他们用作寄存器的输入时钟时就可能违背建立时间和保持时间的要求,出现亚稳态的现象[2]。
针对跨时钟域设计中出现的问题,设计了一种基于底层FPGA硬件架构为核心的FPGA跨时钟域设计,能够让设计师在进行FPGA设计时充分理解程序在芯片上运行的过程,避免时序错误。
1 跨时钟域系统
在FPGA的设计中,任何信号均需满足“建立时间”和“保持时间”两个参数。“建立时间”是指在时钟沿到来之前,触发器输入信号必须保持稳定的时间。“保持时间”则是指在时钟沿之后,信号必须要保持稳定的时间。如果输入信号不满足这个规则,触发器的输出信号则会进入亚稳态。
在跨时钟域的设计中,时钟域A信号的翻转时间和时钟B没有必然的联系,则该信号进入时钟域B内的触发器时就有可能不满足建立时间和保持时间的规则,由此出现时序程序运行不稳定、出现亚稳态等现象。
如图1所示的verilog程序。
图1 跨时钟域程序
图1中的verilog代码中,clk_en信号为来自另一个时钟域的使能信号,cnt_en为本时钟域的控制信号,其功能仿真结果如图2所示。
图2 功能仿真图
2 FPGA底层实现
在图1中的例子中,期望的底层实现为:CE=clk_en&cnt_en;
R=rst|(~clk_en).
如图3所示,信号通过与门和或门实现信号的使能和复位,最后进行输出。而实际FPGA底层运行的硬件架构如图4所示。
图3 期望的跨时钟域底层实现图
图4 实际跨时钟域底层信号实现图
CE=~(clk_en&~(cnt_en))=(~clk_en)|cnt_en;
D=clk_en(Q+1):0
由于FPGA底层布局布线和所期望的布局布线不同,造成实际运行时产生了亚稳态的现象,具体到现象上,便会出现程序偶尔正常,偶尔不正常的现象出现。
3 亚稳态产生原因分析
当异步信号clk_en拉起的时候,由于clk_en的上升沿到达时间是clk上升沿之前较长时间,由clk_en经过组合逻辑产生的寄存器的使能FF_CE和数据FF_D的变化都满足建立时间和保持时间,此时,输出的结果符合预期,如图5所示。
图5 程序正常时的时序图
若当clk_en拉起时,clk_en的上升沿到达时间是CLK上升沿之前较短时间,并且由于寄存器使能FF_CE的延时较大,晚于CLK上升沿到达寄存器,再者由于寄存器数据FF_D的延时较小,早于CLK上升沿到达寄存器。此时在clk_en的上升沿便会出现一个不希望的计数值。如图6所示。
图6 程序异常时的时序图
通过上面的分析,可以看出,出现该问题的原因是同时满足了几个条件,1)clk_en为跨时钟域信号,无法保证其到达时间;2)实际的寄存器CE信号在clk_en为低时为高电平,不是期望的低电平;3)FF_CE的延时长,FF_D的延时短。
由于以上原因,造成在clk_en这个跨时钟域信号来时无法满足建立时间和保持时间,造成亚稳态的产生。
4 修改及实现
由上节中的分析可知,当跨时钟域信号来时,若不进行处理,则无法保证不出现时序问题。针对该段程序的处理方法为避免对跨时钟域信号的直接使用,采用同步复位的方式,并且恰当调整分支语句的写法,使FPGA底层布局布线能够按照期望的进行,修改后的程序如下所示。
图7 修改后程序
FPGA底层实现框图如图8所示。
如图8所示,修改后的程序不会出现由于clk_en为低的时候,寄存器CE为高电平,不是期望的低电平,因此不会出现亚稳态的现象。
图8 FPGA底层实现框图
5 结论
跨时钟域问题在复杂的FPGA设计中是必不可少的。对于跨时钟域的设计,一般的设计师仅根据verilog语言的逻辑进行程序编写,这样容易造成在FPGA进行布局布线时不会按照期望的样子进行布局布线,因此,需要设计师理解底层FPGA布局布线的规则,根据其规则进行程序编写,这样可减少在跨时钟域设计过程中出现问题的概率,确保复杂FPGA设计的正确性,提高系统的可靠性。