在嵌套的If-Else语句(VHDL)中推断锁存器

时间:2019-02-21 23:06:25

标签: vhdl fpga

我的代码推断出的闩锁有问题。我知道闩锁通常是由于没有考虑到输出的所有情况造成的,但是在这种情况下,我还没有看到任何在线案例可以解决这一问题。我在流程语句中有一个嵌套的if-else语句,如下所示。为了快速解释我在做什么,在启动复位后,reset_cnt将变高并启动一个计数过程,以进行最多24个周期的sck并重复其自身,并且输出将递增。

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和输出。我添加了一些代码行(带有注释的代码行),并且能够删除reset_done和reset_cnt的闩锁。看起来我仍然可以得到推断出的闩锁,因为我在嵌套的If语句中使用了它。我以为:

output <= output;

可能会工作,但我想不会。有谁知道如何解决这种闩锁?我应该提到,我曾尝试将其拆分为2个流程语句,然后将其制作为case语句,但这也不起作用。任何帮助或建议,我们将不胜感激!

1 个答案:

答案 0 :(得分:3)

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

我将尝试列举您的一些错误:

  1. 敏感度列表不应使用outputreset_done
  2. output <= output + 1;无法合成,否则将在仿真中造成无限循环
  3. 您需要将组合逻辑和顺序逻辑分为两个过程
  4. reset_donereset_cnt是无用的,因为它们总是'1'
  5. reset_cnt是一个整数,不能与表达式counter = 24的布尔值进行AND运算。
  6. 从不写output <= output;

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