作者:庄绪勇
边沿检测在FPGA电路设计中相当的广泛,特别是在异步时钟域的数据处理方面,将一个时钟域的数据向另一个时钟域进行转换,或者在异步通信中利用数据边沿信息进行始终数据恢复,也就是我们经常说的CDR(clock data recovery)。那么什么是边沿检测呢?
一、边沿检测
边沿检测就是检测输入信号的变化,或者FPGA内部逻辑信号的变化,即对上升沿或者下降沿的检测。在检测到所需要的边沿后输出一个脉冲。如图1,输入信号signal含有一个上升沿和一个下降沿,利用时钟Clock结合时序逻辑电路可以检测出signal的两个边沿,检测结果如输出(output)信号所示。
图1
其实这个过程非常简单,人的大脑在看到波形后很容易就能判断出signal信号的变化,这是因为我们的大脑知道什么是“变化”,而FPGA 或者CPU 不知道,需要特定的方法进行提取。那么什么是“变化”呢?对一个信号来说,当前值和它之前的值不一样,就是变化。那么我们想做变化检测,就是要对比当前信号和之前信号的值,一旦发现不一样,就输出一个高电平。
二、使用一级寄存的边沿检测电路
2、RTL 电路:
图2
3、仿真代码及结果
仿真结果:
图3
从仿真图可以看到:
1、2两次变化由于信号持续时间太短,未能完整检测输出pedge、nedge。3 ,4,5靠时钟沿太近,未能输出一个完整周期的脉冲。
对于1,2由于信号高电平持续的时间过短,没有很好的解决办法,只有使用更快的时钟进行检测。4,5是正常的检测。因此如若能正常检测信号边沿,信号的脉冲宽度应至少持续一个检测时钟的周期以上。4,5虽然在波形上反应了边沿的变化,但由于是组合逻辑电平生成的信号,波形宽度并不稳定,与时钟的上升沿与信号边沿的相位有关。图中, 3表示的位置为一个窄脉冲,情况与4,5原因一样。解决3,4,5的问题,可以利用两级寄存传递,由于在同步始终下两级寄存器有1个周期时间延迟,因此输出结果可以保证至少有一个时钟周期输出。
三、采用两级寄存的边沿检测电路设计
1、Verilog代码:
2、仿真结果:
可以看到pedge 和nedge 都是signal跳变后下一个上升沿开始输出的,输出一个周期的高电平。(pos_neg 也是,后面有连续两个高电平连到一起了)
上面的程序可能不太直观,也可以改写如下:
|
1 2 |
assign pedge = (data == 2'b01) ? 1'b1 : 1'b0; //老数据data[1]为1'b0,新数据data[0]为1'b1, 说明有上升沿来临。 assign nedge = (data == 2'b10) ? 1'b1 : 1'b0; //老数据data[1]为1'b1,新数据data[0]为1'b0, 说明有下升沿来临。 |
异或取边沿比较好理解,只要前后数据不同,说明有数据变化,因此就会有边沿产生。
四、边沿检测应用
边沿检测技术在项目中应用非常广泛。若要有效捕获信号跳变沿,边沿检测技术的应用是必不可少的。可以应用在以下几个方面
(1)利用边沿检测使能,使异步时钟同步化。即将一个时钟域的数据转换的另一个时钟域下的数据。
(2)通信接收端捕获信号的突变(UART,SPI,I2C,网络等信号使能或数据突变),可以进行数据时钟恢复。
(3)逻辑分析仪中信号的边沿检测。例如,逻辑分析仪中的上升沿触发, 下降沿触发等。
代码下载:[content_control]
[/content_control]






