2016-10-19 3 views
0

1つのシーケンスの各クロックパルスでLEDシーケンスを変更するプログラムを作成する必要があります。VHDLクロックLEDシーケンスパート2

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
use ieee.numeric_std.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_Process: PROCESS (CLK) -- begin 
BEGIN 

if rising_edge(CLK) Then 
     Temp <= Temp + 1 ; 
END IF; 

iF TEMP > "1000" THEN 
    Temp <= "XXXX"; 
End IF; 

END PROCESS ; 

LED_PROCESS: Process (Temp) -- 

BEGIN 

    Case Temp is 

     When "0000" => 
      LEDS <= "11111"; 
     When "0001" => 
      LEDS <= "00001"; 
     When "0010" => 
      LEDS <= "00001"; 
     When "0011" => 
      LEDS <= "11111"; 
     When "0100" => 
      LEDS <= "00000"; 
     When "0101" => 
      LEDS <= "11111"; 
     When "0110" => 
      LEDS <= "00100"; 
     When "0111" => 
      LEDS <= "01010"; 
     When "1000" => 
      LEDS <= "10001"; 
     When others => 
      LEDS <= "10001"; 
    End Case;    

End Process; 
END behavioral; 

これはあなたの予想どおりですか?それをシミュレートしますが、テストするハードウェアがあるので、コードの合成をテストできません。それとも、もし私がVHDLを初めて使ったので道があれば、私はそれをテストする方法を工夫していない。

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
use ieee.numeric_std.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: integer range 0 to 9:= 0; -- initailise comparison signal 
BEGIN 

    CLK_Process: PROCESS (CLK) -- begin 
    BEGIN 

    if rising_edge(CLK) Then 
     if Temp = 8 then 
      Temp <= 0; -- State Count Reset 
     else 
      Temp <= Temp + 1 ; -- State Count 
     End if; 

    END IF; 

    END PROCESS ; 

    LED_PROCESS: Process (Temp) -- LED Outputs based on Temp count 

    BEGIN 

     Case Temp is 

      When 0 => 
       LEDS <= "11111"; -- S0 
      When 1 => 
       LEDS <= "00001"; -- S1 
      When 2 => 
       LEDS <= "00001"; -- S2 
      When 3 => 
       LEDS <= "11111"; -- S3 
      When 4 => 
       LEDS <= "00000"; -- S4 
      When 5 => 
       LEDS <= "11111"; -- S5 
      When 6 => 
       LEDS <= "00100"; -- S6 
      When 7 => 
       LEDS <= "01010"; -- S7 
      When 8 => 
       LEDS <= "10001"; -- S8 

      When others => 
       LEDS <= "11111"; -- Restart Sequence 
     End Case;    

    End Process; 
+0

'Temp <=" XXXX "; –

+0

シーケンスを止めることを意図していましたが、元の割り当てを再読み込みして仕様を再設計して以来、私は考えていました。 –

答えて

1

このコードはかなり良いですが、ここで注意が必要な一つのことです。

あなたはこれらのパッケージの両方ません。実際には

use ieee.std_logic_unsigned.all; 
use ieee.numeric_std.all; 

、あなたのコードのみを使用していますstd_logic_unsignedパッケージ; numeric_stdパッケージをまったく使用していません。 std_logic_unsignedパッケージでは、std_logic_vectorタイプのさまざまな算術演算子が定義されています。これらは、という符号なしという算術を仮定しています。あなたは、この行にstd_logic_unsignedパッケージを利用しています

Temp <= Temp + 1 ; 

は新しいコードでは、あなたが本当にnumeric_stdパッケージ、ないstd_logic_unsignedパッケージを使用する必要があります。これを行うには、Tempのタイプをunsignedに変更する必要があります。タイプunsignedは、のようなstd_logicの配列にすぎませんが、その名前が示すように、符号なし算術を実装するために使用されます。

だから、私は希望

I)は、この行を削除します(

SIGNAL Temp: unsigned (3 downto 0):= "0000"; -- initailise comparison signal 

III):に

SIGNAL Temp: std_logic_vector (3 downto 0):= "0000"; -- initailise comparison signal 

use ieee.std_logic_unsigned.all; 

ii)は、この行を変更Scary Jeffが指摘するように) Tempから"XXXX"への署名を行っています。あなたは"0000"にラップするためにあなたのカウンターを好まないでしょうか? "1000"でフリーズする場合は、別のコードが必要です。いずれにしても、は決してのコードを時計のrising_edgeのテストの外に置いてください。 (これは、私が示したテンプレートには準拠していません。このコードによってどのようなロジックが生成されると思いますか?)

+0

これはコードを修正した前のものです。シミュレーション中のいくつかのバグがこのように変更されました –

+0

コード –

+0

私は自分の課題を誤って読んでいました。シーケンスが8クロックパルスで終了するように頼んだと思っていましたが、仕様に合うコード –

関連する問題