«Бог не меняет того, что (происходит) с людьми, пока они сами не изменят своих помыслов.» Коран, Сура 12:13

Проектирование цифровых систем на языках описания аппаратуры/Лекция 8

Материал из Wiki

Перейти к: навигация, поиск
Заголовок
Описание логических элементов, нерегулярных и регулярных логических схем
Автор
Ланкевич Ю.Ю.
Нижний колонтитул
Проектирование цифровых систем на языках описания аппаратуры/Лекция 8
Дополнительный нижний колонтитул
Ланкевич Ю.Ю., 15:49, 6 октября 2020


Содержание

Слайд:Описание логических элементов, нерегулярных и регулярных логических схем

  • Описание систем ДНФ
  • Описание программируемой логической матрицы (ПЛМ)
  • Многоуровневые и полиномиальные представления
  • Описание нерегулярных логических схем
  • Описание регулярных схем
    • Оператора generate
    • Сдвиговый регистр
    • Многоразрядный сумматор

Слайд:Описание систем ДНФ

Поведение комбинационных логических элементов описывается булевыми функциями, которые чаще всего представляются в виде таблиц истинности либо ДНФ. Многовыходные логические элементы описываются в виде систем ДНФ. Система ДНФ булевых функций может быть совместно минимизирована в классе ДНФ и логические выражения могут быть упрощены. Минимизированная система ДНФ в матричной форме представлена в таблице. От данной таблицы легко перейти к выражениям на языке VHDL, используя только логические операторы и операторы назначения сигналов.

Tx Bf
b1 b2 a1 a2 c2 s2 s1
- - 1 1 1 0 0
1 1 - 1 1 0 0
1 1 1 - 1 0 0
1 1 0 0 0 1 0
1 1 1 1 0 1 0
0 - 1 0 0 1 0
0 - 0 1 0 1 0
- 0 1 0 0 1 0
- 0 0 1 0 1 0
1 0 - - 0 0 1
1 0 - - 0 1 0

Слайд:Описание систем ДНФ

entity adder_2 is
    port ( a1, b1, a2, b2 : in BIT;
           c2, s2, s1     : out BIT);
end adder_2;
architecture functional_dnf of adder_2 is
begin
    c2 <= (a1 and a2) or
          (b1 and b2 and a1) or
          (b1 and b2 and a2);
    s2 <= (b1 and b2 and not a1 and not a2) or
          (b1 and b2 and a1 and a2) or
          (not b1 and a1 and not a2) or
          (not b1 and not a1 and a2) or
          (not b2 and a1 and not a2) or
          (not b2 and not a1 and a2);
    s1 <= (b1 and not b2) or
          (not b1 and b2);
end functional_dnf;

Слайд:Описание программируемой логической матрицы

В общем случае ПЛМ предназначена для реализации системы ДНФ булевых функций f(x) = ( f1(x), …, fm(x)), x = (x1, …, xn), заданных на k общих элементарных конъюнкциях, и состоит из двух последовательно соединенных подсхем. На входные шины ПЛМ подаются сигналы, соответствующие литералам входных переменных xi , i = 1, ..., n. На матричной подсхеме первого уровня (матрице И) реализуется k элементарных конъюнкций системы ДНФ, матричная подсхема второго уровня (матрица ИЛИ) служит для реализации дизъюнкций элементарных конъюнкций. ПЛМ, изображенная ниже, реализует следующую систему ДНФ булевых функций:
f1 = x̅13 ∨ x1x3 = k1∨k3;
f2 = x̅12x3 = k2;
f3 = x̅12x3 ∨ x1x3 = k2 ∨ k3.

Пример ПЛМ

Слайд:Многоуровневые и полиномиальные представления

