2016-10-17 39 views
0

これは私のエレクトロニクス学位のVHDLを勉強しており、1つのシーケンスの各クロックパルスでLEDシーケンスを変更するプログラムを作成する必要があります。私はそれをクラックしたと思うが、これはVHDL言語を使用する私の初めてのので、私は最も効率的な方法を使用していないかわからない。私のコードはです。VHDLクロックLEDシーケンス

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; 

ivが逃した代替ルートがある場合は誰にでも教えてください。

感謝

答えて

1

まあ、私はそれだけで任意の言語と同じように、非効率的な方法だが、と言うだろう、より多くのあなたが書くことができますコードより効率的に学びます。さらに重要なことは、コードは合成可能ではないことです。ハードウェアを直接生成することはできません。

コードをにする場合は、テンプレートに固執する必要があります。ここでは、すべての合成ツールを理解する必要がありますなし非同期リセット、との順序論理のための1つのようなテンプレートは次のとおりです。

​​

だから、あなたがこのテンプレートに合わせて、あなたのコードをリファクタリングする必要がある、すなわちの線に沿って何か:

は、
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ステートメントについて学ばなければならないと思います。

+0

お返事ありがとうございました。私はアセンブリでプログラミングしてCで触れましたが、これはVHDLの約3週目ですので、私の頭の中でまだ頭を握っていますが、このモジュールは自己学習モジュールです新しいプログラミング言語を学ぶときには理想的ではない講師の限られた入力がありますが、なぜ度を正しく取得するのは難しいのでしょうか?コードを合成不可能にするものを中に入れないのですか?私はシミュレーションを使用して模擬したときのように、波動シミュレーションは期待通りに各クロック状態の出力を示しました。あなたの正しいTemp信号でこれ –

+0

〜があります。一時信号はマーカーのようにそこにあります。そのため、シーケンスはプログラム内のどの位置にあるのかを知り、シーケンスの次の状態を判断できます。私たちはケースステートメントに触れているが、私はcase文とnumeric_stdパッケージについてもっと読んでおく必要があると思う。これは現在の形式のプログラムが非常に扱いにくく見えるので、これをもっとエレガントにするために探している。 –

+0

重要な点はVHDL実際に_programming_言語ではなく、_ハードウェア記述_言語です。その機能は、シミュレーションのためだけに、またはハードウェアへの合成のために、ハードウェアを記述することです。かなり多くのものがシミュレートされますが、合成したい場合は、VHDLのサブセットに限定して、特定のスタイルに制限する必要があります。テンプレートは、そのスタイルの一部です。 –