VHDL,多重复位计数器

时间:2013-12-12 02:58:03

标签: asynchronous vhdl reset

我需要一个可以在达到800时重置的计数器,或者当输入中出现下降沿时,我会收到错误,例如“不支持的时钟语句”或“无法合成错误的同步描述”

我尝试了几件事,我需要这样的东西

if rising_edge(clk) then
  if Counter >= 800 OR rising_edge(X) then
     Counter <= (others => '0');
  else
     Counter <= Counter + 1;
end if

X是重置计数器的输入信号,计数器是STD_LOGIC_VECTOR

谢谢你:)

2 个答案:

答案 0 :(得分:0)

它表示“错误同步”描述,因为您尝试用多个时钟源描述寄存器。有一些FPGA系列支持这一点,但这种情况很少见且不常见。

首先,你写了“输入中的下降沿”然后使用了“rising_edge(X)”......

其次,没有办法计数器是std_logic_vector与你做整数常量的比较。我假设至少未签名。当然,除非您使用已弃用的软件包 - 您不应该使用它!

第三,你没有提到X与clk之间的任何关系。

标准解决方案是

counter_p : process (
    clk,
    reset
    )
begin

    if reset = '0' then

        counter <= 0;

    elsif rising_edge(clk) then

        counter <= counter + 1;

        if (counter = 800) then
            counter <= 0;
        end if;

    end if;

end process counter_p;

如果X是同步的,则执行同步复位。

如果你真的只需要在下降沿进行异步复位 - 这意味着当复位被置位时,就在断言边沿之后的时钟上 - 那么你将不得不求助于使用clk和移位寄存器进行过采样,测试下降边缘并从中生成(a)同步复位。

答案 1 :(得分:0)

除时钟外,您不能在任何信号的上升沿动作。您必须查看先前的值和当前值,并确定它是否“上升”。本周似乎有很多类似的问题!

例如: