EDA技术与ⅤHDL 的上升沿进行检测,于是语句c1ock’ EVENT AND clock=11·就成了边沿测试语句。 5.不完整条件语句与时序电路 现在来分析例3-6中对D触发器功能的描述 首先考察时钟信号CLK上升沿出现的情况(即满足工E语句条件的情况)。当CLK发 生变化时, PROCESS语句被启动,工F语句将测定条件表式“CLK' EVENT AND CLK=11” 是否满足条件,如果cLK的确出现了上升沿,则满足条件表式对是上升沿检测,于是执行 语句Q1<=D,即将D的数据向内部信号Q1赋值,即更新Q1,并结束IF语句,最后将Q1 的值向端口信号Q输出。至此,是否可以认为,cLK上升沿测定语句cLκ" EVENT AND CIK=1就成为综合器构建时序电路的必要条件呢?回答显然是否定的。 其次再考察如果CLK没有发生变化,或者说CLK没有出现上升沿方式的跳变时IF语 句的行为。这时由于IF语句不满足条件,即条件表式给出“ FALSE”,于是将跳过赋值表 式Ql<=D,不执行此赋值表式而结束IF语句。由于在此,I语句中没有利用通常的ELSE 语句明确指出当IF语句不满足条件时作何操作。显然这是一种不完整的条件语句即在条 件语句中,没有将所有可能发生的条件给出对应的处理方式)。对于这种语言现象,VHDL 综合器理解为,对于不满足条件,跳过赋值语句Ql<=D不予执行,即意味着保持Q1的原 值不变(保持前一次时钟上升沿后Q1被更新的值)。对于数字电路来说,试图保持一个值 不变,就意味着具有存储功能的元件的使用,就是必须引进时序元件来保存Q1中的原值 直到满足IF语句的判断条件后才能更新Q1中的值 显然,时序电路构建的关键在于利用这种不完整的条件语句的描述。这种构成时序电 路的方式是VHDL描述时序电路最重要的途径。通常,完整的条件语句只能构成组合逻辑 电路,如例3-3中, IF THEN ELSE语句指明了s为和0全部可能的条件下的赋值操作, 从而产生了多路选择器组合电路模块 然而必须注意,虽然在构成时序电路方面,可以利用不完整的条件语句所具有的独特 功能构成时序电路,但在利用条件语句进行纯组合电路设计时,如果没有充分考虑电路中 所有可能出现的问题,即没有列全所有的条件及其对应的处理方法,将导致不完整的条件 语句的出现,从而产生设计者不希望的组合与时序电路的混合体。在此,不妨比较例3-7 和例3-8的综合结果。可以认为例3-7的原意是要设计一个纯组合电路的比较器,但是由 于在条件语句中漏掉了给出当al=bl时q1作何操作的表述,结果导致了一个不完整的条 件语句。这时,综合器将对例3-7的条件表述解释为:当条件a1=b1时对q1不作任何赋 值操作,即在此情况下保持ql的原值,这便意味着必须为ql配置一个寄存器,以便保存 它的原值。图3-5所示的电路图即为例3-7的综合结果。不难发现综合器已为比较结果配 置了一个寄存器。通常在仿真时,对这类电路的测试,很难发现在电路中已被插入了不必 要的时序元件,这样浪费了逻辑资源,降低了电路的工作速度,影响了电路的可靠性。因 此,设计者应该尽量避免此类电路的出现 例3-8是对例3-7的改进,其中的“ ElSE q1<=0”语句即已交代了当al小于等于b1 情况下,q1作何赋值行为,从而能产生图36所示的简洁的组合电路
80 EDA 技术与 VHDL 的上升沿进行检测,于是语句 clock’EVENT AND clock ='1'就成了边沿测试语句。 5. 不完整条件语句与时序电路 现在来分析例 3-6 中对 D 触发器功能的描述。 首先考察时钟信号 CLK 上升沿出现的情况(即满足 IF 语句条件的情况)。当 CLK 发 生变化时,PROCESS 语句被启动,IF 语句将测定条件表式“CLK'EVENT AND CLK='1'” 是否满足条件,如果 CLK 的确出现了上升沿,则满足条件表式对是上升沿检测,于是执行 语句 Q1<=D,即将 D 的数据向内部信号 Q1 赋值,即更新 Q1,并结束 IF 语句,最后将 Q1 的值向端口信号 Q 输出。至此,是否可以认为,CLK 上升沿测定语句 CLK'EVENT AND CLK='1'就成为综合器构建时序电路的必要条件呢?回答显然是否定的。 其次再考察如果 CLK 没有发生变化,或者说 CLK没有出现上升沿方式的跳变时 IF 语 句的行为。这时由于 IF 语句不满足条件,即条件表式给出“FALSE”,于是将跳过赋值表 式 Q1<=D,不执行此赋值表式而结束 IF 语句。由于在此,IF 语句中没有利用通常的 ELSE 语句明确指出当 IF 语句不满足条件时作何操作。显然这是一种不完整的条件语句(即在条 件语句中,没有将所有可能发生的条件给出对应的处理方式)。对于这种语言现象,VHDL 综合器理解为,对于不满足条件,跳过赋值语句 Q1<=D 不予执行,即意味着保持 Q1 的原 值不变(保持前一次时钟上升沿后 Q1 被更新的值)。对于数字电路来说,试图保持一个值 不变,就意味着具有存储功能的元件的使用,就是必须引进时序元件来保存 Q1 中的原值, 直到满足 IF 语句的判断条件后才能更新 Q1 中的值。 显然,时序电路构建的关键在于利用这种不完整的条件语句的描述。这种构成时序电 路的方式是 VHDL 描述时序电路最重要的途径。通常,完整的条件语句只能构成组合逻辑 电路,如例 3-3 中,IF_THEN_ELSE 语句指明了 s 为'1'和'0'全部可能的条件下的赋值操作, 从而产生了多路选择器组合电路模块。 然而必须注意,虽然在构成时序电路方面,可以利用不完整的条件语句所具有的独特 功能构成时序电路,但在利用条件语句进行纯组合电路设计时,如果没有充分考虑电路中 所有可能出现的问题,即没有列全所有的条件及其对应的处理方法,将导致不完整的条件 语句的出现,从而产生设计者不希望的组合与时序电路的混合体。在此,不妨比较例 3-7 和例 3-8 的综合结果。可以认为例 3-7 的原意是要设计一个纯组合电路的比较器,但是由 于在条件语句中漏掉了给出当 a1=b1 时 q1 作何操作的表述,结果导致了一个不完整的条 件语句。这时,综合器将对例 3-7 的条件表述解释为:当条件 a1=b1 时对 q1 不作任何赋 值操作,即在此情况下保持 q1 的原值,这便意味着必须为 q1 配置一个寄存器,以便保存 它的原值。图 3-5 所示的电路图即为例 3-7 的综合结果。不难发现综合器已为比较结果配 置了一个寄存器。通常在仿真时,对这类电路的测试,很难发现在电路中已被插入了不必 要的时序元件,这样浪费了逻辑资源,降低了电路的工作速度,影响了电路的可靠性。因 此,设计者应该尽量避免此类电路的出现。 例 3-8 是对例 3-7 的改进,其中的“ELSE q1<='0'”语句即已交代了当 a1 小于等于 b1 情况下,q1 作何赋值行为,从而能产生图 3-6 所示的简洁的组合电路
第3章VHDL入门 现在已不难发现,引入时序电路结构的必要条件和关键所在并非是边沿检测表述 “c1ock' EVENT AND clock=!1”的应用或是其他什么语句结构,而是不完整的任何 形式的条件语句的出现,且不局限于IF语句。 【例3-7】 NTITY COMP BAD工 PORT( al, bl IN BIT; q1 OUT BIT ARCHITECTURE one OF COMP BAD Is BEGIN PROCESs (al,bl) BEGIN IF al>b ELSIE a1<b1 THEN CI1<=·0;--未提及当a1-b1时,q1作何操作 END PROCESS; EnD 【例3-8】 IF al>b1 THEN 1<=l' ELSE O1<=0′; END IE; 图3-5例3-7的电路图( Synplify综合) 图3-6例3-8的电路图( Synplify综合 3.23实现时序电路的不同表述 例3-6通过利用表式“CLK' EVENT AND CLK=11”来检测CLK的上升沿,从而实 现了边沿触发寄存器的设计。事实上,VHDL还有其他多种实现时序元件的方式 严格地说,如果信号CLK的数据类型是 STD LOGIO,则它可能的取值有9种,而 CLK' EVENT为真的条件是CLK在9种数据中的任何两种间的跳变,因而当表式 CLK EVENT AND CLK-1 为真时,并不能推定CLK在?时刻前是0(例如,它可以从Z变到1),从而即使CLK有“事 件”发生也不能肯定CLK发生了一次由0到1的上升沿的跳变。为了确保此CLK发生的 是一次上升沿的跳变,例3-9采用了如下的条件判断表式 CLK EVENT AND (CLK=1)AND (CLK'LAST VALUE=0)
第 3 章 VHDL 入门 81 现在已不难发现,引入时序电路结构的必要条件和关键所在并非是边沿检测表述 “clock'EVENT AND clock='1'”的应用或是其他什么语句结构,而是不完整的任何 形式的条件语句的出现,且不局限于 IF 语句。 【例 3-7】 ENTITY COMP_BAD IS PORT( a1,b1 : IN BIT; q1 : OUT BIT ); END ; ARCHITECTURE one OF COMP_BAD IS BEGIN PROCESS (a1,b1) BEGIN IF a1 > b1 THEN q1 <= '1' ; ELSIF a1 < b1 THEN q1 <= '0' ;-- 未提及当a1=b1时,q1作何操作 END IF; END PROCESS ; END ; 【例 3-8】 ... IF a1 > b1 THEN q1 <= '1' ; ELSE q1 <= '0' ; END IF; ... 图3-5 例3-7的电路图(Synplify综合) 图3-6 例3-8的电路图(Synplify综合) 3.2.3 实现时序电路的不同表述 例 3-6 通过利用表式“CLK'EVENT AND CLK='1'”来检测 CLK 的上升沿,从而实 现了边沿触发寄存器的设计。事实上,VHDL 还有其他多种实现时序元件的方式。 严格地说,如果信号 CLK 的数据类型是 STD_LOGIC,则它可能的取值有 9 种,而 CLK'EVENT 为真的条件是 CLK 在 9 种数据中的任何两种间的跳变,因而当表式: CLK'EVENT AND CLK='1' 为真时,并不能推定 CLK 在? 时刻前是'0' (例如,它可以从'Z'变到'1'),从而即使 CLK 有“事 件”发生也不能肯定 CLK 发生了一次由'0'到'1'的上升沿的跳变。为了确保此 CLK 发生的 是一次上升沿的跳变,例 3-9 采用了如下的条件判断表式: CLK'EVENT AND (CLK='1') AND (CLK'LAST_VALUE='0')