找回密码
 注册
关于网站域名变更的通知
查看: 339|回复: 3
打印 上一主题 下一主题

FPGA中对异步信号的处理

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-23 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
最常用的约束有IO管脚位置约束和电平幅度约束,这个很好理解。另外,就是对时钟网络约束。这个是很重要的。比如你的系统中,驱动的电路的时钟是27M的,那么你需要在约束文件中增加类似如下的约束语句7 l# D; w% Y# \1 z
NET REF_CLK27M TNM_NET = REF_CLK27M_grp;
; o( J$ E/ a9 N3 X! J  ]TIMESPEC TS_REF_CLK27M = PERIOD REF_CLK27M_grp : 37ns HIGH 50 %;# @6 M% {( o2 \0 |$ k
这样的话,工具在布线的时候,就会知道这个时钟所驱动的所有网络必须满足至少27M速度的要求,占空比为50%。它会任意布线,就有可能出现信号翻转的很慢,或者延时很长,建立时间保持时间不足,在实际中造成timing错误。一般来说,十几兆以上的时钟网络最好都加类似的约束,在时钟上就可以了,工具会帮你把它所驱动的所有网络都加上约束的。
% E4 S  {$ E) l, L! p  w: A另外,常用的约束还有delay,skew等,具体的你可以到Xilinx网站上下载专门有关Constains的文档学习一下。/ ?) S, n& a5 o+ O5 m
我们将问题分解为2部分,来自同步时钟域信号的处理和来自异步时钟域信号的处理。前者要简单许多,所以先讨论前者,再讨论后者。7 q. v) ~7 K0 O- a

