VHDL 时钟 LED 序列

VHDL clocked LED Sequence

这是我第一次 post 访问此站点, 我正在为我的电子学位学习 VHDL,并且必须编写一个程序来在每个时钟脉冲处为一个序列更改 LED 序列。我想我已经破解了它,但这是我第一次使用 VHDL 语言,所以我不确定 iv 是否使用了最有效的方法。我的代码是。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;


entity REG_LED is
 PORT(CLK:      IN  std_logic;              -- CLK input
     LEDS:      Out std_logic_vector (4 downto 0):= "11111"); -- initialise      output
End REG_LED;

ARCHITECTURE behavioral OF REG_LED IS
 SIGNAL Temp:   std_logic_vector (3 downto 0):= "0000"; -- initailise comparison signal
  BEGIN
    CLK_0_Process:  PROCESS (CLK)   -- begin 
    BEGIN 
    if Temp <= "0000" Then          -- State 0          
        if rising_edge(CLK) Then
            Temp <= "0001" ;
            LEDS <= "00001";    
        END IF;
     ELSIF Temp <= "0001" Then  -- State 1
        if rising_edge(CLK) Then
            Temp <= "0010" ;
            LEDS <= "00001";
     END IF;
     ELSIF Temp <= "0010" Then  -- State 2
        if rising_edge(CLK) Then
            Temp <= "0011" ;
            LEDS <= "11111";
     END IF;
     ELSIF Temp <= "0011" Then  -- State 3  
        if rising_edge(CLK) Then
            Temp <= "0100" ;
            LEDS <= "00000";
     END IF;
     ELSIF Temp <= "0100" Then  -- State 4
        if rising_edge(CLK) Then
            Temp <= "0101" ;
            LEDS <= "11111";
     END IF;
     ELSIF Temp <= "0101" Then  -- State 5
        if rising_edge(CLK) Then
            Temp <= "0110" ;
            LEDS <= "00100";
     END IF;
     ELSIF Temp <= "0110" Then  -- State 6
        if rising_edge(CLK) Then
            Temp <= "0111" ;
            LEDS <= "01010";
     END IF;
     ELSIF Temp <= "0111" Then  -- State 7
        if rising_edge(CLK) Then
            Temp <= "1000" ;
            LEDS <= "10001";
     END IF;
     ELSIF Temp <= "1000" Then  -- State 8
        if rising_edge(CLK) Then
                LEDS <= "10001";
     END IF;
    END IF;
    END PROCESS ;
END behavioral;

谁能告诉我是否有我错过的替代路线?

非常感谢

好吧,我会说这是一种低效的方法,但是,就像任何语言一样,你学得越多,你编写的代码就越高效。更重要的是,您的代码不可综合:您无法直接从中生产硬件。

如果您希望您的代码可综合,您应该坚持使用模板。这是一个没有异步复位的时序逻辑模板,所有综合工具都应该理解它:

process(CLK)  -- nothing else should go in the sensitivity list
begin
    -- never put anything here
    if rising_edge(CLK) then  -- or falling_edge(CLK)
        -- put the synchronous stuff here
        -- ie the stuff that happens on the rising or falling edge of the clock
    end if;
     -- never put anything here
end process;        

因此,您需要重构代码以适应此模板,即:

process(CLK)
begin
  if rising_edge(CLK) then
    if Temp <= "0000" Then          -- State 0          
      Temp <= "0001" ;
      LEDS <= "00001";    
    ELSIF Temp <= "0001" Then  -- State 1
      Temp <= "0010" ;
      LEDS <= "00001";
    ELSIF Temp <= "0010" Then  -- State 2

    -- etc etc

    end if;
  end if;
end process;

看到 Temp 只是在计数,在代码中使用行 Temp <= Temp + 1; 会更有效(就解决方案的优雅性和代码行数而言)使用 case 语句(在单独的进程中)驱动 LEDS 信号。但是你必须了解 类型转换 numeric_std 包和 case 语句,大概你还没有学过。