在VHDL编程中声明,对于组合电路,使用并发语句而对于时序电路,并发和顺序语句都适用。现在的问题是:
如果我以并发形式编写顺序代码会怎样?例如,我不使用process
并使用when..else
architecture x of y is
begin
q <= '0' when rst=1 else
d when (clock'event and clock='1') else
q;
end;
这是一个正确且可联合编码的代码吗?如果它是一个不正确的代码,那究竟是什么问题(除了形式语法错误)?
答案 0 :(得分:2)
你说:“在VHDL编程中说明,对于组合电路,并发语句用于时序电路,并发和顺序语句都适用。”那明显是错的。您可以使用并发或顺序语句对组合和顺序代码建模。
使用并发语句对顺序逻辑进行建模是不常见的。 (我说是因为我在工作中看到了很多其他人的代码,而我几乎从未见过它)。但是,这是可能的。您的代码确实存在语法错误和更基本的错误。这个修改后的代码版本合成了一个上升沿触发的触发器,具有异步,高电平有效的复位,正如您所期望的那样:
q <= '0' when rst='1' else
d when clock'event and clock='1';
语法错误是您有rst=1
而不是rst='1'
。更基本的错误是您不需要else q
。这是不必要的,因为VHDL中的信号保留先前分配的值,直到分配新值。因此,在VHDL代码建模顺序逻辑中,编写q <= q
(或其等价物)从不。在您的情况下,MCVE我构建的q
是一个输出,因此您的else q
给出了语法错误,因为您无法读取输出。
这是MCVE:
library IEEE;
use IEEE.std_logic_1164.all;
entity concurrent_flop is
port (clock, rst, d : in std_logic;
q : out std_logic);
end entity concurrent_flop;
architecture concurrent_flop of concurrent_flop is
begin
q <= '0' when rst='1' else
d when clock'event and clock='1';
end architecture concurrent_flop;
我写了一篇MCVE来检查我要说的是正确的。你也可以这样做。这样做是学习VHDL的好方法。 EDA Playground经常是尝试解决问题的好地方(无耻插件),但在这种情况下并不好,因为无法在EDA Playground上合成VHDL。