- {- o5 v; S+ ~0 l, H1.同步时钟域信号的处理. M0 f- K) r" A
一般来说,在全同步设计中,如果信号来自同一时钟域,各模块的输入不需要寄存。只要满足建立时间,保持时间的约束,可以保证在时钟上升沿到来时,输入信号已经稳定,可以采样得到正确的值。但是如果模块需要使用输入信号的跳变沿(比如帧同步信号),千万不要直接这样哦。
; v$ t7 R/ V5 {always @ (posedge inputs). r# p; ?2 h  y2 M6 u
begin
& x% K8 n7 |2 m+ E8 A0 Z  V& @6 Y...: |. [( S. y; a2 M
end2 l& _% E4 i" V& C( m3 `9 U' n6 F. }
因为这个时钟inputs很有问题。如果begin ... end语句段涉及到多个D触发器,你无法保证这些触发器时钟输入的跳变沿到达的时刻处于同一时刻(准确的说是相差在一个很小的可接受的范围)。因此,如果写出这样的语句,EDA工具多半会报clock skew > data delay,造成建立/保持时间的冲突。本人曾经也写出过这样的语句,当时是为了做分频,受大二学的数字电路的影响,直接拿计数器的输出做了后面模块的时钟。当初用的开发工具是max+plusII,编译也通过了,烧到板子上跑倒也能跑起来(估计是因为时钟频率较低,6M,但后来拿到QuartusII中编译就报clock skew > data delay。大家可能会说分频电路很常见的啊,分频输出该怎么用呢。我一直用的方法是采用边沿检测电路,用HDL语言描述大概是这样:; p' X/ F! y- V2 B1 L
always @ (posedge Clk)   R$ Y/ Z. q5 L1 Y6 ~
begin/ s, F/ p; ?( M  J
inputs_reg <= inputs;
' m7 l' L% m# |/ w& O4 Hif (inputs_reg == 1'b0 && inputs == 1'b1)5 x# n3 n- |$ e( F) S$ Y
begin! ^7 r( s7 Q* W( q. t' L4 J9 k
...6 Z* R2 |$ Q5 \1 U, N' L% L: _
end
2 e) c1 E0 r: e0 Z7 n! I...1 I9 h3 |* T) y
end
* p5 u! H+ r) }" `3 @这是上跳沿检测的电路,下跳沿电路大家依此类推。: C4 f  d  v  ^) T+ G
8 T/ L8 [% A5 P  M# }3 _1 R
2.异步时钟域信号的处理! o' f; u7 K4 y: `) q
这个问题也得分单一信号和总线信号来讨论。
0 Y5 c& `/ V1 X9 w. }/ s
' }9 F6 ~0 S$ G2.1单一信号(如控制信号)的处理* r' C4 {' r2 T8 C% G! {4 D
如果这个输入信号来自异步时钟域(比如FPGA芯片外部的输入),一般采用同步器进行同步。最基本的结构是两个紧密相连的触发器,第一拍将输入信号同步化,同步化后的输出可能带来建立/保持时间的冲突,产生亚稳态。需要再寄存一拍,减少(注意是减少)亚稳态带来的影响。这种最基本的结构叫做电平同步器。0 X. q* c5 p: ^/ K1 d& q

4 B6 {6 P6 {9 _( ^9 b如果我们需要用跳变沿而不是电平又该怎样处理呢,还记得1里面讲的边沿检测电路么?在电平同步器之后再加一级触发器,用第二级触发器的输出和第三级触发器的输出来进行操作。这种结构叫做边沿同步器。0 k9 b* k5 }+ l$ i, F- ^
always @ (posedge Clk) " F, @! g$ K% [
begin
6 E7 L8 i6 {6 s% x8 M2 Linputs_reg1 <= inputs;
6 q7 c+ F. m! n  Ninputs_reg2 <= inputs_reg1;
% G$ [9 {) m6 j; o! v8 ninputs_reg3 <= inputs_reg2;
5 [, w1 K3 a7 L7 Q# bif (inputs_reg2 == 1'b1 && inputs_reg3 == 1'b0): W* t- A7 ]2 V: K
begin6 @& P& L. T, P, C1 n. [/ L9 A7 |% F0 x
.... @& l- I& I# F% y7 r
end$ k! ^& P3 x' @
...1 g, t. T6 ], p& q. |+ Y. |% H. r7 T
end
" P# y5 G. E2 \: W# J  ~4 m) `4 `0 d/ `
以上两种同步器在慢时钟域信号同步入快时钟域时工作的很好,但是反过来的话,可能就工作不正常了。举一个很简单的例子,如果被同步的信号脉冲只有一个快时钟周期宽,且位于慢时钟的两个相邻跳变沿之间,那么是采不到的。这时就需要采用脉冲同步器。这种同步器也是由3个触发器组成,同时需要对发送信号做一些处理,具体结构大家可以在网上搜。- M, O) F3 O) O; E. S8 a

6 q: X7 L5 `0 y* X7 U3 A2.2总线信号的处理
8 Y! T& X# h3 Q& c3 n  V7 J如果简单的对异步时钟域过来的一组信号分别用同步器的话,那么对这一组信号整体而言,亚稳态出现的几率将大大上升。基于这一观点,对于总线信号的处理可以有两种方式。
7 f/ m2 s  W! j# a; ^+ u9 W  q1 j4 L
如果这组信号只是顺序变化的话(如存储器的地址),可以将其转换为格雷码后再发送,由于格雷码相邻码字只相差一个比特,上面说的同步器可以很好的发挥作用。! h) L/ Q8 R/ K' O% P& L+ T

2 s7 ?* }8 |" y8 O3 W' \5 j1 `/ E但是如果信号的变化是随机的(如存储器的数据),这种方法便失效了,这时可以采用握手的方式或者采用FIFO或DPRAM进行缓存。RAM缓存的方式在突发数据传输中优势比较明显,现在高档一点的FPGA中都有不少的BlockRAM资源,且支持配置为DPRAM或FIFO,这种处理方法在通信电路中非常常用。
& s/ I$ |) O5 f5 P$ t' `  u6 p* S

该用户从未签到

2#
发表于 2021-9-23 11:07 | 只看该作者
最常用的约束有IO管脚位置约束和电平幅度约束,这个很好理解( d: X/ T+ t. M1 Z& C$ a

该用户从未签到

3#
发表于 2021-9-23 11:22 | 只看该作者
如果这组信号只是顺序变化的话(如存储器的地址),可以将其转换为格雷码后再发送,由于格雷码相邻码字只相差一个比特,上面说的同步器可以很好的发挥作用
6 E6 Z; x) ]! T* }

该用户从未签到

4#
发表于 2021-9-23 13:16 | 只看该作者
一般来说,在全同步设计中,如果信号来自同一时钟域,各模块的输入不需要寄存0 d4 P, z  a; e* B8 q- S8 t$ y! W
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-30 13:11 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表