วันพฤหัสบดีที่ 20 พฤศจิกายน พ.ศ. 2557

LED shift

วัตถุประสงค์

1. ฝึกทักษะการเขียน code ของโปรแกรม
 2.ฝึกการสังเกต และ แก้ไข code เมื่อเกิดบัค

อุปกรณ์ที่ใช้

1. FPGA Board                                                                          1 อัน


โจทย์
จงสร้างวงจรดิจิทัลสำหรับ FPGA ด้วยภาษา VHDL ที่ทำงานได้ดังต่อไปนี้
- ทำงานด้วย CLK ความถี่ 50 MHz
- มีอินพุต PB จากปุ่มกด push-button (active-low) หนึ่งชุดที่อยู่บนบอร์ด FPGA
- มีเอาต์พุต LEDS(7:0) ซึ่งนำไปต่อกับ LED 8 ดวงที่อยู่บนบอร์ด FPGA
- เริ่มต้น LEDS(7:0) จะมีเพียงดวงเดียวที่ติด (ON) ซึ่งเป็นดวงขวาสุด LEDS(0) และที่เหลือจะต้องไม่ติด (OFF) 
- เมื่อกดปุ่มแล้วปล่อยหนึ่งครั้ง จะทำให้ตำแหน่งของ LED ที่ติด (ON) เลื่อนไปทางซ้ายหนึ่งตำแหน่งถัดไป ถ้าเลื่อนไปจนซ้ายสุดแล้ว ถัดไปจะกลับไปเริ่มที่ตำแหน่งขวาสุด

Code

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity shiftled is
            port(
            CLK : in std_logic;
            button : in std_logic;
            led : out std_logic_vector(7 downto 0)
            );
end shiftled;
architecture data of shiftled is
signal count : integer range 0 to 2000 :=0;
signal check : std_logic := '0';
signal x : std_logic;
signal reg : std_logic_vector(7 downto 0) := "00000001"; //กำหนดค่าเริ่มต้นให้กับ LED 8ดวง
begin
            process (CLK)
            begin
                        if rising_edge(CLK) then
                                    if count<2000 then
                                    count <= count+1;  
                                    end if;           
                                    if count = 2000 then //กำหนดเงื่อนไขเพื่อหน่วงเวลาในการทำงาน เพื่อให้โปรแกรม
                                                                                                       เข้ามาทำตามคำสั่งด้านในแค่ครั้งเดียวต่อการกด1ครั้ง
                                                if button = '1' then //เมื่อกดปุ่ม
                                                                    x <= button ;
                                                end if;
                                                if button = '0' then //เมื่อปล่อยปุ่ม
                                                            check <= (x xor check); //ใส่ค่าให้ check เพื่อตรวจสอบว่า                                                                                                                              มีการกดปุ่มหรือไม่
                                                            if check = '1' then //เมื่อcheck เป็น1แสดงว่ามีการกดปุ่มแล้ว                                                                                                                            ปล่อย1ครั้ง
                                                                        reg <= reg(6 downto 0)&reg(7); //เลื่อน                                                                                                                            บิตLEDไปทางซ้าย
                                                                        check <='0';
                                                            end if;
                                                            x <= button; ;  //กำหนดให้เป็นค่า0เพื่อเตรียมพร้อมในการกดปุ่ม                                                                                                                            ในครั้งต่อไป
                                                end if;
                                                count <=0;  //กำหนดให้เป็นค่า0เพื่อเตรียมพร้อมในการกดปุ่มในครั้งต่อไป
                                    end if;
                        end if;
            end process;
            led <= reg;  //ให้led มีค่าเท่ากับ reg ที่ได้ทำการเลื่อนบิตมาแล้ว
end data;



ไม่มีความคิดเห็น:

แสดงความคิดเห็น