Vhdl 错误:标识符';q';在T触发器的体系结构中是不可读的

Vhdl 错误:标识符';q';在T触发器的体系结构中是不可读的,vhdl,flip-flop,Vhdl,Flip Flop,我正在尝试使用VHDL对T触发器进行建模 library ieee; use ieee.std_logic_1164.all; entity tff is port ( clk: std_logic; t: in bit; q: out bit; qbar: out bit); end tff; architecture tff_arch of tff is begin process(clk) begin

我正在尝试使用VHDL对T触发器进行建模

library ieee;
use ieee.std_logic_1164.all;
entity tff is
    port (
        clk: std_logic;
        t: in bit;
        q: out bit;
        qbar: out bit);
end tff;

architecture tff_arch of tff is
begin
    process(clk)
    begin
        if (clk = '1' and t = '1')
        then
            q <= not q;
            qbar <= not qbar;
        end if;
    end process;
end tff_arch;
我认为错误的原因是,我使用的是“非q”,而q尚未初始化。如果我错了,请纠正我


那么该如何解决这个问题呢?我使用Symphony EDA免费版本正确地建模了D触发器及其测试台波形。

q
是实体的输出

您无法读取输出。就这么简单


您需要一个用于反馈循环的内部版本,然后
q
q
是实体的输出

您无法读取输出。就这么简单


您需要一个用于反馈循环的内部版本,然后
q无法很好地记住VHDL,但这可能会给您一个线索:

问题是
q
只是实体发出的一个信号,因此当您试图读取它时,没有什么可访问的

所以,为了不解决你的家庭作业,可以这样想:

您需要将
q
作为输入以访问它(可能不是您想要的),或者您需要在内部存储
q
(或者至少存储
q
的下一个值)。这可以通过将
q
(或
q\u next
)指定为
架构
部分中的
信号
来实现。例如:

architecture tff_arch of tff is
  signal q_next: std_logic;
begin

等等。这同样适用于您的
qbar
信号。

无法很好地记住VHDL,但这可能会给您一个线索:

问题是
q
只是实体发出的一个信号,因此当您试图读取它时,没有什么可访问的

所以,为了不解决你的家庭作业,可以这样想:

您需要将
q
作为输入以访问它(可能不是您想要的),或者您需要在内部存储
q
(或者至少存储
q
的下一个值)。这可以通过将
q
(或
q\u next
)指定为
架构
部分中的
信号
来实现。例如:

architecture tff_arch of tff is
  signal q_next: std_logic;
begin

等等。同样的情况也适用于您的
qbar
信号。

在过去,您无法读取输出,因此您必须:

  • 让它成为一个
    inout
    (这有点令人不快,因为你在捏造你真正想要的方向,只是为了让你能读懂它)——这很管用,但在行业中没有广泛应用(据我所知)
  • 使其成为一个
    缓冲区
    ,但它有缺点(在VHDL-2002之前),即必须使该信号的所有其余层次结构由
    缓冲区
    驱动。在我的经验中几乎从未使用过
  • 使用和中间
    信号
    (您可以读取),然后使用赋值将输出设置为该信号的值。这是实践工程师的惯用方法

自VHDL-2008以来,您可以读取输出端口(尽管声明的目的是将其仅用于验证目的)。您可能需要一个工具开关来启用VHDL-2008模式。(可能是您的特定模拟器/合成器仍然不支持VHDL-2008,这显示了EDA工具世界惊人的发展速度!)

在过去,您无法读取输出,因此您必须:

  • 让它成为一个
    inout
    (这有点令人不快,因为你在捏造你真正想要的方向,只是为了让你能读懂它)——这很管用,但在行业中没有广泛应用(据我所知)
  • 使其成为一个
    缓冲区
    ,但它有缺点(在VHDL-2002之前),即必须使该信号的所有其余层次结构由
    缓冲区
    驱动。在我的经验中几乎从未使用过
  • 使用和中间
    信号
    (您可以读取),然后使用赋值将输出设置为该信号的值。这是实践工程师的惯用方法

自VHDL-2008以来,您可以读取输出端口(尽管声明的目的是将其仅用于验证目的)。您可能需要一个工具开关来启用VHDL-2008模式。(可能是您的特定模拟器/合成器仍然不支持VHDL-2008,这显示了EDA工具世界惊人的发展速度!)

噢!对,q应该是一个输入输出位。这样做解决了问题。不,它不是inout,因为您无法在此端口上发送值。这是一个输出。如果将其更改为inout,则更改了设计视图中其他块如何使用此端口。你只需要一个本地中间信号。哦!对,q应该是一个输入输出位。这样做解决了问题。不,它不是inout,因为您无法在此端口上发送值。这是一个输出。如果将其更改为inout,则更改了设计视图中其他块如何使用此端口。您只需要一个本地中间信号。inout至少应该是触发器的自然选择吗?问题是,使用inout往往会向合成器暗示,它们应该是触发器中的三态驱动程序。你不想要也不需要。inout可以工作,但感觉不舒服。中间信号是最纯粹的方式(在工业中应用非常广泛)。我将更新答案,至少inout应该是触发器的自然选择吗?问题是,使用inout往往会向合成器暗示,它们应该是触发器中的三态驱动程序。你不想要也不需要。inout可以工作,但感觉不舒服。中间信号是最纯粹的方式(在工业中应用非常广泛)。我会更新一下答案