繁体   English   中英

用并发语句实现触发器

[英]implementing a flip-flop with concurrent statement

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM