【问题标题】:implementing a flip-flop with concurrent statement使用并发语句实现触发器
【发布时间】:2017-03-10 17:23:23
【问题描述】:

在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;

这是一个正确且可综合的代码吗?如果是不正确的代码,那到底有什么问题(除了语法错误)?

【问题讨论】:

    标签: concurrency vhdl


    【解决方案1】:

    您说:“VHDL编程中规定,对于组合电路,使用并发语句,而对于时序电路,并发和时序语句都适用。”。那明显是错的。您可以使用并发或顺序语句对组合代码和顺序代码进行建模。

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

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

    语法错误是您使用的是rst=1 而不是rst='1'。更根本的错误是您不需要else q。这是不必要的,因为 VHDL 中的信号保留先前分配的值,直到分配新值。因此,在 VHDL 代码建模时序逻辑中,从不需要编写 q &lt;= 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。

    【讨论】:

    • 那么你能解释一下为什么它不寻常吗?如果正常,为什么不正常?是否有任何例子可以看出时序电路的并发实现无法综合或无法工作?
    • 通常经验丰富的 VHDL 设计人员会将他们的组合逻辑与时序逻辑合并到相同的流程中。您只能使用并发语句编写相当简单的组合逻辑,因此,如果您使用并发语句编写顺序逻辑,您将受到限制。此外,除非组合逻辑导致代码具有规则结构,否则并发语句可能看起来很混乱并且难以阅读/调试。但是,我怀疑主要原因是时尚和/或品味。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2020-11-23
    • 2015-01-10
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多