Board logo

标题: 关于组合逻辑和时序逻辑的详细介绍(2) [打印本页]

作者: yuyang911220    时间: 2016-8-4 16:51     标题: 关于组合逻辑和时序逻辑的详细介绍(2)

2.时序逻辑的Verilog HDL描述
时序电路的行为决定了其只能通过always块语句实现,通过关键词“posedge”和“negedge”来捕获时钟信号的上升沿和下降沿。在always语句块中可以使用任何可综合的标志符。下面首先以D触发器为例,给出基本单元触发器的VerilogHDL实例,读者可自行完成其余常用触发器(RS触发器、JK触发器以及T触发器等)的Verilog HDL实现。
【例8-4】通过Verilog HDL实现D触发器。
同步D触发器的功能为:输入D只能在时序信号clk的沿变化时才能被写入到存储器中,替换以前的值,常用于数据延迟以及数据存储模块中。由于D触发器只有一个输入端,在许多情况下,可使触发器之间的连接变得非常简单,因此使用十分广泛。



上述程序在ISE中综合后的RTL级结构图如图8-11所示。
上述程序的仿真结果如图8-12所示。从中可以看出,在时钟上升沿,D触发器都将输入数据接收并寄存。



在给出时序逻辑设计最基本的电路后,下面给出图8-8所示电路的Verilog HDL实现,和例8-3的描述方法进行比较。
【例8-5】通过Verilog HDL语言实现例8-3所示电路。



程序在ISE综合后的RTL级结构图如图8-13所示,可以看出,其和图8-8是一致的,达到了设计的目的。



上述程序的仿真结果如图8-14所示,验证了程序的正确性。



在利用Verilog HDL描述时序电路时有以下几个问题需要注意。
(1)在描述时序电路的always块中的reg型信号都会被综合成寄存器,这是和组合逻辑电路所不同的。
(2)时序逻辑中推荐使用非阻塞赋值“<=”,原因将在8.3节详细说明。
(3)时序逻辑的敏感信号列表只需要加入所用的时钟触发沿即可,其余所有的输入和条件判断信号都不用加入,这是因为时序逻辑是通过时钟信号的跳变沿来控制的。

8.1.3 组合逻辑电路中的竞争与冒险
1.什么是竞争与冒险
信号在组合逻辑电路内部通过连线和逻辑单元时,都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。此外,信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为“毛刺”,如图8-15所示。如果一个组合逻辑电路中有“毛刺”出现,就说明该电路存在“冒险”。
需要注意的是,冒险信号的脉冲宽度很小,常常只有数纳秒或数十纳秒,其频带带宽可达数百兆赫兹或更宽。在板级调试时,如果示波器的上限频率较低,会将幅度较大的毛刺显示为幅度较小的毛刺,甚至不易被察觉。这都是在实际开发中捕获毛刺应该注意的问题。
冒险按产生形式的不同可以分为静态冒险和动态冒险两大类。静态冒险是指输入有变化,而输出不应变化时产生的单个窄脉冲;动态冒险则指的是输入变化时,输出也应变化时产生的冒险。参考文献[4]指出,动态冒险是由静态冒险引起的,因此存在动态冒险的电路也存在静态冒险。
静态冒险根据产生条件的不同,分为功能冒险和逻辑冒险两大类。当有两个或两个以上输入信号同时产生变化时,在输出端产生毛刺,这种冒险称为功能冒险。如果只有一个变量产生变化时出现的冒险则是逻辑冒险。
冒险往往会影响到逻辑电路的稳定性。清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题。



2.冒险产生的原因
由于动态冒险主要是由静态冒险引起的,消除了静态冒险,动态冒险也就自然消除了,因此下面介绍静态冒险的检查和消除。
判断一个逻辑电路在某些输入信号发生变化时是否会产生冒险,首先要判断信号是否会同时变化,然后判断在信号同时变化的时候,是否会产生冒险,这可以通过逻辑函数的卡诺图或逻辑函数表达式来进行判断。
(1)功能冒险的检查
功能冒险是由电路的逻辑功能引起的,只要输入信号不是按照循环码的规律变化,组合逻辑就可能产生功能冒险,且不能通过修改设计加以消除,只能通过对输出采用时钟采样来消除。
(2)逻辑冒险的检查
检查电路是否产生逻辑冒险的方法有两种,即代数法和卡诺图法。
① 代数法。如果一个组合逻辑函数表达式F,在某些条件下能化简成或的形式,在A产生变化时,就可能产生静态逻辑冒险。
② 卡诺图法。在组合逻辑的卡诺图中,若存在素项圈相切,则可能会产生逻辑冒险。如图8-16 所示的卡诺图,AC 和两个素项环相切,在B= C =1时,A 由1 变为0时,将产生逻辑冒险。
3.竞争与冒险在Verilog HDL 设计中的体现
【例8-6】详细分析Verilog HDL 程序内在的逻辑冒险现象。
首先,给出一段示例代码。



