Введение в стандарт IEEE. Справочное руководство по языку VHDL (Пересмотр стандарта IEEE. 1076-1987), страница 4

Если селекторное значение - индекс массива, селектор будет превращен в мультиплексор. Это можно выразить в операторе выбора, но также возможно использовать переменную индексированного массива. Например, если индексы массива целые, индексная переменная массива создаст функцию мультиплексора:

signal vec : std_logic_vector (0 to 15) ;

signal o : std_logic ;

signal i : integer range 0 to 15 ;

...

o <= vec(i) ;

     Выбор бита i из вектора vec можно записать короче при помощи оператора выбора:

case i is

when 0 => o <= vec(0) ;

when 1 => o <= vec(1) ;

when 2 => o <= vec(2) ;

when 3 => o <= vec(3) ;

...

end case ;

     Для предшествующего описания, инструментальные средства синтеза создают те же самые мультиплексоры, поскольку они делают это для индексной переменной массива.

Декодеры.

     Этот раздел описывает подход к созданию декодеров. Вы можете создавать систему булевых уравнений описывающих декодер, используя VHDL циклы и индексы. Ниже вы найдете пример построения логического декодера.

library ieee;

use ieee.std_logic_1164.all;

use ieee.numeric_std.all;

entity decoder is

port (a : unsigned (2 downto 0);

q : out unsigned (7 downto 0));

end;

architecture behavior of decoder is

begin

 process (a)

  begin

for i in natural range 7 downto 0 loop

if (a=i) then

q(i) <= '1';

     else

q(i) <= '0';

      end if;

    end loop;

  end process;

end behavior;

     Далее вы найдете более компактную запись для, описания системы булевых уравнений, которая используется для циклов в VHDL, при описании индексированных уравнений. Рассмотрим исходный текст, для схемы 4И с двумя входами.

Y1 <= A1 and B1;

Y2 <= A2 and B2;

Y3 <= A3 and B3;

Y4 <= A4 and B4;

     Эта же схема 4И может быть описана единственным уравнением в пределах цикла на VHDL.

for i in 1 to 4 loop

Y(i) <= A(i) and B(i);

end loop;

     Эти две только что описанные схемы 4И идентичны, но имеется более простой путь к индексированной форме. Рассмотрим таблицу истинности для декодера 3:8.


ВХОДЫ

ВЫХОДЫ

A

q

000

00000001

001

00000010

010      

00000100

011

00001000

100

00010000

101

00100000

110

01000000

111

10000000

Чтобы составить на VHDL решение этой таблицы, начнем с уравнения для q0 и q1.

if (a=b"000") then

q(0) <= '1';

else

q(0) <= '0';

end if;

if (a=b"001") then

q(1) <= '1';

else

q(1) <= '0';

end if;

     Выходы q0 и q1 активны, если все три входа неактивны, и если на все три входа поданы 1. Используя эти основные уравнения, как руководство мы можем записать общее описание и заменить индексы в цикле на похожие значения индексов выхода q.

     В VHDL источник подобен комбинационной логической модели, представленной ранее, только теперь поведение содержится в процессе VHDL. Обратите внимание, что  список чувствительности включает сигнал, установки “a”, кроме того все входные сигналы комбинационных процессов должны быть включены в список чувствительности.

В качестве альтернативы можно в процедуре, кодирующей стиль использовать параллельные присвоения сигнала вместо последовательных в пределах процесса. Пример ниже описывает конструкцию для создания 8 уравнений: с dec(7) до dec(0).

--- 3:8 decoder

library ieee;

use ieee.std_logic_1164.all;

use ieee.numeric_std.all;

entity decoder is

port(a: in std_logic_vector(2 downto 0);

dec: out std_logic_vector(7 downto 0));

end;

architecture behavior of decoder is

begin

a_dec: for n in natural range 7 downto 0 generate

dec(n) <= '1' when unsigned(a)=n else

'0';

end generate;

end;