首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用并发语句实现触发器

用并发语句实现触发器
EN

Stack Overflow用户
提问于 2017-03-10 07:35:32
回答 1查看 699关注 0票数 2

VHDL程序设计表明,组合电路采用并发语句,时序电路采用并发语句和时序语句。现在的问题是:

如果我以并发的形式编写顺序代码,会发生什么?例如,我不使用process,而是用when..else编写触发器

代码语言:javascript
复制
architecture x of y is
begin
   q <= '0' when rst=1 else
        d   when (clock'event and clock='1') else
        q;
end;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-10 09:23:23

您说:“VHDL编程中指出,组合电路使用并发语句,而时序电路则适用并发语句和顺序语句。”这根本不是事实。您可以使用并发或顺序语句对组合代码和顺序代码进行建模。

使用并发语句对顺序逻辑建模是不寻常的。(我这么说是因为我在工作中看到了很多其他人的代码,而且我几乎从来没有看到过)。然而,这是有可能的。您的代码确实存在语法错误和更基本的错误。正如您预期的那样,此修改后的代码会合成为上升边缘触发的触发器,并进行异步的、高活动的重置:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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游乐场通常是一个尝试事物的好地方(无耻的插头),但在这种情况下是不好的,因为不能在EDA游乐场上合成VHDL。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42712777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档