2004年04月13日

VHDLはじめました

「FPGAボードで学ぶ論理回路設計」で遊んでいます。 今回はチャタリング対策を少々。 前回の続きで、チャタリング対策を行ってみます。 クロックを分周して10mSをつくり、その単位でボタンが押されているかどうか調べています。3回連続同じ値であれば接点の状態が安定したと見なしています。主なところはこんなの:
---
entity test7 is
	port (
		sw_in  : in  std_logic;
		reset_in  : in  std_logic;
		clk  : in  std_logic;
		led_out: out std_logic_vector(7 downto 0)
	);
end test7;

architecture rtl of test7 is
signal counter: std_logic_vector(3 downto 0);
signal sec_clk: integer range 0 to (330000-1);
signal older_sw: std_logic;
signal oldest_sw: std_logic;
signal prev_state: std_logic;
begin
	process (clk)
	begin
		if clk'event and clk = '1' then
			sec_clk <= sec_clk + 1;
			if sec_clk = 0 then
				oldest_sw <= older_sw;
				older_sw <= sw_in;
			end if;
		end if;
	end process;

	process (clk, reset_in)
	begin
		if reset_in = '0' then
			counter <= "0000";
		elsif clk'event and clk = '1' then
			if sw_in = '0' and older_sw = '0' and oldest_sw = '0' then
				if prev_state = '1' then
					counter <= counter + 1;
					prev_state <= '0';
				end if;
			else
				prev_state <= '1';
			end if;
		end if;
	end process;
---