最简单,最常用,并最具代表性的时序电路是D触发器,它是现代数字系统中最基本的时序单元。下面用VHDL语言描述:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DFF1 IS
PORT(CLK:IN STD_LOGIC;
D:IN STD_LOGIC;
Q: OUT STD_LOGIC
);
END DFF1;
ARCHITECTURE behav OF DFF1 IS
SIGNAL Q1:STD_LOGIC;
BEGIN
PROCESS(CLK,Q1)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
Q1<=D;
END IF;
END PROCESS;
Q<=Q1;
END behav;
下面一一分析上面程序的时序:
1.标准逻辑位数类型STD_LOGIC
就数字系统设计来说,类型STD_LOGIC比BIT包含的内容多。
BIT数据类型定义:
TYPE BIT IS('0','1');---只有2种取值
而STD_LOGIC数据类型有:
TYPE STD_LOGIC ('0' '1' 'U' 'X' 'Z' 'W' 'L' 'H' '-') ;九种取值它们的含义分别是:‘U’表示未初始化的;‘X’表示强未知的;‘0’和‘1’表示强逻辑0和强逻辑1;‘Z’表示高阻态;‘W’表示弱未知的;‘L’和‘H’表示弱逻辑0和弱逻辑1;‘-’表示忽略。它们完整的概括了数字系统中所有可能的数据表现形式。在仿真中,将信号或其它数据对象定义为STD_LOGIC是非常有用的,它可以使设计者精确的模拟一些未知的和具有高阻态的线路情况。对于综合器,高阻态‘Z’和‘-’忽略态可用于三态的描述。扯远了,呵呵。。
2.上升沿检测表达式和信号属性函数EVENT
在上面的程序中,我们用CLK'EVENT AND CLK='1'来检测时钟的上升沿,即如果检测到CLK的上升沿,表达式值为TURE。关键字EVENT是信号属性函数,用来获得信号行为信号的函数称为信号属性函数。VHDL通过下面的表达式来测定某信号的跳变情况。
《信号名》’EVENT
短语CLK'EVENT就是对CLK标识符的信号在当前的一个极小的时间段(设为&)内发生事件的情况进行检测。所谓发生事件就是CLK在其数据类型定义的范围内发生变化,从一种值取值转变到另外一种取值。在这里CLK被定义为STD_LOGIC数据类型,则在&时间段内,CLK从其允许的9种值中的任何一个值向另一个值变化,如由‘Z’变为‘0’等等,于是表达式将输出一个布尔值TURE,否则为FALSE。这样很容易理解上面程序的语句:CLK'EVENT AND CLK='1'为什么是上升沿检测了。在一个&时间段CLK的值发生变化,并且之后的值为‘1’,那么这前这个值就一定是‘0’,于是它就成了上升沿检测语句了。
另:检测下降沿的语句:CLK'EVENT='1' AND CLK='0' ;falling_edge()
3.不完整的条件语句和时序电路
下面分析D触发器的功能
首先考查时钟信号CLK的情况(即满足IF语句条件的情况)。当CLK发生变化时,PROCESS语句被启动,IF语句将测定条件表达式CLK'EVENT AND CLK='1'是否满足条件,如果CLK的确出现了上升沿,则满足条件表达式是对上升沿的检测,于是执行Q1<=D,即更新Q1,并结束IF语句,最后将Q1的值向端口信号Q输出。至此,是否可以认为CLK上升沿测定语句“CLK'EVENT AND CLK='1'”就成为综合器构建时序电路的必要条件呢?答案是否定的,哈哈!
那么为什么呢?再进一步分析:如果CLK没有发生变化,或者说没有出现上升沿方式的跳变时IF语句的行为。这时由于IF语句不满足条件,于是跳过赋值表达式Q1<=D,不执行此赋值表达式而结束IF语句。由于此IF语句没有利用通常的ELSE语句明确指出当IF语句不满足条件时作何操作,这是一种不完整的条件语句(即在条件语句中没有将所有可能发生的条件给出对应的处理方式)。对于这种语言现象,VHDL综合器理解为,对于不满足条件,跳过赋值语句Q1<=D,不执行,即意味着保持Q1的原值不变,就意味着使用具有存储功能的元件,就是必须引进时序元件来保存Q1的原值。
显然,时序电路构建的关键在于利用这种不完整的条件语句的描述。然而必须注意,如果用在纯组合电路中,如果没有考虑到电路中所有可能出现的问题,即没有列全所有的条件对应的处理方法,导致不完整条件语句出现,从而综合出设计者不希望看到的结果。
文章评论(0条评论)
登录后参与讨论