0

我想使用两个开关控制变量的值。一个用于增加值,而另一个用于减少值。我应该如何修改这段代码。错误表示变量计数是不可综合的。我已经尝试了很多,但无法弄清楚到底是什么问题。

错误:Xst:827 - 第 34 行:信号counting0 无法合成,同步描述错误。当前软件版本不支持您用于描述同步元素(寄存器、内存等)的描述样式。

library IEEE;
    use IEEE.std_logic_1164.ALL;
    use IEEE.numeric_std.ALL;

entity counts is
port(
        btn_up  : in std_logic;
        reset : IN  STD_LOGIC;
        btn_dn  : in std_logic;
        counted : out std_logic_vector(8 downto 0)
        );
end entity counts;

architecture behaviour of counts is
  signal counter : std_logic_vector(8 downto 0);
begin

  btupprocess : process(btn_up,reset,counter)
    variable counting : unsigned(8 downto 0);
  begin
    counting := unsigned(counter);
    if(reset = '1') then
      counting := (others => '0');
    elsif (rising_edge(btn_up)) then
      if(counting > 399) then
        counting := counting - 1;
      else
        counting := counting + 1;
      end if;
    end if;
    counter <= std_logic_vector(counting);
  end process;

  btndnprocess : process(btn_dn,counter)
    variable counting : unsigned(8 downto 0);
  begin
    counting := unsigned(counter);
    if (falling_edge(btn_dn)) then
      if(counting < 200) then
        counting := counting + 1;
      else
        counting := counting - 1;
      end if;
    end if;
    counter <= std_logic_vector(counting);
  end process;
  counted <= counter;
end behaviour;
4

1 回答 1

1

尽管在某些情况下可以从两个不同的进程驱动信号,但在这种情况下有更好的方法。

您的问题的可能解决方案是:

  • clock向您的实体添加输入;您可能应该使用同步设计
  • 重写您的架构以使用三个进程,每个进程驱动一个信号:
    • 一个进程将去抖动并检测到上升沿btn_up;这个过程会产生信号btn_up_rising_edge
    • 一个进程将去抖动并检测到上升沿btn_dn;这个过程会产生信号btn_dn_rising_edge
    • 第三个进程将读取btn_up_rising_edgeand btn_dn_rising_edge,并酌情增加或减少计数
  • 在所有三个过程中,您的敏感列表应包含clockreset仅包含

您可以在此处找到带有去抖动器的边缘检测器示例:https ://electronics.stackexchange.com/questions/32260/vhdl-debouncer-circuit

于 2013-10-13T13:01:19.547 回答