以下两个程序第一个无法执行.请指明原因.
两个程序都是用50兆HZ驱动8个LED指示灯轮流转动,唯一不同的地方是IF语句的使用,第一个程序用两个IF语句顺序执行,第二个用的是两个IF语句嵌套..
第一个:
EN
tiTY splic_clk IS
PORT(clk:IN STD_LOGIC; --输入clk
splitcclk:OUT STD_LOGIC_VECTOR(0 to 7) --输出8个驱动信号
);
END ENTITY splic_clk;
ARCHITECTURE sp_clk OF splic_clk IS
SIGNAL temp_clk:STD_LOGIC_VECTOR(0 to 7):="11111110";
BEGIN
splitcclk<=temp_clk;
PROCESS(clk) --clk驱动进程
VARIABLE counter:INTEGER :=0;
BEGIN
IF clk'event and clk='1'THEN --50兆HZ clk被分频为1HZ
counter:=counter+1; --记数器计算50兆clk上升沿个数
END IF;
IF counter=50000000 THEN --如果记数到50兆时,指示灯显示一个并且轮流到下一个.
temp_clk<=temp_clk(7)& temp_clk(0 to 6);
counter:=0; --记数器归0,准备从新记数.
END IF;
END PROCESS;
END ARCHITECTURE sp_clk;
第二个:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY splic_clk IS
PORT(clk:IN STD_LOGIC;
splitcclk:OUT STD_LOGIC_VECTOR(0 to 7)
);
END ENTITY splic_clk;
ARCHITECTURE sp_clk OF splic_clk IS
SIGNAL temp_clk:STD_LOGIC_VECTOR(0 to 7):="11111110";
BEGIN
splitcclk<=temp_clk;
PROCESS(clk)
VARIABLE counter:INTEGER :=0;
BEGIN
IF clk'event and clk='1'THEN
counter:=counter+1;
IF counter=50000000 THEN
temp_clk<=temp_clk(7)& temp_clk(0 to 6);
counter:=0;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE sp_clk;
而第二种情况是顺序执行的,并且你用的是两个if语句,而不是if elseif语句导致第二个if语句在判断完counter是不是等于50000后都继续执行counter:=0;,导致程序是不能按照预期执行的。
第二个语句的第二个if更改为elseif可以解决。
IF counter=50000000 THEN
begin
temp_clk<=temp_clk(7)& temp_clk(0 to 6);
counter:=0;
end if;
一周热门 更多>