короткий способ написать приоритетный кодировщик VHDL

Не могли бы вы сказать мне, есть ли лучший способ написать приоритетный кодировщик на VHDL, чем просто использовать операторы if-else? Я имею в виду, что у меня есть этот код, и он работает, но нельзя ли его написать короче? Переключатель — это 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

person petajamaja    schedule 01.01.2013    source источник


Ответы (1)


Внутри процесса вы можете использовать цикл.

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;
person user_1818839    schedule 01.01.2013
comment
Вы также можете упорядочить оценку от самого высокого к самому низкому переключателю и использовать оператор выхода в операторе if. Это упрощает оптимизацию синтеза и ускоряет моделирование. Вероятно, вы также захотите присвоить наивысшему_переключателю значение NONE, если ни один из них не равен «1» (установка 15 выглядит дефектом в оригинале). - person ; 21.08.2018
comment
@ user1155120 спасибо за откат. Вы правы насчет оператора выхода, но я сомневаюсь, что время моделирования имеет большое значение. И, как вы догадались, я хотел подражать чертам оригинала. - person user_1818839; 21.08.2018