6.1.7 三态门及总线缓冲器
引入三态门有许多实际的应用,如CPU设计中的数据和地址总线的构成,RAM或堆栈的数据端口的设计等。在设计中,如果用STD_LOGIC数据类型Z对一个变量赋值,即引入三态门,并在控制下可使其输出呈高组态,这就等效于使三态门禁止输出。
1)三态门电路
所谓三态门,就是具有高电平、低电平和高阻抗三种输出状态的门电路。
【例6.11】
例6.11的仿真波形如图6.12所示。当EN为1时,把DIN赋值给DOUT;当EN为0时,DOUT输出为高阻态‘Z’ 。
图6.12 例6.11的仿真波形
一般地,可以首先将某信号定义为STD_LOGIC数据类型,将Z赋给这个变量来获得三态控制门电路,一个Z表示一个逻辑位。但应注意,由于Z在综合中是一个不确定的值,不同的综合器可能会给出不同的结果,因而对于VHDL综合前的行为仿真与综合后的功能仿真结果也可能是不同的。因此有时虽然能通过综合,但却不能获得正确的时序仿真结果,建议尽可能不要将Z用作比较值、表达式或操作数。另外,虽然VHDL语法规定不区分关键词的大小写,但当把表示高阻态的‘Z’值赋给一个数据类型为STD_LOGIC的变量或信号时,Z必须是大写,这是因为在IEEE库数据类型STD_LOGIC的预定义中已经将高阻态定为大写Z。
2)单向总线驱动器
例6.12是一个8位三态控制门电路的描述,当使能控制信号为1时,8位数据输出;为0时输出呈高阻态。语句中用高阻态数据“ZZZZZZZZ”给输出端口赋值,其仿真波形如图6.13所示。
【例6.12】
图6.13 例6.12仿真结果
3)双向端口设计
用INOUT模式设计双向端口与三态端口的设计十分相似,都必须考虑端口的三态控制,这是由于双向端口在完成输入功能时,必须使原来呈输出模式的端口呈高阻态。
下面比较例6.13和例6.14两个双向端口的VHDL设计实例。
【例6.13】
【例6.14】
例6.13和例6.14都将q定义为双向端口,将x定义为三态控制输出口。它们的区别仅在于:例6.13利用q的输入功能将q端口的数据读入并传输给x时,没有将q端口设置成高阻态输出。图6.14是例6.13的仿真波形,当control为0时,x无法得到正确的输出结果。这是因为,表面上看其中的IF语句是一个完整的条件语句,但这仅对x而言的;对q并非如此,q只在control为1时执行赋值命令,为0时没有给出q的操作说明。例6.14情况就不同了,例中增加了语句q<=“ZZZZZZZZ”,使q在IF语句中有了完整的条件描述,从而克服了时序元件的引入;另外在q履行输入功能时,将其设定为高组态输出,使q成为真正的双向端口。从仿真波形图6.15可见,无论control为1或0,q和x都能得到正确的输出结果。
图6.14 例6.13的仿真波形
图6.15 例6.14的仿真波形
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。