A clocked button against slow fingers.
authorMalte S. Stretz <mss@apache.org>
Thu, 2 Jul 2009 13:32:33 +0000 (15:32 +0200)
committerMalte S. Stretz <mss@apache.org>
Thu, 2 Jul 2009 13:32:33 +0000 (15:32 +0200)
bos2k9.vhd
bos2k9_t.vhd
fhw_tools/button.vhd

index 761ffe4..8e1fee2 100644 (file)
@@ -71,6 +71,9 @@ architecture board of bos2k9 is
   
   component button
     port(
+      clk : in std_logic;
+      rst : in std_logic;
+      
       input  : in  std_ulogic;
       output : out std_ulogic);
   end component;
@@ -97,10 +100,10 @@ begin
 
   --GPIO_0 <= (others => 'Z');
   
-  init_button : button port map(
+  init_button : button port map(clock_s, reset_s,
     input  => KEY(0),
     output => init_btn_s);
-  start_button : button port map(
+  start_button : button port map(clock_s, reset_s,
     input  => KEY(1),
     output => start_btn_s);
   
index 68df886..53e0e78 100644 (file)
@@ -66,6 +66,7 @@ architecture test of bos2k9_t is
   signal rxd_s   : std_logic_byte_t;
   signal spi_s   : spi_bus_t;
   
+  signal init_btn_s : std_logic;
   signal addr_sw_s : std_logic_byte_t;
   signal byte_sw_s : std_logic_byte_t;
   signal byte_dw_s : std_logic_byte_t;
@@ -89,7 +90,7 @@ begin
   SW_i_s(15 downto 8) <= byte_sw_s;
   SW_i_s(16)          <= '0';
   SW_i_s(17)          <= not reset_s;
-  KEY_i_s(0)          <= not init_s;
+  KEY_i_s(0)          <= not init_btn_s;
   KEY_i_s(1)          <= not start_s;
   KEY_i_s(3 downto 2) <= (others => '1');
   
@@ -166,6 +167,16 @@ begin
     end loop;
   end process;
   
+  button: process
+  begin
+    init_btn_s <= '0';
+    wait until rising_edge(init_s);
+    init_btn_s <= '1';
+    wait until rising_edge(clock_s);
+    wait until rising_edge(clock_s);
+    wait until rising_edge(clock_s);
+  end process;
+  
   -- mark: process
   -- begin
     -- test_s <= -1;
index 880767e..e6aed4a 100644 (file)
@@ -13,6 +13,9 @@ use ieee.std_logic_1164.all;
 
 entity button is
   port(
+    clk : in std_logic;
+    rst : in std_logic;
+  
     input  : in  std_ulogic;
     output : out std_ulogic);
 end button;
@@ -20,6 +23,21 @@ end button;
 -----------------------------------------------------------------------
 
 architecture inverted of button is
+  signal input_s  : std_logic;
+  signal output_s : std_logic;
 begin
-  output <= not input;
+  input_s <= not input;
+  output  <= output_s;
+  toggle : process(clk, rst)
+  begin
+    if rst = '1' then
+      output_s <= '0';
+    elsif rising_edge(clk) then
+      if output_s = input_s then
+        output_s <= '0';
+      elsif output_s = '0' then
+        output_s <= '1';
+      end if;
+    end if;
+  end process;
 end inverted;