วันพฤหัสบดีที่ 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;



วันพุธที่ 5 พฤศจิกายน พ.ศ. 2557

โจทย์ปฏิบัติสัปดาห์ที่ 28/10/2557

2) จงออกแบบวงจรนับ binary counter ขนาด 32 บิต
- มีอินพุต CLK ความถี่ 50MHz (ได้จากวงจรสร้างความถี่บนบอร์ด FPGA)
- มีขา LED(7:0) ซึ่งเป็นเอาต์พุตและต่อกับ LED บนบอร์ด FPGA
และให้แสดงสถานะลอจิกของตัวนับ 8 บิต นับจากซ้ายสุด (บิตที่ 31..24)
- ให้ออกแบบวงจรโดยใช้ภาษา VHDL
- ทดลองในบอร์ด FPGA และเขียนรายงานการทดลอง

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

1. FPGA Board                                                                                                                                  1 อัน




Code VHDL
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity counter is
            port(
            clock : in std_logic;         //เป็นการกำหนดให้ clock เป็นสัญญาณ input
            led : out std_logic_vector( 7 downto 0 )   // กำหนดให้ Led เป็น output โดยมีจำนวน 8 bit
            );
end counter;

architecture DATAFLOW of counter is
            signal count : std_logic_vector( 31 downto 0 );  // กำหนดให้ตัวแปร countมีทั้งหมด 32 บิต
            begin
            process (clock)        
                        begin
                        if clock'event and clock = '1' then     //กำหนดเงื่อนไข เมื่อมีสัญญาณ clock เข้ามา
                                    count <= count +1;              //ให้ count เพื่มค่าขึ้น 1
                        end if ;
                        led <= count(31 downto 24);          //ให้ Led รับค่าของ count บิตที่31-24
            end process;
end DATAFLOW;