2013-01-01 9 views
5

if-elseステートメントだけでなく、VHDLにプライオリティエンコーダを書き込む方が良いか教えてください。つまり、私はこのコードを手に入れていますが、それは短く書くことができますか?スイッチはstd_logic_vectorです。VHDLプライオリティエンコーダを短く書く方法

ありがとうございました!

shifting : PROCESS(CLK_IN, new_length_ready, switch) 

    VARIABLE highest_switch :  INTEGER RANGE 0 TO 15 := 15; 

BEGIN 

    -- priority encoder, changes the length of the snake track 
    -- (i.e., number of leds for the snake to move) 

    IF switch(15) = '1' THEN 
     highest_switch := 15; 
    ELSIF switch(14) = '1' THEN 
     highest_switch := 14; 
    ELSIF switch(13) = '1' THEN 
     highest_switch := 13; 
    ELSIF switch(12) = '1' THEN 
     highest_switch := 12; 
    ELSIF switch(11) = '1' THEN 
     highest_switch := 11; 
    ELSIF switch(10) = '1' THEN 
     highest_switch := 10; 
    ELSIF switch(9) = '1' THEN 
     highest_switch := 9; 
    ELSIF switch(8) = '1' THEN 
     highest_switch := 8; 
    ELSIF switch(7) = '1' THEN 
     highest_switch := 7; 
    ELSIF switch(6) = '1' THEN 
     highest_switch := 6; 
    ELSIF switch(5) = '1' THEN 
     highest_switch := 5; 
    ELSIF switch(4) = '1' THEN 
     highest_switch := 4; 
    ELSIF switch(3) = '1' THEN 
     highest_switch := 3; 
    ELSIF switch(2) = '1' THEN 
     highest_switch := 2; 
    ELSIF switch(1) = '1' THEN 
     highest_switch := 1; 
    ELSIF switch(0) = '1' THEN 
     highest_switch := 0; 
    ELSE 
     highest_switch := 15; 
    END IF 

答えて

8

プロセス内では、ループを使用できます。

type Switches is range 0 to 15; 

shifting : PROCESS(switch) 
    VARIABLE highest_switch : Switches := 15; 
begin 
    for i in Switches loop 
     if switch(i) = '1' then 
     highest_switch := i; 
     end if; 
    end loop 
... 
end process; 

複数のスイッチが設定されている場合、変数は複数回割り当てられます。しかし、ループが昇順で実行されると、最後(最高)の割り当てが優先されます。

ちなみに、あなたのようなこのプロセスは組み合わせですが、感度リストから不要な信号を削除しました。同期させる方が良いでしょう。

shifting : PROCESS(clk) 
begin 
    if rising_edge(clk) then 
     for i in ... 
    end if; 
end process; 
関連する問題