CONTACT | TEL : 02-728-3440, EMAIL : SALES@ASTRONLOGIC.COM
การออกแบบ ชิป FPGA เพื่อเชื่อมต่อกับสวิตช์

» การออกแบบ ชิป FPGA เพื่อเชื่อมต่อกับสวิตช์

โครงงานส่วนใหญ่ที่สร้างขึ้นจะต้องมีส่วนที่ติดต่อกับอุปกรณ์อินพุท เช่น อุปกรณ์เซ็นเซอร์ทางไฟฟ้า, สวิตช์หรือคีย์บอร์ด เป็นต้น โดยเฉพาะคีย์บอร์ดที่ต้องใช้ติดต่อกับผู้ใช้งาน ในการควบคุมระบบ ซึ่งในการเชื่อมต่อกับสวิตช์คีย์บอร์ดก็มีด้วยกันหลายแบบ แต่ที่จะยกตัวอย่างการใช้งานสวิตช์คีย์บอร์ดกับชิฟเอฟพีจีเอ 2 แบบเท่านั้นคือ
1.การเชื่อมต่อกับสวิตช์แบบโดยตรง
การเชื่อมต่อชิพเอฟพีจีเอกับสวิตช์แบบโดยตรงเป็นวิธีที่ง่ายที่สุด ดังรูปที่ 1

รูปที่ 1 การเชื่อมต่อชิพเอฟพีจีเอกับสวิตช์โดยตรง

ในการต่อกับสวิตช์จะต้องมีความต้านทานต่อ pull up เอาไว้ เมื่อมีการกดสวิตช์แต่ละตัวจะทำให้ขาของชิพเอฟพีจีเอต่อกับกราว์ด และมีค่าเป็นลอจิก " 0 " และหากไม่มีการกดสวิตช์จะทำให้ขาของชิพเอฟพีจีเอ มีสถานะเป็นลอจิก "1" ในการเขียนโปรแกรมภาษาวีเอชดีแอลเพื่อตรวจสอบสถานะของสวิตย์จะทำได้ง่ายมากดังโปรแกรมที่ 1


library ieee;
use ieee.std_logic_1164.all;

entity read_sw is
port(
sw : in std_logic_vector(3 downto 0);
data : buffer std_logic_vector(3 downto 0)
);
end read_sw;

architecture a of read_sw is
begin
data <= sw;
end a;

โปรแกรมที่ 1 โปรแกรมตรวจสอบการกดสวิตช์

รูปที่ 2 สัญลักษณ์โปรแกรมตรวจสอบการกดคีย์บอร์ด

ข้อเสียของการต่อสวิตช์แบบนี้คือจะสิ้นเปลืองจำนวนขาในการต่อกับสวิตช์เป็นอย่างมาก ซึ่งจะเป็น
เรื่องที่ค่อนข้างยุ่งยากมาก หากต้องออกแบบเป็นคีย์บอร์ด สำหรับตัวอักษรและอักขระต่างๆขนาด 100 คีย์ จะทำให้ผู้ออกแบบจะต้องจัดหาสำหรับต่อกับสวิตช์คีย์บอร์ดถึง 100 ขา ซึ่งจะทำได้ยากและสิ้นเปลืองเป็นอย่างมาก ข้อดีของการต่อสวิตช์แบบโดยตรงคือการเขียนโปรแกรมเพื่ออ่านค่าการกดสวิตช์สามารถทำได้ง่ายมาก และในการกดสวิตช์สามารถทำได้พร้อมกัน

2.การเชื่อมต่อสวิตช์แบบเมตริกซ์
การเชื่อมต่อเอฟพีจีเอกับสวิตช์แบบเมตริกซ์แสดงไว้ในรูปที่ 3 สวิตช์แต่ละตัวจะเชื่อมต่อกันแบบแถวและคอลัมน์ในรูปแบบของเมตริกซ์ ในการตรวจสอบการกดคีย์บนคีย์บอร์ดแบบเมตริกซ์ ทำได้โดยการป้อนค่าตรวจสอบค่าหนึ่งไปยังด้านแถวและตรวจสอบการเปลี่ยนแปลงที่เกิดขึ้นทางด้านคอลัมน์ หรือกล่าวได้ว่าตำแหน่งของการกดคีย์ต่างๆ ได้จากการเขียนโปรแกรมตรวจสอบการกดสวิทช์ด้านคอลัมน์ดังรูปที่ 4

