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

» การออกแบบ FPGA เพื่อตรวจสอบ การกดสวิตช์แบบเมตริกขนาด 4 x 4

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

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

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

รูปที่ 2 เมื่อ SW1 ถูกกด

เริ่มต้นตรวจสอบการกดสวิตช์ในแถว ROW1 จะต้องกำหนดให้ ROW1 มีค่าเป็นลอจิก ’0’ และ ROW2 – ROW4 มีค่าเป็นลอจิก ‘1’ หลังจากนั้นจึงพิจารณาค่าที่รับมาได้จาก COLUM1 – COLUM4 หาก COLUM1 มีค่าเท่ากับลอจิก ‘0’ แสดงว่า SW1 ถูกกด หาก COLUM2 มีค่าเท่ากับลอจิก ‘0’ แสดงว่า SW2 ถูกกด หาก COLUM3 มีค่าเท่ากับลอจิก ‘0’ แสดงว่า SW3 ถูกกดและหาก COLUM4 มีค่าเท่ากับลอจิก ‘0’ แสดงว่า SW4 ถูกกด เมื่อทำการตรวจสอบการกดสวิตช์ในแถว ROW1 เสร็จแล้วก็ทำการตรวจสอบการกดสวิตช์ในแถวต่อไปคือแถว ROW2 ,ROW3 และ ROW4 ตามลำดับซึ่งหลักการก็จะคล้ายๆกัน
จากหลักการดังกล่าวข้างต้น สามารถนำมาเขียนเป็น Flow Chart แสดงการทำงานของวงจร Scankey ขนาด 4 X 4 ได้ดังรูปที่ 3

รูปที่ 3 แสดง Flowchart การทำงานของวงจร Scankey ขนาด 4X4

จาก Flowchart ในรูปที่ 3 เราจะนำมาออกแบบวงจร Scankey โดยใช้ FPGA เพื่อทำการตรวจสอบการกดสวิตช์ต่างๆ และแสดงค่าการกด SW1 – SW16 เป็นค่า “0000” ถึง “1111” ในส่วนของการออกแบบวงจรภายใน FPGA นั้น เราจะใช้โปรแกรม MAX+plus II เป็นโปรแกรมสังเคราะห์วงจร และใช้ภาษา VHDL ในการบรรยายลักษณะพฤติกรรมของวงจร Scankey ซึ่งวงจรที่ออกแบบเสร็จเรียบร้อยแล้ว เราสามารถนำไปประยุกต์ใช้งานเป็นส่วนอินพุทรับค่าจากการกดสวิตช์ของระบบต่างๆ ได้อีกด้วย
การออกแบบวงจร Scan key โดยใช้ FPGA
1.เปิดโปรแกรม MAX+plus II และตั้งชื่อโปรเจคเป็น Scankey4x4 และเลือกชนิดของไฟล์ที่จะสร้างเป็น Text Editor File ดังรูปที่ 4

รูปที่ 4 เลือกชนิดของไฟล์ที่จะสร้างเป็น Text Editor File

2.หลังจากนั้นให้เขียนภาษา VHDL เพื่ออธิบายลักษณะพฤติกรรมของวงจร Scankey ดังแสดงในรูปที่ 5

library ieee;
use ieee.std_logic_1164.all;
entity scankey4x4 is
port(
clk : in std_logic;
colum : in std_logic_vector(3 downto 0);
row : out std_logic_vector(3 downto 0);
data : out integer range 0 to 15;
data_tig : out std_logic
);
end scankey4x4;

