欢迎来到天天文库
浏览记录
ID:26654640
大小:426.85 KB
页数:51页
时间:2018-11-28
《vhdl设计风格和实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、VHDL设计风格和实现内容概述一、同步设计二、速度三、资源四、其他一、同步设计什么是同步设计?同步设计:上游数据到下游逻辑单元的传递是通过时钟来同步的。-只要能满足时延要求,就可以确保下游逻辑单元能正确采样到上游数据。异步设计:上游数据发生变化的时机是不确定的,甚至会出现中间态。-下游逻辑对上游数据的采样是不确定的,会发生数据传递的错误。为什么要做同步设计?两年前我做的FPGA设计,现在却不能工作。FPGA本身有什么变化吗?-如果采用的是异步设计,能否工作有很多无法控制的随机因素。我的设计原来可以工作,但将FPGA重新布线后,就不行了。怎么回事?-异步设计也许在特定布线
2、下能工作,但布线改变后就不行了。很危险吧?我的设计通过了时间仿真,但上板调试时不干活。时间仿真对不对?-对于异步设计,通过了时间仿真也不一定能正常工作。要小心,时钟信号可别产生毛刺啊。要小心,异步复位可别有毛刺啊。快速FPGA中的触发器会对非常窄的毛刺信号作出反应。-异步设计中,设计者老要想着去消除时钟、异步复位信号以及锁存器使能端的毛刺,但这一点在异步设计中很困难,甚至不可能。异步设计可能会产生以下问题:同步设计的一个简单原则:永远不要将组合逻辑产生的信号用作时钟、异步复位/置位。门产生的时钟有问题此例中,计数终点信号会产生毛刺,使用该信号作时钟会引起问题。-MSB布
3、线更短,信号变化先到达与门。与门会“感知”到1111的中间态。由于与门为电平敏感,会输出高电平的毛刺,从而引起寄存器的误动作。布线更短此处会产生毛刺,并且与计数器的时钟无关MSB01111000计数器的操作为:011111111000因为MSB更快计数器flopMSB此处的与门为电平敏感相应的VHDL代码signalCounter:std_logic_vector(3downto0);signalTC:std_logic;signalflop:std_logic;process(Clk)beginifrising_edge(Clk)thenCounter<=Counte
4、r+1;endif;endprocess;TC<=‘1’whenCounter=“1111”else‘0’;--TC为组合逻辑输出process(TC)beginifrising_edge(TC)then--使用组合逻辑输出作时钟,是异步设计,禁止!!!flop<=…endif;endprocess;毛刺和同步设计组合逻辑的毛刺通常总是存在,难于甚至无法消除毛刺只有在异步设计中(连接到时钟、异步复位、锁存器的使能端)才存在问题在同步设计中,由于寄存器在时钟沿才会动作,只要能满足时延要求,就能确保采样到稳定正确的结果毛刺无法消除,但其造成的问题却可以消除采用同步设计并达到
5、时延要求安全同步化异步输入一例——去抖动逻辑DQR异步输入系统时钟同步输入设备外围DQDQ延迟一个周期后才复位,确保D端输入脉冲至少有一个周期的宽度,没有中间态异步输入的信号变化时机和宽度不确定,有抖动(毛刺),不能直接被同步系统正确采样该逻辑确保能正确得到异步输入的上升沿。一个时钟周期内的多次电平变化被认为是抖动(毛刺),最后只得到一个上升沿。相应的VHDL代码signalAsynInput:std_logic;signalInputReg:std_logic;signalDelay:std_logic;signalSynInput:std_logic;proces
6、s(SynInput,AsynInput)beginifSynInput=‘1’then--此置位为寄存器信号,为同步设计,可行InputReg<=‘0’;ifrising_edge(AsynInput)thenInputReg<=‘1’;endif;endprocess;process(Clk)beginifrising_edge(Clk)thenDelay<=InputReg;SynInput<=Delay;endif;DQ3AsyncRINPUTCLOCKCounterQ2Q1Q0DQ同步设计方法中TC的生成和使用对照前面异步设计中TC生成和使用的例子TC相应的V
7、HDL代码signalCounter:std_logic_vector(3downto0);signalTC:std_logic;signalflop:std_logic;process(TC,Clk)beginifTC=‘1’then--此复位为寄存器信号,为同步设计,可行Counter<=“0000”;TC<=‘-’;elsifrising_edge(Clk)thenCounter<=Counter+1;ifCounter=“1110”then--注意和异步设计中TC信号的比较--此处TC为寄存器输出TC<=‘1’;elseTC<=‘
此文档下载收益归作者所有