VHDL编码错误"检查时钟不支持的其他条款"

时间:2016-11-22 16:33:20

标签: if-statement vhdl vivado

我试图制作一个计数器,在每64个时钟脉冲后发出一个进位信号。当我尝试合成下面显示的代码时,(在Vivado中)我收到以下错误,

  

检查时钟后的Else子句不受支持。

(在用' !!'发出信号的行上)

我在一个不同的项目中做了一些非常相似的事情,我没有在那里得到任何错误,所以我没有真正理解错误。有什么帮助吗?

entity refresh_counter is
     port( CLK : in STD_LOGIC;
           CLR : in STD_LOGIC;
           CARRY : out STD_LOGIC);
end refresh_counter;

architecture Behavioral of refresh_counter is
begin

process(CLK)
variable tel : integer;
begin
    if (CLK'event and CLK = '1') then
        if CLR = '1' then
            tel := 0;
        end if;
    else
        if (tel < 63) then            !!
            tel := tel + 1;
        else
            CARRY <= '1';
            tel := 0;
        end if;
    end if;

end process;
end Behavioral;

1 个答案:

答案 0 :(得分:1)

正如@scary_jeff在评论部分中所提到的,您的else没有意义,因为您实际上无法实现而不是在上升沿。这是一个可以完成这项工作的实现。

该流程有两个变量n_carryn_tel。您可以将它们视为FSM的组合输出。在时钟的上升沿,这两个变量分别转移到carrytel

如果CLR为高,则转移0

n_carryn_tel逻辑在硬件中以组合方式实现。它需要tel作为输入,决策制定已在流程中的if-elsif-else序列中进行编码。

library std;
library ieee;
use ieee.std_logic_1164.all;
entity refresh_counter is
     port( CLK : in STD_LOGIC;
           CLR : in STD_LOGIC;
           CARRY : out STD_LOGIC);
end refresh_counter;

architecture Behavioral of refresh_counter is
signal tel: integer := 0;
begin

process(CLK, CLR, tel)
variable n_tel: integer := 0;
variable n_carry: STD_LOGIC := '0';
begin

    if (tel < 63) then
        n_carry := '0';
        n_tel := tel + 1;
    elsif (tel = 63) then
        n_carry := '1';
        n_tel := 0;
    else
        -- This case should never arise in practice
        n_carry := '0';
        n_tel := 0;
    end if;

    if (CLK'event and CLK = '1') then
        if CLR = '1' then
            tel <= 0;
            CARRY <= '0';
        else
            tel <= n_tel;
            CARRY <= n_carry;
        end if;
    end if;

end process;
end Behavioral;