原创 基于FPGA的跨时钟域信号处理——同步设计的重要

2009-7-24 22:56 7432 11 15 分类: FPGA/CPLD

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


    上次提出了一个处于异步时钟域的MCUFPGA直接通信的实现方式,其实在这之前,特权同学想列举一个异步时钟域中出现的很典型的问题。也就是要用一个反例来说明没有足够重视异步通信会给整个设计带来什么样的危害。


    特权同学要举的这个反例是真真切切的在某个项目上发生过的,很具有代表性。它不仅会涉及使用组合逻辑和时序逻辑在异步通信中的优劣、而且能把亚稳态的危害活生生的展现在你面前。


    从这个模块要实现的功能说起吧,如图1所示,实现的功能其实很简单的,就是一个频率计,只不过FPGA除了脉冲采集进行计数外,还要响应CPU的控制。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


点击看大图


图1 功能模块



CPU的控制总线是指一个片选信号和一个读选通信号,当二者都有效时,FPGA需要对CPU的地址总线进行译码,然后把采样脉冲值送到CPU的数据总线上。



点击看大图


图2 CPU读时序


对于这样“简单”的功能,不少人可能会给出类似下面的以组合逻辑为主的实现方式:


input clk;


input rst_n;


 


input pulse;


input cs_n;


input rd_n;


input[3:0] addr_bus;


output reg[15:0] data_bus;


 


reg[15:0] counter;


 


always @(posedge pulse or negedge rst_n)


         if(!rst_n) counter <= 16'd0;


         else if(pulse) counter <= counter+1'b1;


 


 


wire dsp_cs = cs_n & rd_n;


 


always @(dsp_cs or addr_bus)


         if(dsp_cs) data_bus <= 16'hzzzz;


         else begin


                   case(addr_bus)


                            4'h0: data_bus <= counter;


                            4'h1: ……;


                            ……


                            default: ;


                            endcase


         end


    咋一看,可能你会觉得这个代码也没什么问题,功能似乎都实现了。而且你会觉得这个代码简洁,也不需要耗费多少逻辑就能实现。但是,对于这种时钟满天飞的设计,存在着诸多亚稳态危害爆发的可能。脉冲信号和由CPU控制总线产生的选通信号是来自两个异步时钟域的信号。它们作为内部的时钟信号时,一个写寄存器counter,一个读寄存器counter。那么,很明显的,存在着发生冲突的可能。换句话说,如果寄存器正处于改变状态(被写)时被读取了,问题就随着而来,如图3所示。



点击看大图


图3 数据冲突


    脉冲信号pulseCPU读选通信号cpu_cs是异步信号,pulse什么时候出现上升沿和cpu_cs什么时候出现下降沿是不可控的。所以,如果它们很不幸的一起触发了,那么,结果可想而知。计数器counter[15:0]正在加一,这个自增的过程还在进行中,CPU数据总线data_bus[15:0]来读取counter[15:0],那么到底读取的值是自增之前的值还是自增之后的值呢?或者是其它的值呢?


   所示,它是一个计数器的近似模型。当计数器自增一的时候,如果最低位为0,那么自增的结果只会使最低位翻转;当最低位为1,那么自增一的后果除了使最低位翻转,还有可能使其它任何位翻转,比如4’b1111自增一的后果会使4个位都翻转。由于每个位之间从发生翻转到翻转完成都需要经过一段逻辑延时和走线延时,对于一个16位的计数器,要想使这16位寄存器的翻转时间一致,那是不可能做到的。所以,对于之前的设计中出现了如图3的冲突时,被读取的脉冲值很可能是完全错误的。


9b407081-246c-49e0-b0f7-632c6401c11d.jpg



4 计数器模型


    上面的代码是最典型的组合逻辑实现方式,是很不可行的。也许很多朋友会提出异议,也许还会提出很多类似的组合逻辑方案。但是,如果没有同步设计的思想,不把这两个异步时钟域的信号同步到一个时钟域里进行处理,冲突的问题在无法得到有效解决的。


    那么,这个设计该如果同步呢?实现的方案其实上一次提到FPGAMCU通信的博文里已经给出了答案。它的设计思想可以如图5所示。图5先是使用脉冲检测法把脉冲信号与系统时钟信号clk同步,然后依然使用脉冲检测法得到一个系统时钟宽度的使能脉冲作为数据锁存信号,也将CPU的控制信号和系统时钟信号clk同步了。如此处理后,两个异步时钟域的信号就不存在任何读写冲突的情况了。



点击看大图


图5 同步处理


    这里提出来的解决方案就是使用了脉冲检测法进行同步,还有一些其它的同步方式,譬如专用握手信号同步、异步FIFO等等。


 


 

PARTNER CONTENT

文章评论4条评论)

登录后参与讨论

用户1774126 2015-7-29 20:39

非常好!

用户430586 2013-3-22 11:02

我用百兆的状态试过,收发都没有问题,基本上觉得就没有问题了,我用的de2-115的板子,应该和您的一样,不过我没有设置set-input-delay的约束,是不是找个原因呢?可是我在phy的loopback模式下用了set-input-delay也是ff-rx-data端口没有数据。已经弄了快一个月了,还是没有弄成

ilove314_323192455 2013-3-20 19:29

RGMII和ff_rx_data中间隔着MAC层,你需要确认MAC的初始配置正确

用户1611496 2013-3-19 22:43

感激当初你卖我开发板带我走进FPGA的殿堂;现在的我已经在社会中从事FPGA开发工作,而牛逼闪闪的你已经是国内的专家;我现在从事光网,交换,总线等开发工作,有兴趣可以留个邮箱交流一下experienceop@163.com

用户430586 2013-3-19 15:54

我在做的时候,发送没有问题,接收的时候,mac端的rgmii借口的数据用signaltapII采样时对的,但是ff_rx_data端却是错的,能指点下么?或者,可以看下您的工程么?

用户179261 2009-8-5 20:46

特权同学,不知道能不能和你交流下关于时序的问题,有关TimeQuest的,不知道能否私下向你学习下!我的QQ:283617050,不知道能否加为好友,谢谢了!

ilove314_323192455 2009-7-31 18:59

到小组里去下载,该有的资料都会传到那里

用户563816 2009-7-31 11:48

特权同学,放心吧,我一定会把你博客里面的东西全都剥削掉的。哈哈,很多都是我即将要学习的,以后有问题请教啊。特别是最近的SDRAM的问题,正在看三星的芯片时序资料,有类似比较好的资料么。能发到我邮箱不?shitao.zheng@yahoo.com.cn
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
我要评论
4
11
关闭 站长推荐上一条 /3 下一条