Concurrency 用并发语句实现触发器

Concurrency 用并发语句实现触发器,concurrency,vhdl,Concurrency,Vhdl,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; y的架构x是 开始 你说:“V

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;
y的架构x是
开始
你说:“VHDL编程中规定,对于组合电路,使用并发语句,而对于时序电路,同时使用并发语句和时序语句。”。这根本不是事实。您可以使用并发语句或顺序语句对组合代码和顺序代码进行建模

使用并发语句对顺序逻辑建模是不常见的。(我这么说是因为我在工作中看到了很多其他人的代码,但我几乎从未见过)。然而,这是可能的。您的代码确实存在语法错误和更基本的错误。此修改版本的代码合成为一个具有异步、主动高复位的上升沿触发触发器,如您所料:

q <= '0' when rst='1' else
      d  when clock'event and clock='1';

我写了一个MCVE来检查我要说的是否正确。你也可以这么做。这样做是学习VHDL的好方法。EDA操场通常是一个尝试的好地方(无耻的插件),但在这种情况下并不好,因为人们无法在EDA操场上合成VHDL。

那么,您能解释一下为什么它不寻常吗?如果可以,为什么不寻常?有没有任何例子可以说明时序电路的并行实现无法合成或无法工作?通常有经验的VHDL设计人员会将其组合逻辑与时序逻辑合并到同一个过程中。您只能使用并发语句编写相当简单的组合逻辑,因此,如果您使用并发语句编写顺序逻辑,您将限制自己。此外,除非组合逻辑产生具有规则结构的代码,否则并发语句可能看起来一团糟,难以读取/调试。然而,我怀疑主要原因是时尚和/或品味。
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;