VHDL-八个LED顺序控制电路

时间:2019-01-04 15:45:33

标签: vhdl fpga quartus vhd ieee


我对FPGA非常陌生,如果可能的话,我希望获得一些帮助。

我想用Quartus实现一个八LED顺序控制电路。
它将由我通过GPIO进行外部控制。例如,GPIO [1]将是复位,而GPIO [0]将被复位。信号。
当我更改GPIO [0]信号(从“ 0”到“ 1”,反之亦然)时,电路将不得不切换到以下三种状态中的下一个,定义如下:

A) LED [0:1] 定期闪烁,持续时间为 2秒(保持1秒钟),而 LED [3:7] ] 保持关闭状态。

B) LED [3:4] 周期性闪烁 6秒(保持亮3秒钟),而 LED [0:2] >和 [5:7] 保持关闭状态。

C) LED [6:7] 定期闪烁,持续时间为 12秒(保持6秒钟),而 LED [0:5 ] 保持关闭状态。

所以我写了这个VHDL代码。

library IEEE;
   use IEEE.std_logic_1164.all;
   USE ieee.std_logic_arith.all ;
   USE ieee.std_logic_unsigned.all ;

library altera_mf;
use altera_mf.altera_mf_components.all;
entity exone is
  --//=======================================================
  --//  PORT declarations
  --//=======================================================
  PORT (
  --    //////////// CLOCK //////////
      CLOCK_50         : IN STD_LOGIC;
      LED            :OUT STD_LOGIC_VECTOR(7 downto 0);
      GPIO_2        : INOUT STD_LOGIC_VECTOR(1 downto 0)
  );
end exone ;

architecture rtl of exone is

signal led_s : STD_LOGIC_VECTOR(7 downto 0 );
signal inp : STD_LOGIC ;
signal state : integer := 3 ;
signal rst, clk : STD_LOGIC ;
signal cnt1: STD_LOGIC_VECTOR( 19 downto 0);
signal cnt2: STD_LOGIC_VECTOR( 19 downto 0);

begin
clk <= CLOCK_50 ;
inp <= GPIO_2(0);
rst <= GPIO_2(1);

process (clk, rst, inp) -- CYCLE
begin
    if rst='1' then
              cnt1<=(others=>'0');
              cnt2<=(others=>'0');
              led_s<=(others=>'0');
       elsif (clk'event and clk = '1') then
         cnt1 <= cnt1 + 1;
          if (cnt1=1000000) then
              cnt2 <= cnt2+1;
              cnt1 <= (others=>'0');
          end if;

  if inp = '1' and state = 3 then
    state <= 1 ;
    if (cnt2=0) then
      led_s <= "11000000";
    elsif (cnt2=50) then
      led_s <= "00000000";
    elsif (cnt2=100) then
      cnt2<=(others=>'0');
    else
      led_s <= led_s;
    end if ;

  elsif inp = '0' then
      if (cnt2=0) then
        led_s <= "00011000";
      elsif (cnt2=150) then
        led_s <= "00000000";
      elsif (cnt2=300) then
        cnt2<=(others=>'0');
      else
        led_s <= led_s;
      end if;

  else
    state <= 3 ;
    if (cnt2=0) then
      led_s <= "00000011";
    elsif (cnt2=300) then
      led_s <= "00000000";
    elsif (cnt2=600) then
      cnt2<=(others=>'0');
    else
      led_s <= led_s;
    end if ;

end if;
  end if;
end process ;
  LED <= led_s ;
END rtl ;

这是我能想到的最简单的解决方案。问题是那部分

if inp = '1' and state = 3 then
    state <= 1 ;
    if (cnt2=0) then
      led_s <= "11000000";
    elsif (cnt2=50) then
      led_s <= "00000000";
    elsif (cnt2=100) then
      cnt2<=(others=>'0');
    else
      led_s <= led_s;
    end if ;

  elsif inp = '0' then
      if (cnt2=0) then
        led_s <= "00011000";
      elsif (cnt2=150) then
        led_s <= "00000000";
      elsif (cnt2=300) then
        cnt2<=(others=>'0');
      else
        led_s <= led_s;
      end if;

  else
    state <= 3 ;
    if (cnt2=0) then
      led_s <= "00000011";
    elsif (cnt2=300) then
      led_s <= "00000000";
    elsif (cnt2=600) then
      cnt2<=(others=>'0');
    else
      led_s <= led_s;
    end if ;

似乎效果不佳。我已经尝试了很多小时了,但仍然没有运气。

所以我的问题是:
有没有更好的方法来检查 inp 更改并标记状态?

我相信我编写的代码是垃圾,对于我想要实现的代码来说太大了。

0 个答案:

没有答案