Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VHDL在未定义时定义信号_Vhdl_Flip Flop - Fatal编程技术网

VHDL在未定义时定义信号

VHDL在未定义时定义信号,vhdl,flip-flop,Vhdl,Flip Flop,所以,我一直在做一些VHDL作业,我的测试台出现了一些问题。基本上,我的测试台正在运行多种触发器的不同可能性。然而,我一直从一个触发器中得到“U”,虽然我知道确切的原因,但我不知道如何修复它 基本上,对于我的T触发器,由于在执行XOR操作时没有设置Q,所以程序在XOR操作后永远不会给Q赋值。所以基本上,我需要一种方法将Q设置为,比如说,0,iff Q还没有定义 仅供参考,这里是我的T触发器代码 library ieee; use ieee.std_logic_1164.all; entity

所以,我一直在做一些VHDL作业,我的测试台出现了一些问题。基本上,我的测试台正在运行多种触发器的不同可能性。然而,我一直从一个触发器中得到“U”,虽然我知道确切的原因,但我不知道如何修复它

基本上,对于我的T触发器,由于在执行XOR操作时没有设置Q,所以程序在XOR操作后永远不会给Q赋值。所以基本上,我需要一种方法将Q设置为,比如说,0,iff Q还没有定义

仅供参考,这里是我的T触发器代码

library ieee;
use ieee.std_logic_1164.all;

entity T_FF is
  port (
        T, clk : in std_logic;
        Q : inout std_logic);
end T_FF;

architecture behv of T_FF is
begin
  process (clk) is
    variable hold1, hold2 : std_logic;
    begin
      if (clk'event) then
        hold1 := Q and (not T);
        hold2 := T and (not Q);
        Q <= hold1 or hold2;
      end if;
  end process;
end behv;
ieee库;
使用ieee.std_logic_1164.all;
实体T\u FF是
港口(
T、 clk:标准逻辑中;
Q:inout标准逻辑);
结束T_FF;
塔夫机场的建筑设计
开始
过程(clk)是
变量hold1,hold2:std_逻辑;
开始
如果(时钟事件)那么
hold1:=Q和(不是T);
hold2:=T和(不是Q);
Q sT,clk=>sclk,Q=>sQT);

sclk我向Chris Laplante道歉,但您的问题似乎是一个非常有效的VHSIC硬件描述语言(VHDL)问题。(VHSIC是超大规模集成电路的缩写)。尽管有良好的Wiki描述,VHDL并不是一种通用编程语言。执行受模拟时间或以依赖于实现的方式,连续增量周期数的限制。借用Harry Harrison的话,VHDL就是硬件。所有这些都表明,他们可以利用交通

您的测试台已经为sT提供了一个默认值,即实例化T\u FF中正式T的实际值。从未标记的过程中,我们看到变量hold1和hold 2是T和Q的乘积,因此问题在于,在包体std_logic_1164中查找and表或NOT表时,存在已知的Q值,以产生除“U”之外的一些值:

-- truth table for "not" function
CONSTANT not_table: stdlogic_1d :=
--  -------------------------------------------------
--  |   U    X    0    1    Z    W    L    H    -   |
--  -------------------------------------------------
     ( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' );

-- truth table for "and" function
CONSTANT and_table : stdlogic_table := (
--      ----------------------------------------------------
--      |  U    X    0    1    Z    W    L    H    -         |   |
--      ----------------------------------------------------
        ( 'U', 'U', '0', 'U', 'U', 'U', '0', 'U', 'U' ),  -- | U |
        ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | X |
        ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ),  -- | 0 |
        ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | 1 |
        ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | Z |
        ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | W |
        ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ),  -- | L |
        ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | H |
        ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' )   -- | - |
);
从这两个表中,我们可以看到输入必须是“0”、“1”、“H”或“L”中的一个,才能传递“U”或“X”以外的信息。(横轴表示一个输入,纵轴表示另一个输入,对于双输入和函数,结果值位于与一个或两个轴相交的值数组中)

因此Q必须初始化为这四个值中的一个。有两种方法可以做到这一点,一种是在FPGA中反映初始化,该FPGA提供对设置或重置条件的自然偏差,另一种是通过对Q应用主动重置(参见相关问题的)

因为您选择了将Q端口模式设置为inout并在反馈中直接使用它,所以最好的选择是提供重置。在您的T_FF中还存在一个设计错误,您在两个时钟边缘上操作,可以通过使用clk='1'将clk'事件限定为仅在一个边缘(上升边缘)上操作来解决:

进程(clk,复位)已启动
变量hold1,hold2:std_逻辑;
开始
如果重置='1',则

实际上这里有两个问题:(1)关于你想要建立什么;(2) 关于代码本身

1) 关于您试图构建的内容:

您正在尝试构建一个T型触发器。这通常是建立一个D型触发器通过简单地连接一个反向版本的输出回其输入。在您的例子中,您还需要一个“toggle enable”信号(在代码中称为T),以允许在T=0时停止TFF。这意味着TFF输入必须通过异或门,而不是其他

这样的异或门可以像您所做的那样构造(和或层),或者直接使用异或门。由于FPGA中的DFF已经使用启用端口(DFF内部的XOR功能)构建,因此最好使用XOR选项,以节省逻辑并加快操作速度。但显然,另一种选择也会起作用

2) 关于守则:

  • Q是缓冲区,不是inout
  • 包括“和clk='1'”(->上升沿(clk))
  • 消除变量hold1、hold2

  • 使用Q欢迎使用堆栈溢出!你的问题可能更适合我们的姐妹网站。好的,太棒了。我知道VHDL是为表示硬件而设计的,我遇到的问题是没有重置检查。现在,我的代码似乎工作正常。谢谢你的帮助!另外,关于在上升沿和下降沿上操作的代码,这是针对这个特定应用程序的,尽管我可能在说明中遗漏了一些东西。再次感谢!
    -- truth table for "not" function
    CONSTANT not_table: stdlogic_1d :=
    --  -------------------------------------------------
    --  |   U    X    0    1    Z    W    L    H    -   |
    --  -------------------------------------------------
         ( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' );
    
    -- truth table for "and" function
    CONSTANT and_table : stdlogic_table := (
    --      ----------------------------------------------------
    --      |  U    X    0    1    Z    W    L    H    -         |   |
    --      ----------------------------------------------------
            ( 'U', 'U', '0', 'U', 'U', 'U', '0', 'U', 'U' ),  -- | U |
            ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | X |
            ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ),  -- | 0 |
            ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | 1 |
            ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | Z |
            ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | W |
            ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ),  -- | L |
            ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | H |
            ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' )   -- | - |
    );
    
      process (clk, RESET) is
        variable hold1, hold2 : std_logic;
        begin
            if RESET = '1' then
                Q <= '0';
            else 
                if (clk'event AND clk = '1') then
                    hold1 := Q and (not T);
                    hold2 := T and (not Q);
                    Q <= hold1 or hold2;
                end if;
            end if;
      end process;
    
    library ieee;
    use ieee.std_logic_1164.all;
    --------------------------------------------
    entity T_FF is
      port (
        T, clk: in std_logic;
        Q : buffer std_logic); 
    end T_FF;
    --------------------------------------------
    architecture behv of T_FF is
    begin
      process (clk) is
      begin
        if rising_edge(clk) then
          Q <= (T and not Q) or (not T and Q);
          --Q <= T xor Q; --preferred option
        end if;
      end process;
    end behv;
    --------------------------------------------