ออกแบบวงจรดิจิทัลสร้างสัญญาณ PWM ควบคุมการทำงานของ 4x4 keypadโดยใช้ภาษา VHDL
รายการอุปกรณ์
1. บอร์ด Altera FPGA (WARRIOR CYCLONE3 DEV) ชิปหมายเลข EP3C10E144C8 1 บอร์ด
2. สายดาวน์โหลด ByteBlaster II Cable หรือ สายดาวน์โหลดUSB Blaster Cab 1 ชุด
3. ออสซิลโลสโคป 1 เครื่อง
4. Mini 4x4 Matrix Keyboard board 1 อัน
5. ตัวต้านทาน 470 โอม 4 ตัว
6. สายไฟ - เส้น
1. บอร์ด Altera FPGA (WARRIOR CYCLONE3 DEV) ชิปหมายเลข EP3C10E144C8 1 บอร์ด
2. สายดาวน์โหลด ByteBlaster II Cable หรือ สายดาวน์โหลดUSB Blaster Cab 1 ชุด
3. ออสซิลโลสโคป 1 เครื่อง
4. Mini 4x4 Matrix Keyboard board 1 อัน
5. ตัวต้านทาน 470 โอม 4 ตัว
6. สายไฟ - เส้น
datasheet 4x4 ETT: www.ett.co.th/product/InterfaceBoard/P.../MAN_MINI_I_15_Board.pdf
วิธีการทดลอง
จงออกแบบวงจรดิจิลัทโดยใช้ภาษา VHDL สำหรับนำไปสร้างเป็นวงจรในชิป FPGA โดยใช้บอร์ดที่มีอยู่ในห้องแล็ป วงจรดิจิทัลมี I/O ดังนี้
- CLK (input) มีความถี่ 50MHz ใช้สำหรับกำหนดจังหวะการทำงานของวงจรทั้งหมด (เป็นการออกแบบวงจรดิจิทัลแบบ Synchronous Design)
- data_row (input) เป็นอินพุตจากปุ่มกด 4x4 keypad ทำงานแบบ Active-low เพื่อใช้ในการเปลี่ยน LED จำนวน 4 ดวง ให้แสดงเป็นจำนวน binary
-data_colum (output) เป็นเอาต์พุตสำหรับนำไป ควบคุมการทำงานของ Keyboard เพื่อใช้ในการเช็คว่าแถวไหนมีการกดปุ่ม โดยจะใช้ logic '0' ในการเช็คแต่ละแถวที่มีการกด
- led (output) เป็นเอาต์พุตสำหรับนำไปควบคุมการทำงานของ LED 4 ดวง โดยส่งข้อมูลจำนวน 4 บิต
พฤติกรรมการทำงานเป็นดังนี้
- เมื่อเริ่มต้นหรือเมื่อไม่มีการกดปุ่ม จะทำให้data_row เป็น 1111 และ led เป็น 0000 ส่งออกไปยัง LED หนึ่งครั้ง(ทำให้ไม่มีไฟติด)
- เมื่อมีการกดปุ่ม ในแต่ละครั้ง จะมีการเปลี่ยน led 4บิต แล้วส่งออกไปยัง LED เพื่อแสดงค่าไป binary ตามเลขที่กด
แนวทางการออกแบบและทดสอบ
- ออกแบบวงจรโดยใช้ภาษา VHDL
- ทดลองเช็คที่ละแถวดูก่อนเพื่อให้แน่ใจว่าค่าที่แสดงออกมากับแถวที่กดมีความสอบคล้องกันแล้วจึงพัฒนาไปเป็นกดแล้วแสดงไฟแบบ ไบนารี่
โค้ดวงจรดิจิทัลภาษา VHDL
ผลการทดลอง
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity keypad4x4 is
port(
clk : in std_logic;
data_row :in std_logic_vector(3 downto 0):="1111";
data_colum : out std_logic_vector(3 downto 0);
led : out std_logic_vector(3 downto 0):="0000"
);
end keypad4x4;
architecture behave of keypad4x4 is
signal data : std_logic_vector(15 downto 0):=x"FFFF";
type state_type is (S0,S1,S2,S3);
signal count : integer:= 0;
signal state : state_type :=S0;
signal resetdata : std_logic_vector(3 downto 0):="1111";
begin
process(clk) begin
if rising_edge(CLK)then
case state is
when S0=>
data_colum <= "0111";
data(3 downto 0) <= "1111";
data(3 downto 0) <= data_row;
if (data(3 downto 0) = "0111") then
led <="0001";--1
elsif (data(3 downto 0) = "1011") then
led <="0010";--2
elsif (data(3 downto 0) = "1101") then
led <="0011";--3
elsif (data(3 downto 0) = "1110") then
led <="0100";--4
else
led <="0000";
end if;
state <=S1;
when S1=>
data_colum <= "1011";
data(7 downto 4) <= "1111";
data(7 downto 4) <= data_row;
if (data(7 downto 4) = "0111") then
led <="0101";--5
elsif (data(7 downto 4) = "1011") then
led <="0110";--6
elsif (data(7 downto 4) = "1101") then
led <="0111";--7
elsif (data(7 downto 4) = "1110") then
led <="1000";--8
else
led <="0000";
end if;
state <=S2;
when S2=>
data_colum <= "1101";
data(11 downto 8) <= "1111";
data(11 downto 8) <= data_row;
if (data(11 downto 8) = "0111") then
led <="1001";--9
elsif (data(11 downto 8) = "1011") then
led <="1010";--10
elsif (data(11 downto 8) = "1101") then
led <="1011";--11
elsif (data(11 downto 8) = "1110") then
led <="1100";--12
else
led <="0000";
end if;
state <=S3;
when S3=>
data_colum <= "1110";
data(15 downto 12) <= "1111";
data(15 downto 12) <= data_row;
if (data(15 downto 12) = "0111") then
led <="1101";--13
elsif (data(15 downto 12) = "1011") then
led <="1110";--14
elsif (data(15 downto 12) = "1101") then
led <="1111";--15
elsif (data(15 downto 12) = "1110") then
led <="0000";--0
else
led <="0000";
end if;
state <=S0;
end case;
end if;
end process;
end behave;
|