รูปที่ 3 สวิตช์แบบเมตริกซ์



รูปที่ 4 การตรวจสอบการกดคีย์

จากรูปที่ 4 จะทำการตรวจสอบการกดสวิตช์ของแถวที่ 1 โดยป้อนค่าให้ทางด้าน Row ดังรูปที่ 4 แล้วมาทำการตรวจสอบข้อมูลที่ได้ ทางด้าน Column หาก Column ใดเป็น 0 ก็แสดงว่าสวิตช์ที่ต่อกับคอลัมน์นั้นได้ถูกกดลง สามารถแสดงโปรแกรมสำหรับตรวจสอบการกดคีย์บอร์ดแบบเมตริกซ์ได้ดังโปรแกรมข้างล่าง


Library ieee;
Use IEEE.Std_Logic_1164.All;

Entity Scankey4_4 is
Port( clk : in std_logic;
col : in std_logic_vector(3 downto 0);
row : out std_logic_vector(3 downto 0);
data : out std_logic_vector(3 downto 0);
rd : out std_logic
);
End Scankey4_4;

Architecture RTL of Scankey4_4 is
signal row_data : std_logic_vector(3 downto 0);
begin
row <= row_data;
Process(clk)
variable count : integer range 0 to 3 ;
begin
if (clk'EVENT) and (clk = '1') then
count := count + 1;
- - สแกนตามแนวแถว
case count is
when 0 =>
row_data <= "1110";
when 1 =>
row_data <= "1101";
when 2 =>
row_data <= "1011";
when 3 =>
row_data <= "0111";
end case;
end if;
end Process;

process(clk,col)
begin
if (clk'EVENT) and (clk = '1') then
- - ตรวจสอบว่าในการสแกนแต่ละแถวมีปุ่มไหนที่ถูกกด
case row_data is
when "1110" =>
case col is
when "1110" => data <= "0000"; rd <='0'; --0
when "1101" => data <= "0001"; rd <='0'; --1
when "1011" => data <= "0010"; rd <='0'; --2
when "0111" => data <= "0011"; rd <='0'; --3
when others => rd <= '1';
end case;

when "1101" =>
case col is
when "1110" => data <= "0100"; rd <= '0'; --4
when "1101" => data <= "0101"; rd <= '0'; --5
when "1011" => data <= "0110"; rd <= '0'; --6
when "0111" => data <= "0111"; rd <= '0'; --7
when others => rd <= '1';
end case;

when "1011" =>
case col is
when "1110" => data <= "1000"; rd <= '0'; --8
when "1101" => data <= "1001"; rd <= '0'; --9
when "1011" => data <= "1010"; rd <= '0'; --10
when "0111" => data <= "1011"; rd <= '0'; --11
when others => rd <= '1';
end case;

when "0111" =>
case col is
when "1110" => data <= "1100"; rd <= '0'; --12
when "1101" => data <= "1101"; rd <= '0'; --13
when "1011" => data <= "1110"; rd <= '0'; --14
when "0111" => data <= "1111"; rd <= '0'; --15
when others => rd <= '1';
end case;

when others =>
rd <= '1';
end case;
end if;
end process;
end RTL;


รูปที่ 5 สัญลักษณ์โปรแกรมตรวจสอบการกดคีย์บอร์ดแบบเมตรกช์แบบ 4 x 4

ข้อดีของการเชื่อมต่อสวิตช์แบบเมตริกซ์คือสามารถใช้สวิตช์ได้มาก ในขณะที่สิ้นเปลืองขาต่อใช้งานน้อย เช่นใช้ขาต่อเพียง 8 ขา ก็สามารถต่อคีย์บอร์ดได้ถึง 16 คีย์
ข้อเสียของการต่อสวิตช์แบบเมตริกซ์แบบนี้คือไม่สามารถรับการกดคีย์บอร์ดพร้อมกันได้ และต้องเขียนโปรแกรมในการตรวจสอบในการกดคีย์ที่ค่อนข้างยุ่งยากซับซ้อน