用并发语句实现一个触发器

时间:2017-03-10 07:35:33

标签: 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;

这是一个正确且可联合编码的代码吗?如果它是一个不正确的代码,那究竟是什么问题(除了形式语法错误)?

1 个答案:

答案 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。