VHDL疑问,请教高人了.

2019-07-16 02:07发布

以下两个程序第一个无法执行.请指明原因.
两个程序都是用50兆HZ驱动8个LED指示灯轮流转动,唯一不同的地方是IF语句的使用,第一个程序用两个IF语句顺序执行,第二个用的是两个IF语句嵌套..
第一个:
ENtiTY 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;


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
youzizhile
2019-07-16 04:17
第一种情况是并行执行的,只有到了counter==50000时第二个进程才执行。
而第二种情况是顺序执行的,并且你用的是两个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;

一周热门 更多>