错误:标识符“q”在T触发器的体系结构中不可读

时间:2011-10-27 08:43:26

标签: 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
        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触发器及其测试台波形。

3 个答案:

答案 0 :(得分:3)

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

  • 使它成为inout(这有点令人不愉快,因为你正在捏造你真正意味着的方向,只是为了你可以阅读它) - 这有效,但在工业中并没有被广泛使用(就我而言) '我知道)
  • 使它成为buffer,但是它具有缺点(在VHDL-2002之前),因为你必须完成由buffer驱动的该信号的所有其余层次结构。几乎从未用过我的经验。
  • 使用和中间signal(您可以读取),然后使用赋值将输出设置为该信号的值。这是在执业工程师中这样做的惯用方式。

从VHDL-2008开始,你可以读取输出端口(尽管这样做的目的仅仅是用于验证目的)。您可能需要工具切换才能启用VHDL-2008模式。 (可能您的特定模拟器/合成器仍然不支持VHDL-2008,它显示了EDA工具世界中惊人的发展速度!)

答案 1 :(得分:1)

q是实体的输出。

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

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

答案 2 :(得分:0)

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

问题是q只是您实体的信号,所以当您尝试阅读时无法访问。

所以,为了不解决你的功课,请这样想:

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

architecture tff_arch of tff is
  signal q_next: std_logic;
begin

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