Architecture RTL of scankey4x4 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
if count <= 3 then
count := count + 1;
else count := 0;
end if;
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,colum)
begin
if (clk'EVENT) and (clk = '1') then
case row_data is

case colum is
when "1110" => data <= 0; data_tig <='1'; --0
when "1101" => data <= 1; data_tig <='1'; --1
when "1011" => data <= 2; data_tig <='1'; --2
when "0111" => data <= 3; data_tig <='1'; --3
when others => data_tig <= '0';
end case;

when "1101" =>
case colum is
when "1110" => data <= 4; data_tig <= '1'; --4
when "1101" => data <= 5; data_tig <= '1'; --5
when "1011" => data <= 6; data_tig <= '1'; --6
when "0111" => data <= 7; data_tig <= '1'; --7
when others => data_tig <= '0';
end case;

when "1011" =>
case colum is
when "1110" => data <= 8; data_tig <= '1'; --8
when "1101" => data <= 9; data_tig <= '1'; --9
when "1011" => data <= 10; data_tig <= '1'; --10
when "0111" => data <= 11; data_tig <= '1'; --11
when others => data_tig <= '0';
end case;

when "0111" =>
case colum is
when "1110" => data <= 12; data_tig <= '1'; --12
when "1101" => data <= 13; data_tig <= '1'; --13
when "1011" => data <= 14; data_tig <= '1'; --14
when "0111" => data <= 15; data_tig <= '1'; --15
when others => data_tig <= '0';
end case;
when others => data_tig <= '0';
end case;
end if;
end process;
end RTL;

รูปที่ 5 ภาษา VHDL ที่เขียนขึ้น

3.หลังจากนั้นให้ทำการบันทึกเป็นไฟล์ชื่อ Scankey4x4.vhd และทำการตรวจสอบไฟล์ VHDL ที่เขียนว่าถูกต้องตามหลักไวยากรณ์หรือไม่ โดยเลือกที่เมนู File เ Project เ Save & Check จากนั้นจะมี Dialog Compiler ปรากฎขึ้นมาดังรูปที่ 6 หากมี errors หรือ warning ให้ทำการตรวจสอบโค็ดภาษา VHDL ว่าตรงกับรูปที่ 5 หรือไม่ และให้ทำการแก้ไขให้เรียบร้อย

รูปที่ 6 การตรวจสอบไวยากรณ์เป็นที่เรียบร้อย

4.เมื่อทำการตรวจสอบไวยากรณ์ผ่านเป็นที่เรียบร้อยแล้ว ให้กำหนดเบอร์ FPGA ที่จะใช้งาน โดยเลื่อนเมาส์ไปคลิกที่ เมนู Assign เ Device.. จะปรากฏ Dialog Device ขึ้นมาให้ทำการเลือก Device Family เป็น FLEX10K และเลือกเบอร์ FPGA เป็น EPF10K10LC84-4

รูปที่ 7 เลือกเบอร์ FPGA เป็น EPF10K10LC84-4

5.หลังจากนั้นให้ทำการ Compiler ภาษา VHDL ที่ได้เขียนขึ้น โดยเลื่อนเมาส์ไปคลิกที่ MAX+plus II เ Compiler จะมี Dialog Compiler ปรากฎขึ้นมา ให้เลื่อนเมาส์มาคลิกที่ปุ่ม Start ดังรูปที่ 8

รูปที่ 8 Dialog Compiler

6.ขั้นตอนต่อไปจะเป็นการจำลองการทำงาน (Simulate) ของวงจร Scankey ให้สร้างไฟล์ขึ้นมาใหม่โดยเลือกชนิดของไฟล์เป็นแบบ Waveform Editor File ก่อนทำการ Simulate เราจะต้องกำหนดลักษณะของสัญญาณอินพุทให้แก่วงจรก่อน โดยการโหลด Node ต่างๆ เข้ามาโดยใช้เมนู Node / Enter Nodes from SNF… ซึ่งจะมีไดอะล็อก Enter Nodes from SNF ปรากฏขึ้นมา ต่อไปให้คลิกที่ปุ่ม List เพื่อแสดง Node ต่างๆ ที่อยู่ในวงจรขึ้นมา จากนั้นเลือก Node ที่เป็น input และ output ทั้งหมดที่อยู่ใน Listbox ทางด้านซ้ายโดยการดับเบิ้ลคลิกทุกๆ รายการที่อยู่ในช่องนี้ เราจะพบว่า Node ต่างๆ จะเข้าไปอยู่ใน Listbox ทางด้านขวาหลังจากการดับเบิลคลิกดังรูปที่ 9

รูปที่ 9 การเลือก Node ของ input กับ output

7.กำหนดเวลาสิ้นสุดการ Simulate (End Time) ให้กับโปรแกรมจากเมนู File / End Time… ให้ใส่ค่า End Time เท่ากับ 0.5 us ซึ่งจะเป็นการบอกให้โปรแกรมทำการ Simulate ตั้งแต่ 0.0 us จนถึง 0.5 us และกำหนด Grid Size ให้มีค่าเท่ากับ 20.0 nS ทำการกำหนดรูปแบบสัญญาณให้กับอินพุทต่างๆ โดยการ คลิกที่ CLK ที่ Waveform Editor ให้มีแถบดำปรากฏขึ้นมาหลังจากนั้นทำการกำหนดรูปแบบสัญญาณให้มีลักษณะเป็นพัลซ์โดยใช้เมนู Edit / Overwrite / Clock ในช่อง Multiply By ให้ใส่ 1 แล้วกดที่ปุ่ม OK ซึ่งจะเป็นการกำหนดให้สัญญาณในช่วงลอจิก ‘1’ และลอจิก ‘0’ มีค่าเวลาเป็น 1 เท่าของ Grid Size สำหรับอินพุท COLUM กำหนดให้ช่วงเวลาระหว่าง 160.0 nS ถึง 200.0 nS ให้มีค่าเท่ากับ “1110” ดังรูปที่ 10 และทำการบันทึกเป็นไฟล์ชื่อ Scankey4x4.scf

รูปที่ 10 สัญญาณของอินพุท CLK และ COLUM

8.หลังจากนั้นทำการ Simulate โดยการลื่อนเมาส์ไปคลิกที่ MAX+plus II เ Simulate คลิก Start จะได้ผลการ Simulate ดังรูปที่ 11

รูปที่ 11 ผลการจำลองการทำงาน

ทดสอบสู่การนำไปใช้งานจริง
ในการทดสอบจะทำการทดสอบการทำงานของวงจร Scankey ที่ได้ออกแบบมาว่าสามารถทำงานได้ถูกต้องหรือไม่ โดยจะทำการทดสอบกับบอร์ดทดลอง FPGA รุ่น WIZARD FLEX-A01 ของบริษัทแอสทรอนลอ-จิกรีเสิร์ธแอนด์ดิวิลอปเมนต์ จำกัด ดังรูปที่ 12


รูปที่ 12 บอร์ดทดลอง FPGA รุ่น WIZARD FLEX-A01

ภายในบอร์ดทดลอง FPGA รุ่น WIZARD FLEX-A01 จะประกอบด้วย FPGA ของบริษัท ALTERA ในตระกูล FLEX10K เบอร์ EPF10K10LC84-4 เป็น FPGA ที่ประกอบด้วยจำนวนเกตุมากถึง 10,000 เกต Logic element 576 LEs RAM ภายใน 6,144 Bits และอุปกรณ์อินพุท/เอาท์พุทที่จำเป็นสำหรับการทดลองวงจรดิจิตอล เช่น คอนเน็กเตอร์สำหรับการสื่อสารอนุกรม แบบ DB9 ตัวผู้ 1 ชุดพร้อมไอซีตัวแปลงระดับสัญญาณดิจิตอลเป็นระดับของ RS-232 , สวิตช์เมตริกช์ขนาด 4 x 4 , สวิตช์แบบกดติด – ปล่อยดับ 4 ตัว , ดิพสวิตช์ 8 บิต 1 ชุด , อินพุทแบบ Opto Isolator 4 ช่อง , เอาท์พุทแบบ Relay 2 ชุด , ไดโอดเปล่งแสง 8 ดวง , ชุดแสดงผล 7-Segment 6 หลักชนิด Common Anode แบบ Multiplex , BUZZER 1 ชุด และโมดูลออสซิเลเตอร์ความถี่ 9.600 MHz 1 ชุด ก่อนที่จะโปรแกรมวงจรที่ได้ออกแบบไว้ลงชิฟ FPGA จะต้องทำการจัดตำแหน่งขาของอินพุท / เอาท์พุทของวงจรที่ได้ออกแบบมาให้ตรงกับตำแหน่งขาของ FPGA บนบอร์ดทดลองที่มีอุปกรณ์ต่างๆ ต่ออยู่ โดยมีขั้นตอนต่างๆดังนี้

9.จัดตำแหน่งขาของ FPGA โดยเลื่อนเมาส์ไปคลิกที่ MAX+plus II เ Floorplan Editor หลังจากนั้นจะมี Dialog Floorplan Editor ปรากฎขึ้นมาให้ทำการจัดตำแหน่งขาของอินพุท / เอาท์พุทของวงจร ให้ตรงกับตำแหน่งขาของ FPGA ที่มีอุปกรณ์นั้นๆ ต่ออยู่บนบอร์ดทดลอง โดยจะจัดให้อินพุท COLUM[3..0] ตรงกับตำแหน่งขา FPGA ที่มีสวิตช์ต่ออยู่ทางด้าน COLUM , เอาท์พุท ROW[3..0] ตรงกับตำแหน่งขา FPGA ที่มีสวิตช์ต่ออยู่ทางด้าน ROW , DATA[3..0] ตรงกับตำแหน่งขา FPGA ที่มี LED[3..0] ต่ออยู่ และ DATA_TIG ตรงกับตำแหน่งขา FPGA ที่มี LED4[3..0] ต่ออยู่ ดังนี้

CLK ต่อกับขาที่ 43
ROW0 ต่อกับขาที่ 70
ROW1 ต่อกับขาที่ 71
ROW2 ต่อกับขาที่ 72
ROW3 ต่อกับขาที่ 73
COLUM0 ต่อกับขาที่ 65
COLUM1 ต่อกับขาที่ 66
COLUM2 ต่อกับขาที่ 67
COLUM3 ต่อกับขาที่ 69
DATA0 ต่อกับขาที่ 27
DATA1 ต่อกับขาที่ 25
DATA2 ต่อกับขาที่ 24
DATA3 ต่อกับขาที่ 23
DATA_TIG ต่อกับขาที่ 22

รูปที่ 13 เมื่อจัดตำแหน่งขา FPGA เรียบร้อยแล้ว

10.เมื่อจัดตำแหน่งขาใหม่เป็นที่เรียบร้อยแล้ว ให้ทำการบันทึกและ Compiler อีกครั้ง File เ Project เ Save & Compile เมื่อ Compile เสร็จแล้วให้ทำการโปรแกรมวงจร Scankey ที่ได้ออกแบบมาลงบอร์ดทดลอง ดังรูปที่ 14

รูปที่ 14 โปรแกรมลงบอร์ดทดลอง

รูปที่ 15 การต่อวงจร FPGA กับสวิตช์เมตริกซ์ แสดงผลการกดสวิตช์ที่ LED

รูปที่ 16 สัญลักษณ์ของวงจร Scankey ขนาด 4x4

ทดลองกดสวิตช์ที่เมทตริกช์สวิทช์จะเห็นว่า LED0-LED3 จะสว่างตามค่าตำแหน่งของสวิตช์ที่ถูกกดและเมื่อมีการกดสวิตช์ LED4 จะสว่าง เราสามารถนำวงจร Scankey ที่ออกแบบมาไปประยุกต์ใช้งานเป็นส่วนอินพุทใช้สำหรับติดต่อกับผู้ใช้งาน ในการควบคุมระบบ หรือนำไปแก้ไขเป็นวงจร Scankey ที่มีจำนวนสวิตช์มากกว่านี้ ข้อดีของการเชื่อมต่อสวิตช์แบบเมตริกซ์คือสามารถใช้สวิตช์ได้มาก ในขณะที่สิ้นเปลืองขาต่อใช้งานน้อย เช่นใช้ขาต่อเพียง 8 ขา ก็สามารถต่อเป็นคีย์บอร์ดได้ถึง 16 คีย์ ส่วนข้อเสียของการต่อสวิตช์แบบเมตริกซ์แบบนี้คือไม่สามารถรับการกดสวิตช์พร้อมกันได้ และต้องเขียนโปรแกรมในการตรวจสอบในการกดคีย์ที่ค่อนข้างยุ่งยากซับซ้อน สามารถหาข้อมูลหรือตัวอย่างเพิ่มเติ่มและเยี่ยมชมได้ที่ www.astronlogic.com