fpga数字电路设计基础(李桥)讲课教案.ppt

fpga数字电路设计基础(李桥)讲课教案.ppt

  1. 1、本文档共41页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

fpga数字电路设计基础(李桥)

一、同步设计

什么是同步设计?同步设计:上游数据到下游逻辑单元的传递是通过时钟来同步的。-只要能满足时延要求,就可以确保下游逻辑单元能正确采样到上游数据。异步设计:上游数据发生变化的时机是不确定的,甚至会出现中间态。-下游逻辑对上游数据的采样是不确定的,会发生数据传递的错误。

为什么要做同步设计?两年前我做的FPGA设计,现在却不能工作。FPGA本身有什么变化吗?-如果采用的是异步设计,能否工作有很多无法控制的随机因素。我的设计原来可以工作,但将FPGA重新布线后,就不行了。怎么回事?-异步设计也许在特定布线下能工作,但布线改变后就不行了。很危险吧?我的设计通过了时间仿真,但上板调试时不干活。时间仿真对不对?-对于异步设计,通过了时间仿真也不一定能正常工作。要小心,时钟信号和异步复位可别产生毛刺啊。快速FPGA中的触发器会对非常窄的毛刺信号作出反应。-异步设计可能会产生以下问题:异步设计中,设计者老要想着去消除时钟、异步复位信号以及锁存器使能端的毛刺,但这一点很困难,甚至不可能。同步设计的一个简单原则:永远不要将组合逻辑产生的信号用作时钟、异步复位/置位。

门产生的时钟有问题此例中,计数终点信号会产生毛刺,使用该信号作时钟会引起问题。-MSB布线更短,信号变化先到达与门。与门会“感知”到1111的中间态。由于与门为电平敏感,会输出高电平的毛刺,从而引起寄存器的误动作。布线更短此处会产生毛刺,并且与计数器的时钟无关MSB01111000计数器的操作为:011111111000因为MSB更快计数器flopMSB此处的与门为电平敏感

相应的VHDL代码signalCounter: std_logic_vector(3downto0);signalTC: std_logic; signalflop: std_logic;process(Clk)begin ifrising_edge(Clk)then Counter=Counter+1; endif;endprocess;TC=‘1’whenCounter=“1111”else‘0’; --TC为组合逻辑输出process(TC)begin ifrising_edge(TC)then --使用组合逻辑输出作时钟,是异步设计,禁止!!! flop=… endif;endprocess;

毛刺和同步设计组合逻辑的毛刺通常总是存在,难于甚至无法消除毛刺只有在异步设计中(连接到时钟、异步复位、锁存器的使能端)才存在问题在同步设计中,由于寄存器在时钟沿才会动作,只要能满足时延要求,就能确保采样到稳定正确的结果毛刺无法消除,但其造成的问题却可以消除采用同步设计并达到时延要求

DQ3AsyncRINPUTCLOCKCounterQ2Q1Q0DQ同步设计方法中TC的生成和使用

对照前面异步设计中TC生成和使用的例子TC

相应的VHDL代码signalCounter: std_logic_vector(3downto0);signalTC: std_logic; signalflop: std_logic;process(TC,Clk)begin ifTC=‘1’then --此复位为寄存器信号,为同步设计,可行 Counter=“0000”; TC=‘-’; elsifrising_edge(Clk)then Counter=Counter+1; ifCounter=“1110”then --注意和异步设计中TC信号的比较 --此处TC为寄存器输出 TC=‘1’; else TC=‘0’; endif; endif;endprocess;

同步设计的更多例子(可行)DQ1DTCCounterINPUTCLOCKCounterQ0INPUTCLOCKDCEQRSDATA

相应的VHDL代码例2signalCounter:std_logic_vector(3downto0);signalTC: std_logic; signals: std_logic;process(Clk)beginifrising_edge(Clk)thenifINPUT=‘1’then Counter=Counter+1; endif; ifTC=‘1’then --TC用在寄存器的CE端,为同步设计,可行 s

文档评论(0)

180****9759 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档