剛開始學習使用BASYS2板,自己的第一個VHDL程序就是一個跑馬燈,然後因爲這個程序是網上找的然後自己改的,測試完全可以運行,現寫上我對這個程序的理解,如果錯了還希望大家指正。
程序源代碼:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity testdomo is
PORT( clock : in std_logic;
row:out std_logic_vector(0 to 7));
end testdomo;
architecture Behavioral of testdomo is
CONSTANT fp_clka:INTEGER:=6250000; --時鐘頻率50MHz的1/8
SIGNAL a: INTEGER RANGE 0 TO 6250001;
signal saomiao :integer range 0 to 9;
SIGNAL clka: std_logic;
BEGIN
PROCESS (clock)
BEGIN
IF rising_edge(clock) THEN
IF a<fp_clka then
a<=a+1;
clka<=clka;
ELSE
a<=0;
clka<= NOT clka; --clka產生一次跳變信號,
end if;
end if;
end process;
process(clka) --clka作爲進程敏感信號
BEGIN
IF rising_edge(clka) THEN
saomiao<=saomiao+1;
if saomiao=9 then
saomiao<=0;
end if;
case saomiao is
when 0 =>row<="10000000";
when 1 =>row<="01000000";
when 2 =>row<="00100000";
when 3 =>row<="00010000";
when 4 =>row<="00001000";
when 5 =>row<="00000100";
when 6 =>row<="00000010";
when 7 =>row<="00000001";
when 8 =>row<="00000000";
when others =>row<="11111111";
END CASE;
END IF;
end process;
end Behavioral;
此程序輸入端只有一個系統的時鐘信號,輸出端是8個LED。
process(clock)的功能是每1/4秒clka產生一次跳變信號,在a<fp_clka時,a不斷增大,但此時clka信號不變,只有在大於時,a置0,clka產生一次跳變信號。
process(clka)的功能就是處理clka跳變信號,產生跑馬燈效果,通過clka跳變信號激勵,信號saomiao數值不斷變化,然後根據不同的數值去點亮板子上的燈,其中1代表亮燈。
ucf文件:NET "clock" LOC = "B8"; # Bank = 2, Signal name = UCLK
# Pin assignment for LEDs
NET "row<7>" LOC = "G1" ; # Bank = 3, Signal name = LD7
NET "row<6>" LOC = "P4" ; # Bank = 2, Signal name = LD6
NET "row<5>" LOC = "N4" ; # Bank = 2, Signal name = LD5
NET "row<4>" LOC = "N5" ; # Bank = 2, Signal name = LD4
NET "row<3>" LOC = "P6" ; # Bank = 2, Signal name = LD3
NET "row<2>" LOC = "P7" ; # Bank = 3, Signal name = LD2
NET "row<1>" LOC = "M11" ; # Bank = 2, Signal name = LD1
NET "row<0>" LOC = "M5" ;# Bank = 2, Signal name = LD0
在Port聲明裏有時鐘CLK,有流水燈輸出LED,由於我們要把程序燒進板子裏,那麼我們就要通過ucf文件告訴板子,我這個CLK對應你板子上的哪個管腳。至於哪個管腳一般都是根據板子生產商所提供的手冊。
NET “row<0>" LOC =“M5" ;對LOC = “M5”,說明我們的第一個LED燈對應的管腳是M5管腳。
至此,整個跑馬燈程序就完成了,試試通過ISE生成bit流下載到板子裏看看效果吧!