首页 百科知识 4.2.1信号

4.2.1信号

时间:2022-10-15 百科知识 版权反馈
【摘要】:惯性延时信号的驱动器最多只能保持一个处理事项。当该信号的驱动器中已有一个尚未处理的事项时,如果与该信号有关的赋值语句又一次被执行,就会产生一个新的待处理事项;一般情况下,尚未处理的老事项将被新事项替换。假设z的初始值是“0”,则惯性延时规则覆盖了由第一个信号赋值语句所带来的变化。执行结果是z始终为“0”,如图4.1所示。

4.2.1 信号

信号表征的是硬件电路中确实存在的互连线,是一个全局量,可以在实体、构造体、程序包中进行申明,作为进程(PROCESS)、函数(FUNCTION)等子结构之间的信息通道。

1.信号的申明

信号申明的语法格式如下:

img57

在这个语法结构中,“SIGNAL”是信号申明的关键字;“信号名”是由设计者自行定义的标识符;“数据类型”表明是信号可承载的数据类型;“约束条件”是一个可选项,通常用来表征信号的取值范围,一般用关键字“RANGE”标示,如果信号的取值范围与所选数据类型的取值范围相同,则不需要加约束条件;“:=表达式”也是一个可选项,用于在申明信号的同时给它赋初值,值得注意的是这个初值仅在仿真时有效,综合时会被忽略,不会生成相应的电路,所以在电路需要严格的定值初始态时,应设计初始化电路。

例如,申明一个1位BIT数据类型的信号count可以如下表示:

img58

例如,要申明一个INTEGER类型、取值范围约束在0~9、初值为“2”的信号sys_clk,可以如下表示:

img59

2.信号的赋值

已申明的信号可以用“<=”延时赋值符号为其代入新的值,从而完成该信号与其他信号、变量、常量等数据之间的传递。由于信号代表的是电路中真实存在的互连线,而互连线上的信号传递是存在一定的延时的,所以在信号的赋值中允许附加延时,以便于更加真实地表现电路的运行情况。

在程序中,信号可以被多次赋值。

信号赋值的基本格式为:

img60

例如:

img61

3.信号的延时

信号的赋值操作是有延时的,VHDL支持两类性质的延时:惯性延时与传播延时。

传播延时(TRANSPORT DELAY)直接模拟导线上信号的延时,任何信号传入导线的一端,经过一段延时时间必能从导线另一端传出。即所有的输入都对输出有影响,它们按顺序一个一个依次传输到输出端。

惯性延时(INERTIAL DELAY)则模拟某类元件的延时特性,信号传入元件后,在指定延时时间内输入信号必须保持不变,元件的输出端才会有响应。换句话说,对于惯性延时信号,如果在指定延时时间内输入信号又被撤销了,那么输出端就不会有响应。

例如,z<=i AFTER 10 ns,i的值能传播给z的充要条件是i的电压必须保持10ns不变,若i的值是个尖峰脉冲,不能稳定地持续10ns,则z的值不随i而变。这就是说,惯性延时机制过滤掉那些变化很快的输入,它模拟信号变化时电容的作用。在电路级,节点电压代表逻辑信号值。由于电容的存在,节点电压不可能瞬时变化。当电流增加或减小时,节点电压才缓慢变化。如该节点电压作为一个晶体管的驱动电压,则只有到达一个阈值电压后该晶体管才发生变化。换句话说,电路有惯性效应。节点电压的变化与晶体管状态的变化在时间上的滞后属于惯性延时。

为了区别两类不同延时,规定在赋值语句中增加一个〈选项〉,如:

img62

〈选项〉取关键字TRANSPORT表示传播延时,取INERTIAL则表示惯性延时。若不加〈选项〉,默认为惯性延时。

两种不同延时性质的信号,在它们的信号驱动器上体现出差别。惯性延时信号的驱动器最多只能保持一个处理事项。当该信号的驱动器中已有一个尚未处理的事项时,如果与该信号有关的赋值语句又一次被执行,就会产生一个新的待处理事项;一般情况下,尚未处理的老事项将被新事项替换。仅当老事项中信号值与新事项中信号值相同,而且老事项的更新时间在前的情况下,驱动器中仍旧保持老的处理事项,新的处理事项则不被接受。而传播延时信号的驱动器则可以按更新时间先后保持多个待处理事项。如果该信号赋值语句又一次被执行,相应产生的新事项将按更新时间顺序插入驱动器中的处理事项序列,或替换更新时间相同的老事项,同时还要删除序列中新事项以后的所有老事项。凡是在驱动中被删除或被替换掉的处理事项,就不再会在相关信号上有所反映。

副作用:尽管惯性延时机制对一般的逻辑建模非常有效,但它有时会产生不好的副作用。

例如,在仿真初始使用例4-1的进程来调度信号的变化。

【例4-1】惯性延时

img63

这一进程只在仿真最开始时执行一次,并且是顺序执行。假设z的初始值是“0”,则惯性延时规则覆盖了由第一个信号赋值语句所带来的变化。执行结果是z始终为“0”,如图4.1所示。

img64

图4.1 例4-1的仿真波形

为了解决这个问题,必须在语句中加入关键字TRANSPORT,源代码如例4-2所示,仿真结果如图4.2所示:

【例4-2】传播延时

img65

或者将两个AFTER延时并到同一条语句中,如下所示:

img66

img67

图4.2 例4-2的仿真波形

其实,在信号赋值语句中,若没有写入延时表达式,则称为零延时,零延时信号赋值依然存在一个“无限小”的传播延时,通常称之为Δ延时。这个传播延时会造成意想不到的后果。为了说明Δ延时信号赋值的影响,我们通过例4-3对其作进一步的分析。

【例4-3】Δ延时

img68

img69

语句a和语句b是在顺序进程块example中的信号赋值语句,这两条语句中没有标明信号赋值的延时,但实际上每个信号的赋值都有Δ传播延时。PROCESS子结构example执行的条件是x,y,z任意一个发生变化,也就是说当x,y,z任意一个发生变化时将语句a和b顺序执行一遍。

假设x,y,z,a_signal,b_signal的初始值分别是3,2,3,6,7。在t1时刻,x的值变为4,经计算“x*y”为8,但由于信号赋值有Δ延时,a_signal的值要到t1+Δ时刻才变为8,在此之前它仍然保持旧值6,故在t1时刻,b_signal的值应被赋为6+3,而不是8+3,即b_signal最终为9。所以当x从3变为4触发的example进程执行完毕的t1+Δ时刻,a_signal和b_signal的新值分别是8,9。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