首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在嵌套的If-Else语句(VHDL)中推断Latch

在嵌套的If-Else语句(VHDL)中推断Latch
EN

Stack Overflow用户
提问于 2019-02-21 23:06:24
回答 1查看 696关注 0票数 0

我的代码存在推断锁锁的问题。我知道锁锁通常是由于没有考虑到输出的所有情况而引起的,但在这种情况下,我还没有看到任何在线例子来说明这一点。我在process语句中有一个嵌套的if-else语句,如下所示。为了快速解释我正在做的事情,在重启启动后,reset_cnt将变得很高,并开始对sck进行24次循环的计数过程,并重复它自己,输出将增加。

代码语言:javascript
复制
clock_counter: process(reset, sck, counter, output, reset_cnt, reset_done)
begin
  if (reset = '1') then
    counter <= 0;
    output <= 1;
    reset_cnt <= 1;
    reset_done <= '1';
  else
    reset_done <= '1';   -- added to fix
    reset_cnt <= 1;      -- added to fix
    output <= output;          -- added to fix (didn't work)
    if (reset_cnt AND counter = 24) then
      counter <= 0;
      output <= output + 1;
    elsif (rising_edge(sck)) then
      counter <= counter + 1;
    end if;
  end if;
end process;

最初,我遇到了3个锁存的问题: reset_done、reset_cnt和output。我添加了一些代码行(旁边有注释的代码),并且能够删除reset_done和reset_cnt的闩锁。看起来我仍然得到一个推断锁存器,因为我在嵌套的If语句中使用它。我想:

代码语言:javascript
复制
output <= output;

可能有用,但我想不行。有人知道如何修理这种闩锁吗?我要指出的是,我已经尝试将其分成两个过程语句,并将其制作成一个case语句,但这也不起作用。任何帮助或建议都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-21 23:53:55

这个代码是完全错误的。它很难修复,因为它合并了一个过程中的多个错误。

我将试着列举你的一些错误:

  1. 灵敏度列表不应使用outputreset_done
  2. 不能合成output <= output + 1;,或者在仿真中创建一个无休止的循环。
  3. 您需要将组合逻辑和顺序逻辑区分为两个过程。
  4. reset_donereset_cnt是无用的,因为它们总是'1'
  5. reset_cnt是一个整数,不能用布尔表达式counter = 24作为ANDed。
  6. 永远不要写output <= output;

我建议研究组合和顺序过程以及VHDL的编码模式。

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

https://stackoverflow.com/questions/54817633

复制
相关文章

相似问题

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