加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

三态门电路及其VHDL实现双向端口

(2012-02-17 20:45:33)
标签:

三态门

vhdl

双向端口

三态总线

it

分类: FPGA

    三态电路是一种重要的总线接口电路。三态,是指它的输出既可以是一般二值逻辑电路的正常的“0”状态和“1”状态,又可以保持特有的高阻抗状态,第三种状态——高阻状态的门电路。处于高阻抗状态时,其输出相当于断开状态,没有任何逻辑控制功能。三态电路的输出逻辑状态的控制,是通过一个输入引脚实现的。当G为低电平输入时,三态电路呈现正常的“0”或“1”的输出;当G为高电平输入时,三态电路给出高阻态输出。

    三态门在双向端口中运用时,设置Z为控制项,当Z=1时,上面的管子开通,此时数据可以从上面的短脚输出,这时双向端口就作为输出口;当Z=0时,上面感三态门被置为高阻态,数据不能从上面的短脚输出,此时数据只可以从下面的短脚由外部向内输入,这时的双向端口是输入口。

http://imgsrc.baidu.com/baike/abpic/item/9a1151c2d58af457e4dd3bef.jpg

    一般门与其它电路的连接,无非是两种状态,1或者0,在比较复杂的系统中,为了能在一条传输线上传送不同部件的信号,研制了相应的逻辑器件称为三态门,除了有这两种状态以外还有一个高阻态,就是高阻抗。相当于该门和它连接的电路处于断开的状态。因为实际电路中你不可能去断开它,所以设置这样一个状态使它处于断开状态。三态门是一种扩展逻辑功能的输出级,也是一种控制开关。主要是用于总线的连接,因为总线只允许同时只有一个使用者。通常在数据总线上接有多个器件,每个器件通过OE/CE之类的信号选通。如器件没有选通的话它就处于高阻态,相当于没有接在总线上,不影响其它器件的工作。

    如果设备端口要挂在一个总线上, 必须通过三态缓冲器. 因为在一个总线上同时只能有一个端口作输出, 这时其他端口必须在高阻态, 同时可以输入这个输出端口的数据. 所以你还需要有总线控制管理, 访问到哪个端口, 那个端口的三态缓冲器才可以转入输出状态. 这是典型的三态门应用。

    在VHDL中,设计三态门时,用std_logic数据类型对'Z'变量赋值,即引入三态门,在控制下使其输出呈高阻状态,就等效于禁止输出。

    例如一个八位的三态门控制电路。使能信号为‘1’时,八位数据输出,为‘0’时输出呈高阻。

library ieee;

use ieee.std_logic_1164.all;

entity tri is

  port(enable:in std_logic;

       datain:in std_logic_vector(7 downto 0);

       dataout:out std_logic_vector(7 downto 0)

       );

end tri;

archtecture one of tri is

begin

  process(enable,datain)

  begin

    if enable='1' then

      datatout<=datain;

    else

      dataout<="ZZZZZZZZ";

    end if;

  end process;

end one;

要注意的是,Z在综合中是一个不确定的值,不同的综合器会给出不同的结果。对于关键词VHDL不区分大小写,但是高阻‘Z’需要大写。

    双向端口的设计也需要考虑三态的使用。因为双向端口在完成输入功能时必须使原来呈输出模式的端口呈高阻状态。否则,待输入的外部数据会与端口处原来的电平发生线与,导致无法将外部数据正确的写入。

代码一:

library ieee;
use ieee.std_logic_1164.all;
entity test is
  port(control:in std_logic;
       in1:in std_logic_vector(7 downto 0);
       q:inout std_logic_vector(7 downto 0);
       x:out std_logic_vector(7 downto 0)
       );
end test;

architecture one of test is
begin
  process(control,in1)
  begin
    if control='0' then
      x<=q;

    else
      q<=in1;
      x<="ZZZZZZZZ";
    end if;
  end process;
end one;

代码二:

process(control,in1)
  begin
    if control='0' then
      x<=q;
      q<="ZZZZZZZZ";
    else
      q<=in1;
      x<="ZZZZZZZZ";
    end if;
  end process;

代码一错误,因为利用q的输入功能时没有将q的端口设置成高阻输出。代码二就解决了两个问题(1)使q在if语句中有了完整的条件描述,从而克服了时序元件的引入。(2)在q履行输入功能时,将其设定成高阻输出,使q成为真正的双向端口。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有