วันอังคารที่ 21 เมษายน พ.ศ. 2558

การทดลองที่ 3 ออกแบบวงจรดิจิทัล ควบคุมการทำงานของ 4x4 keypadโดยใช้ภาษา VHDL

ออกแบบวงจรดิจิทัลสร้างสัญญาณ 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. สายไฟ                                                                                                                                     -  เส้น

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;

ผลการทดลอง