Многоуровневые (алгебраические скобочные выражения в базисе операторов И, ИЛИ, НЕ) представления булевых функций однозначно переписываются в виде выражений языка VHDL с использованием операторов AND, OR, NOT и скобок. Например, булева функция
f = x̅1x2x3 ∨ x2x3x4 ∨ x124∨ x134
может быть записана в виде полинома Жегалкина
f = x1⊕x2x3⊕x1x4,
которому соответствует следующее выражение языка VHDL
f <= x1 xor (x2 and x3) xor (x1 and x4);
В полином Жегалкина входят только положительные литералы (литералы без знака инверсии).

Слайд:Описание нерегулярных схем

Пример логической схемы

Слайд:Описание нерегулярных схем

Ниже приведено описание логической схемы с помощью оператора создания экземпляра компонента. Схема состоит из трех компонент – логических элементов NAO22, NAO2, т.е. используются только два типа элементов.

 entity circuit1 is
 port ( y, c, b, x1 : in bit;
        a           : out bit);
 end circuit1;
 architecture struct_1 of circuit1 is
     component nao22
         port ( a, b, c, d : in bit;
                y : out bit);
     end component;
     component nao2
         port ( a, b, c : in bit;
                y       : out bit);
     end component;
     signal w, d: bit;
     begin
         m_3: nao2   port map (b => y, y => A, c => d, a => w);
         met1: nao22 port map (a => Y, b => C, c => b, D => x1, y => w);
         met2: NAO22 port map (y, b, c, c, d);
     end struct_1;
 entity nao2 is
     port ( a, b, c : in bit;
            y       : out bit);
 end nao2;
 architecture beh_1 of nao2 is
 begin
     y <=(not a ) or (not b and not c);
 end beh_1;

 entity nao22 is
     port ( a, b, c, d : in bit;
            y : out bit);
 end nao22;
 architecture beh_2 of nao22 is
 begin
     y <=(not a and not b) or (not c and not d);
 end beh_2;

Слайд:Описание регулярных схем

! Каждый оператор создания экземпляра компонента должен иметь метку.
Метки играют роль имен элементов схемы. Карта портов дается в скобках после ключевых слов port map. Назначение портов компонентов является как позиционным, так и ключевым.
! Для выходных неиспользуемых портов компонентов нужно употребить ключевое слово open.
Следующий фрагмент VHDL-кода показывает, что при создании экземпляра компонента add1 на вход b1 можно подать константу 0 и выход c1 не использовать.

P1: add1 port map (b1 => '0', b2 =>x, s1 => s1, c1 => open);

Слайд:Оператор generate для описания регулярных схем

Описание регулярных схем осуществляется с помощью параллельного оператора generate (генерации).
Общий вид оператора generate (генерации)

метка : for параметр генерации generate |
        if условие generate
            параллельные операторы
        end generate [метка];

Параметр генерации – константа дискретного типа в определенном диапазоне. Параметром генерации не может быть декларированная переменная или сигнал. Оператор генерации позволяет сокращенно (по существу используя цикл) описывать совокупности повторяющихся операторов, в том числе и операторов конкретизации компонентов, т. е. оператор генерации представляет собой механизм для проектирования (описания) регулярных (систолических) структур.
Укажем различия параллельного оператора генерации от последовательных операторов for, if.

  1. Оператор генерации есть параллельный оператор, а if, for loop есть последовательные операторы.
  2. Оператор генерации не имеет фраз else, elsif.
  3. Необходима метка для оператора генерации.
  4. Только параллельные операторы могут появляться внутри оператора генерации. Только последовательные операторы могут появляться внутри последовательного for loop оператора и последовательного if оператора.

Слайд:Сдвиговый регистр

Структура сдвигового регистра регулярна.

Структура сдвигового регистра

Слайд:Сдвиговый регистр

Можно создать N экземпляров компонента DFF (D-триггера) и сделать N-битный сдвиговый регистр. Когда число N большое, значительно возрастает длина VHDL-кода. Оператор генерации представляет собой механизм для проектирования (описания) регулярных (систолических) структур. Следующий пример VHDL-кода показывает применение оператора генерации к описанию 8-битового сдвигового регистра.

entity SHIFT is
    port ( RSTn, CLK, SI : in bit;
           SO            : out bit);
