我试图制作一个计数器,在每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;
答案 0 :(得分:1)
正如@scary_jeff在评论部分中所提到的,您的else
没有意义,因为您实际上无法实现而不是在上升沿。这是一个可以完成这项工作的实现。
该流程有两个变量n_carry
和n_tel
。您可以将它们视为FSM的组合输出。在时钟的上升沿,这两个变量分别转移到carry
和tel
。
如果CLR
为高,则转移0
。
n_carry
和n_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;