6

if-elseステートメントを使用するよりもVHDLでプライオリティエンコーダを作成するためのより良い方法があるかどうか教えてください。つまり、私はこのコードを持っていて、それは機能しますが、もっと短く書くことができますか?スイッチはstd_logic_vectorです。

ご協力いただきありがとうございます!

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
4

1 に答える 1

12

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

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;
于 2013-01-01T23:25:50.410 に答える