刚开始学习使用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流下载到板子里看看效果吧!