我需要在vhdl中编码键盘编码器。我想用4个州来做。当在columnn1扫描row1,row2,row2,row4时。根据我的说法,这样的4个州应该足够了,但我从互联网上找到的一个例子就是8个州:
key_scanner_sm : process (clk)
begin -- process key_scanner
if clk'event and clk = '1' then
if state_inc = '1' then
-- reset scan_complete
scan_complete <= '0';
case key_state is
when pulse_row_1 =>
key_read <= (others => '0');
key_row <= "0001";
key_state <= read_row_1;
when read_row_1 =>
case key_col is
when "0001" => key_read <= X"31"; -- 1
when "0010" => key_read <= X"32"; -- 2
when "0100" => key_read <= X"33"; -- 3
when "1000" => key_read <= X"41"; -- A
when others => null;
end case;
key_state <= pulse_row_2;
when pulse_row_2 =>
key_row <= "0010";
key_state <= read_row_2;
when read_row_2 =>
case key_col is
when "0001" => key_read <= X"34"; -- 4
when "0010" => key_read <= X"35"; -- 5
when "0100" => key_read <= X"36"; -- 6
when "1000" => key_read <= X"42"; -- B
when others => null;
end case;
key_state <= pulse_row_3;
when pulse_row_3 =>
key_row <= "0100";
key_state <= read_row_3;
when read_row_3 =>
case key_col is
when "0001" => key_read <= X"37"; -- 7
when "0010" => key_read <= X"38"; -- 8
when "0100" => key_read <= X"39"; -- 9
when "1000" => key_read <= X"43"; -- C
when others => null;
end case;
key_state <= pulse_row_4;
when pulse_row_4 =>
key_row <= "1000";
key_state <= read_row_4;
when read_row_4 =>
case key_col is
when "0001" => key_read <= X"2A"; -- *
when "0010" => key_read <= X"30"; -- 0
when "0100" => key_read <= X"23"; -- #
when "1000" => key_read <= X"44"; -- D
when others => null;
end case;
key_state <= pulse_row_1;
scan_complete <= '1';
when others => null;
end case;
end if;
end if;
end process key_scanner_sm;
这背后是否有充分的理由,有人知道吗?
答案 0 :(得分:1)
您提供的示例需要额外的状态,因为它是作为单个case语句实现的。对key_row
的分配需要一个额外的周期才能在key_col
被读取之前生效。由于这是一个简单的循环扫描,因此可以通过从前一个pulse_row_n
状态分配key_row
的下一个值来消除read_row_n
个状态