3

我对 VHDL 非常陌生,正在尝试弄清楚如何在 Altera Cyclone II 上做一些相当基本的事情。FPGA 有四个按钮——其中两个需要被编程来增加和减少选定的寄存器(0-F),另外两个需要被编程来增加和减少将在的值(从 00 到 FF)。那个寄存器。这是我到目前为止所拥有的:

entity raminfr is
    port (
        clk : in std_logic;
        we : in std_logic;
        a : in unsigned(3 downto 0);
        di : in unsigned(7 downto 0);
        do : out unsigned(7 downto 0)
    );
end raminfr;

architecture rtl of raminfr is
type ram_type is array (0 to 15) of unsigned(7 downto 0);
signal RAM : ram_type;
signal read_a : unsigned(3 downto 0);

begin

process (clk)
begin
    if rising_edge(clk) then
        if we = '1' then
            RAM(to_integer(a)) <= di;
        end if;
        read_a <= a;
    end if;
end process;

do <= RAM(to_integer(read_a));

end rtl;

有人可以提供一些关于如何对按钮进行编程的基本示例代码吗?

4

1 回答 1

11

您可以在 clocked 中进行简单的边沿检测process,然后对上升沿做出反应。例如:

signal lastButtonState    : std_logic := '0';

process(clk)
begin
  if(rising_edge(clk)) then
    if(buttonState = '1' and lastButtonState = '0') then      --assuming active-high
      --Rising edge - do some work...
    end if;
    lastButtonState <= buttonState;
  end if;
end process;

为了让一切正常工作,你需要确保你的按钮以某种方式去抖动。许多开发板为此都有一个硬件 RC 电路,但否则你需要在你的代码中完成它(虽然这并不难 - 网上应该有很多这样的例子)。

于 2013-01-24T07:31:08.383 回答