วัตถุประสงค์
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)®(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;