1

我正在尝试使用 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;

但我得到的错误是

Error: CSVHDL0168: tff.vhdl: (line 17): Identifier 'q' is not readable
Error: CSVHDL0168: tff.vhdl: (line 18): Identifier 'qbar' is not readable

我认为错误的原因是,当 q 尚未初始化时,我使用的是“not q”。在这里纠正我,如果我错了。

以及如何解决这个问题?我已经使用 Symphony EDA 免费版正确建模了 D 触发器及其测试台波形。

4

3 回答 3

3

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

  • 使它成为一个inout(这有点令人不快,因为你在捏造你真正意思的方向,只是为了你可以阅读它) - 这很有效,但在工业中并未广泛使用(据我所知)
  • 使它成为一个buffer,但它有缺点(在 VHDL-2002 之前),因为您必须使该信号的所有其余层次结构由buffers 驱动。在我的经验中几乎从未使用过。
  • 使用和中间signal(您可以阅读),然后使用赋值将输出设置为该信号的值。这是实践工程师的惯用方式。

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

于 2011-10-27T09:04:22.783 回答
1

q是实体的输出。

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

您需要一个用于反馈循环的内部版本,然后q <= local_q;

于 2011-10-27T08:49:41.857 回答
0

不能很好地记住 VHDL,但这可能会给你一个线索:

问题是这q只是你实体的一个信号,所以当你尝试读取它时没有什么可以访问的。

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

您需要q作为输入才能访问它(可能不是您想要的),或者您需要在内部存储q(或至少下一个值q)。这可以通过在部件中指定q(或q_next)作为 a来完成。例如:signalarchitecture

architecture tff_arch of tff is
  signal q_next: std_logic;
begin

等等。你的qbar信号也是如此。

于 2011-10-27T08:52:45.990 回答