我正在尝试使用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触发器及其测试台波形。
答案 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
信号也是如此。