程序在ISE中综合后的RTL级结构图如图8-17所示。



上述程序在ISESimulator中的仿真结果如图8-18所示。从图8-18所示的仿真波形可以看出,由于“A、B、C、D”4个输入信号高低电平变换不是同时发生的,这导致输出信号“Out”出现了毛刺。由于无法保证所有连线的长度一致,所以即使4个输入信号在输入端同时变化,但经过可编程逻辑器件内部的走线,到达或门的时间也是不一样的,毛刺必然产生。简单地说,只要输入信号同时变化,组合逻辑必将产生毛刺。将它们的输出直接连接到时钟输入端、清零或置位端口的设计方法是错误的,这可能会导致严重的后果。所以必须检查设计中所有时钟、清零和置位等对毛刺敏感的输入端口,确保输入不会含有任何毛刺。



4.毛刺的消除
毛刺并不是对所有的输入都有危害,例如D触发器的D输入端,只要毛刺不出现在时钟的上升沿并且不满足数据的建立和保持时间,就不会对系统造成危害,我们可以说D触发器的D输入端对毛刺不敏感。根据这个特性,应当在系统中尽可能采用同步电路,这是因为同步电路信号的变化都发生在时钟沿,只要毛刺不出现在时钟的沿口并且不满足数据的建立和保持时间,就不会对系统造成危害(由于毛刺很短,多为几纳秒,基本上都不可能满足数据的建立和保持时间)。
因此可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。例如,在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器,这是因为格雷码计数器的输出每次只有一位跳变,消除了竞争冒险的发生条件,避免了毛刺的产生。目前,主要有两种基本的采样方法,即脉冲选择法和时序逻辑保持法。
(1)脉冲选择法
该方法在输出信号的保持时间内,用一定宽度的高电平脉冲与输出信号做逻辑“与”运算,由此获取输出信号的电平值。例8-7说明了这种方法,采样脉冲信号从输入引脚“Sample”引入。
【例8-7】通过脉冲选择法修改例8-6电路中的毛刺。



程序的综合结果如图8-19所示,其中“Tout_bmp”模块封装了除脉冲选择以外的全部电路,脉冲选择通过与门来实现。
程序的仿真结果如图8-20所示,从其仿真波形上可以看出,毛刺信号出现在“Tout”引脚上,而“Out”引脚上的毛刺已被消除了。



以上方法可以大大减少毛刺,但它并不能完全消除毛刺,有时,必须手工修改电路来去除毛刺。通常使用“采样”的方法。一般说来,冒险出现在信号发生电平转换的时刻,也就是说在输出信号的建立时间内会发生冒险,而在输出信号的保持时间内是不会有毛刺信号出现的。如果在输出信号的保持时间内对其进行“采样”,就可以消除毛刺信号的影响。
(2)时序逻辑保持法
脉冲选择法最大的缺点是必须人为地保证sample信号在合适的时间产生,另一种更常见的方法即为时序逻辑保持法,其利用D触发器的D输入端对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号,这种方法类似于将异步电路转化为同步电路。下面给出一个应用实例。
【例8-8】通过D触发器来消除例8-6所示电路的冒险现象。



上述程序综合后的RTL级结构图如图8-21所示,同样其中“Tout_bmp”模块封装了除脉冲选择以外的全部电路,时序逻辑保持通过D触发器来实现。
程序的仿真结果如图8-22所示,从其仿真波形上可以看出,毛刺信号出现在“Tout”引脚上,而“Out”引脚上的毛刺已被消除了,无需外部输入采样控制信号。



8.1.4 时序逻辑的时钟选择策略
从8.1.2节可知,时钟对于时序逻辑是至关重要的,时钟的任何一个随机的抖动都会导致电路重新执行一次,使得逻辑时序发生错误跳转,因此时钟的质量对时序逻辑是至关重要的。设计时序电路的第一步就是选择性能优良的时钟信号。
作者: yuchengze    时间: 2016-8-21 14:27

图片呢 ,楼主,很不错的帖子,就是差图片




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0