end SHIFT;
architecture RTL2 of SHIFT is
    component DFF
        port ( RSTn, CLK, D : in bit;
               Q            : out bit);
    end component;
    signal T : bit_vector(6 downto 0);
    begin
        g0 : for i in 7 downto 0 generate
            g1 : if (i = 7) generate
                bit7 : DFF  port map (RSTn => RSTn, CLK => CLK, D => SI, Q => T(6));
            end generate;
            g2 : if (i > 0) and (i < 7) generate
                bitm : DFF port map (RSTn, CLK, T(i), T(i-1));
            end generate;
            g3 : if (i = 0) generate
                bit0 : DFF port map (RSTn, CLK, T(0), SO);
            end generate;
        end generate;
    end RTL2;

В сдвиговом регистре используется D-триггер (entity DFF), имеющий вход данных D, вход синхронизации CLK, вход предустановки RSTn.

entity DFF is
    port ( RSTn, CLK, D : in bit;
           Q            : out bit);
end DFF;
architecture RTL of DFF is
begin
    process (RSTn, CLK)
    begin
        if (RSTn = '0') then
            Q <= '0';
        elsif (CLK'event and CLK = '1') then
            Q <= D;
        end if;
    end process;
end RTL;

Слайд:Сдвиговый регистр

Проанализировав данное описание, можно заметить, что некоторое "неудобство", связанное с установлением связей схемы в целом с полюсами элементов, возникает при описании входного (метка bit7) и выходного триггера (метка bit0). Избежать этого неудобства можно, если увеличить размерность сигнала T .

entity SHIFT is
    port ( RSTn, CLK, SI : in bit;
           SO            : out bit);
end SHIFT;
architecture RTL3 of SHIFT is
    component DFF
        port ( RSTn, CLK, D : in bit;
               Q            : out bit);
    end component;
    signal T : bit_vector(8 downto 0); -- декларация сигнала T
    begin
        T(8) <= SI;
        SO <= T(0);
        g0 : for i in 7 downto 0 generate
            allbit : DFF port map(RSTn => RSTn, CLK => CLK, D => T(i+1), Q => T(i));
        end generate;
end RTL3;

Имеются два способа употребления оператора генерации.

  • Способ 1 – (способ for), синтаксис такой же, как у последовательного оператора for loop.
  • Способ 2 – (способ if) употребление подобно по синтаксису последовательному оператору if.

В архитектуре RTL2 способ if употреблен внутри способа for. Архитектура DFF может быть декларирована в пакете и употреблена в архитектурах RTL1, RTL2, RTL3. Затем эта компонента может быть удалена из этих архитектур. В архитектуре RTL3 параметр i не нуждается в декларации. Все три архитектуры RTL1, RTL2, RTL3 описывают то же самое поведение.

Слайд:Многоразрядный сумматор

В следующем примере VHDL-кода оператор generate употребляется для спецификации N-разрядного сумматора adder_N. Изменяя число N в строке с ключевым словом generic, можно получать описание сумматора требуемой разрядности. В представленном ниже архитектурном теле func_1 для N-разрядного сумматора используется только подсхема одноразрядного сумматора add2, при этом на вход переноса c1 подсхемы add2 (в разряде с номером 0) подается нулевой сигнал.

Структура N разрядного сумматора
entity adder_N is
    generic (N : natural := 4);
    port ( a,b : in bit_vector (0 to N-1);
           s   : out bit_vector (0 to N-1);
           c   : out bit);
end adder_N;
architecture func_1 of adder_N is
    component add2
        port( c1, a1, a2 : in BIT;
              c2, s2     : out BIT);
    end component;
    signal c_in : bit_vector (0 to N);
    begin
        c_in(0) <= '0';
        adder: for i in 0 to N-1 generate
            add2 port map ( c1 => c_in(i), a1 => a(i), a2 => b(i),
                            c2 => c_in(i+1), s2 => s(i) );
        end generate adder;
        c <= c_in(N);
    end func_1;