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;
这是一个正确且可综合的代码吗?如果它是一个不正确的代码,那到底有什么问题(除了形式语法错误)?
你说:“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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句