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