我想使用两个开关控制变量的值。一个用于递增值,而另一个用于递减值。我应该如何改变这段代码。 错误说变量计数是不可合成的。 我已经尝试了很多,但无法弄清楚究竟是什么问题。
错误:Xst:827 - 第34行:无法合成信号计数0,同步描述错误。当前软件版本不支持您用于描述同步元素(寄存器,内存等)的描述样式。
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;
答案 0 :(得分:1)
虽然在某些情况下可以从两个不同的过程中驱动信号,但在这种情况下有更好的方法。
您问题的可能解决方案是:
clock
输入;你可能应该使用同步设计btn_up
上升的边缘;此过程将生成信号btn_up_rising_edge
btn_dn
上升的边缘;此过程将生成信号btn_dn_rising_edge
btn_up_rising_edge
和btn_dn_rising_edge
,并根据需要递增或递减计数clock
和reset
您可以在此处找到带有去抖动器的边缘检测器的示例:https://electronics.stackexchange.com/questions/32260/vhdl-debouncer-circuit