Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
схемотехника / Сборник лаб работ 2006.pdf
Скачиваний:
135
Добавлен:
27.03.2016
Размер:
2.05 Mб
Скачать

Реализация булевых функций с помощью постоянного запоминающего устройства

Память, содержимое которой задается по желанию пользователя, является средством решения любых задач переработки информации. Устройства памяти реализуют аппаратным способом некоторую таблицу, а табличный способ задания применим к переключательным функциям, конечным автоматам, арифметическим операциям, элементарным функциям и функциям произвольного вида.

Память с организацией m×l по поступающему на ее вход n- разрядному адресу (m = 2n) формирует на выходе одноразрядный результат (0 или 1), т.е. выдает бит, хранящийся по данному адресу. Этот способ функционирования непосредственно соответствует задаче воспроизведения переключательной функции n переменных, так как для каждого входного набора можно назначить необходимую выходную переменную, запрограммировав ППЗУ согласно таблице значений функции.

Например, ППЗУ с организацией 1024×1 может быть использовано для воспроизведения переключательной функции 10 аргументов.

ППЗУ со словарной организацией m×k по поступающему на его вход n-разрядному адресу выдает k-разрядное выходное слово, хранящееся в ячейке с данным адресом. Такое ЗУ воспроизводит систему переключательных функций, число которых равно разрядности выходного слова. Действительно, на каждом выходе может быть воспроизведена любая переключательная функция n аргументов, а совокупность выходов дает k различных функций.

Важна форма, в которой представляются воспроизводимые в том или ином устройстве переключательные функции. В ППЗУ реализуются совершенные дизъюнктивные нормальные формы, иными словами, не предусматривается какая-либо минимизация функций. Таким образом, методы упрощения логических уравнений теряют смысл при использовании ППЗУ.

37

ПРОЕКТИРОВАНИЕ КОМБИНАЦИОННЫХ СХЕМ НА VHDL

Математической моделью комбинационной логической схемы является логическая функция. Известно много способов задания логической функции, из которых наибольшее распространение получили:

алгебраическое представление;

табличное представление;

представление через бинарную декомпозицию, в пределе в виде двоичного дерева решений;

декомпозиция в априорно заданном базисе функций меньшего числа аргументов.

Любую логическую функцию можно записать в любой из перечисленных форм, а также в их комбинации.

Логическая форма полезна при сравнительно небольшом числе аргументов (не более пяти-шести).

Бинарная декомпозиция позволяет осуществлять разложение логической функции на совокупность функций меньшего числа переменных.

Табличное представление является более универсальным, но достаточно трудоемким и трудно контролируемым при большом числе аргументов. В подобных ситуациях применимы смешанные подходы.

Декомпозиция в заданном базисе мало продуктивна для проектирования схем на ПЛИС, но, в принципе, может применяться при переводе ранее разработанных устройств на новую элементную базу.

Выбор того или иного способа представления может определяться самой процедурой проектирования, точнее, способом создания алгоритма функционирования устройства. Часто сам алгоритм создается по логике "если определенный аргумент (вход) установлен в логическую единицу, то реализуется одна совокупность дей-

ствий, иначе другая". Выделенные совокупности, в свою очередь, могут быть далее разложены на основе анализа следующих аргументов. Такие рассуждения автоматически приводят к описанию логической схемы в форме двоичного дерева решений. Часто спо-

38

соб записи логических функций связан просто с опытом и личными предпочтениями разработчика.

Язык VHDL предоставляет возможности использования любой исходной формы задания без необходимости ручного перевода из одной формы в другую.

Операторы для синтезабельного описания комбинационных схем

Логическая схема может быть описана последовательными операторами: if-then-else, case-when, булевским уравнением, параллельными операторами: when-else, with-select- when, параллельным присваиванием булевского выражения, вставкой компонента логической схемы.

Ниже приведены примеры синтезабельных описаний рассмотренной ранее системы логических функций (2.4) с помощью различных операторов и стилей.

Описание комбинационной схемы в потоковом стиле

В потоковых проектах используют параллельное присваивание. Параллельное присваивание определено в трех различных формах:

безусловное параллельное присваивание, условное параллельное присваивание, параллельное присваивание по выбору.

Безусловное параллельное присваивание

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

ный оператор присваивания (concurrent signal-assignment statement):

signal-name <= expression;

39

Его можно прочесть так: «Сигнал с именем signal-name принимает значение выражения expression». Присвоение значения сигналу задают составным оператором “<=”.

В листинге 2.1 представлено описание комбинационной схемы по уравнениям (2.7) с использованием параллельных присваиваний.

Листинг 2.1. Описание комбинационной схемы с использованием параллельного сигнального оператора присваивания

entity KS_1 is port (

A,B,С,D: in BIT; F1,F2,F3: out BIT

); end KS_1;

architecture KS_1_arch of KS_1 is begin

F1 <= (B and not D) or (not B and C and not D) or (not A and not B and not D);

F2 <= (not B and C and not D) or (not A and not B and C); F3 <= (not B and D) or (not A and not B and not D);

end KS_1_arch;

Логические операторы and, or, nand, nor, xor, хпоr

имеют одинаковое старшинство и выполняются слева направо в выражениях. В сложных логических выражениях порядок выполнения операторов регулируется скобками. Заметьте, что у оператора not самый высокий приоритет, так что для получения нужного результата можно не заключать в скобки подвыражение типа not А.

Условное параллельное присваивание

Можно также воспользоваться условной формой параллельного сигнального оператора присваивания (conditional signal-assignment statement) с ключевыми словами when и else:

40

signal-name <= expression when boolean-expression else expression when boolean-expression else
. . .
expression when boolean-expression else expression;
В этом случае в выражении boolean-expression отдельные булевы термы объединяют посредством встроенных булевых операторов языка VHDL, таких как and, or и not. Под булевыми термами обычно понимают булевы переменные или результаты сравнения, выполняемого с помощью операторов отношений (relational operators) =, /= (не равно), >, >=, < и <=.
Листинг 2.2 содержит пример использования условного параллельного оператора присваивания. Внешние входы схемы ради удобства записи условий представлены в виде вектора А(3 downto 0). Результаты сравнения объединяются в булево выражение, помещенное в каждом операторе между ключевыми словами when и else. Каждое значение входного вектора – это двоичный набор, на котором функция равна 1. Совокупный набор условий в каждом из операторов должен покрывать все возможные комбинации входных сигналов. Приведенное описание представляет собой по сути СДНФ заданных функций.
Листинг 2.2. Описание комбинационной схемы с использованием условного присваивания
entity KS_6 is port (
A: in BIT_VECTOR (3 downto 0); F1,F2,F3: out BIT
); end KS_6;
architecture KS_6_arch of KS_6 is begin
F1 <= '1' when A = "0000" or A = "0010" or A = "0100" or A = "0110" or A = "1010" or A = "1100" or A = "1110"
else '0';
41

F2 <= '1' when A = "0010" or A = "0011" or A = "1010"

else '0';

F3 <= '1' when A = "0000" or A = "0001" or A = "0010" or A = "0011" or A = "1001" or A = "1011"

else '0'; end KS_6_arch;

Параллельное присваивание по выбору

Параллельный оператор присваивания другого рода — это изби-

рательное (по выбору) присваивание сигналу его значения (selected signal-assignment statement), синтаксис которого следующий:

with expression select

signal-name <= signal-value when choices, signal-value when choices,

. . .

signal-value when choices;

Этот оператор вычисляет заданное выражение expression и присваивает сигналу с именем signal-name значение сигнала (signalvalue), соответствующее той из альтернатив (choices), значение которой равно expression. Альтернативой в каждом предложении when может быть одиночное значение expression или список значений, разделенных вертикальной чертой (|). Альтернативы choices в данном операторе должны быть взаимно исключающими и в совокупности включать все возможные случаи. В последнем предложении when можно воспользоваться ключевым словом others в качестве указания на все значения expression, которые еще не были упомянуты.

В листинге 2.3 продемонстрирован один из подходов к написанию программы комбинационной схемы в стиле потокового проектирования с использованием избирательного сигнального оператора присваивания. Внешние входы схемы здесь также ради удобства

42

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

Данное описание предполагает задание функций в табличной форме или в СДНФ.

Листинг 2.3. Описание комбинационной схемы с использованием параллельного присваивания по выбору

entity KS_3 is port (

A: in BIT_VECTOR (3 downto 0); F1: out BIT;

F2: out BIT; F3: out BIT

); end KS_3;

architecture KS_3_arch of KS_3 is begin

with A select

F1 <= '1' when "0000" | "0010" | "0100" | "0110" | "1010" | "1100" | "1110",

'0' when others; with A select

F2 <= '1' when "0010" | "0011" | "1010", '0' when others;

with A select

F3 <= '1' when "0000" | "0001" | "0010" | "0011" | "1001" | "1011",

'0' when others; end KS_3_arch;

Ту же самую архитектуру можно слегка видоизменить, чтобы воспользоваться более удобной числовой интерпретацией А в определении функции. Применяя для сигналов на входе А тип INTEGER, можно записать наборы в терминах целых чисел (листинг 2.4). Внутри среды Foundation Express целые числа представляются в двоичном формате. Для работы с ними используется тип bit_vector. Преобразование целых чисел осуществляется автоматически, без участия пользователя. Размер битового вектора определяется как минимально допустимый для заданного диапазона значений исходного целого типа.

43

Листинг 2.4. Описание комбинационной схемы

entity KS_4 is port (

A: in INTEGER range 0 to 15; F1,F2,F3: out BIT

); end KS_4;

architecture KS_4_arch of KS_4 is begin

with A select

F1 <= '1' when 0 | 2 | 4 | 6 | 10 | 12 | 14 , '0' when others;

with A select

F2 <= '1' when 2 | 3 | 10 , '0' when others;

with A select

F3 <= '1' when 0 | 1 | 2 | 3 | 9 | 11 , '0' when others;

end KS_4_arch;

Описание комбинационной схемы в поведенческом стиле

Ключевым поведенческим элементом языка VHDL является «процесс». Процесс (process) — это совокупность «последовательных» операторов, которые выполняются одновременно с другими параллельными операторами и с другими процессами. Логическая схема может быть описана последовательными операторами: case-when, if-then-else.

Последовательный оператор case

Когда нужно выбирать среди нескольких альтернатив на основании значения только одного сигнала или выражения, обычно более читабельным и дающим лучший результат синтеза является оператор case (case statement). Синтаксис оператора case:

44

case expression is

when choices => sequential-statements

. . .

when choices => sequential-statements end case;

В этом операторе вычисляется заданное выражение expression, по его значению выбирается одна из альтернатив choices и исполняются соответствующие последовательные операторы sequentialstatements. Заметьте, что в каждом из наборов альтернатив choices можно записать один или большее число последовательных операторов. Сами альтернативы choices могут иметь форму одного значения или нескольких значений, разделенных вертикальной чертой (|). Альтернативы choices должны быть взаимно исключающими и содержать все возможные значения типа выражения expression; в последней альтернативе choices можно воспользоваться ключевым словом others для указания всех значений, которые еще не были упомянуты ранее.

В листинге 2.5 приведен вариант описания комбинационной схемы в поведенческом стиле, в котором используется оператор case. Подобно тому, как это было в варианте с параллельным оператором select (см. листинг 2.4), оператор case позволяет в очень наглядной форме задать желаемое функциональное поведение. Здесь также использован тип INTEGER для сигналов на входе А.

Листинг 2.5. Описание комбинационной схемы в поведенческом стиле с использованием оператора case

entity KS_5 is port (

A: in INTEGER range 0 to 15; F1, F2, F3: out BIT

); end KS_5;

architecture KS_5_arch of KS_5 is begin

process (A) begin

45

case A is

when 0 | 2 | 4 | 6 | 10 | 12 | 14 => F1 <= '1' ; when others => F1 <= '0' ;

end case; case A is

when 2 | 3 | 10 => F2 <= '1' ; when others => F2 <= '0' ;

end case; case A is

when 0 | 1 | 2 | 3 | 9 | 11 => F3 <= '1' ; when others => F3 <= '0' ;

end case; end process;

end KS_5_arch;

Последовательный оператор if

Последовательный оператор if (if statement) дает возможность творчески подойти к описанию поведения схемы:

if boolean-expression then sequential-statement end if;

if boolean-expression then sequential-statement else sequential-statement

end if

if boolean-expression then sequential-statement elsif boolean-expression then sequentialstatement

. . .

elsif boolean-expression then sequentialstatement

end if;

if boolean-expression then sequential-statement elsif boolean-expression then sequentialstatement

. . .

eisif boolean-expression then sequentialstatement

else sequential-statement end if;

46

В первой и простейшей форме этого оператора проверяется булево выражение boolean-expression и, если оно имеет значение true, то исполняется последовательный оператор sequential-statement. Во второй форме добавляется предложение "else" с другим последовательным оператором sequential-statement, который исполняется, если булево выражение имеет значение false. Для образования вложенных операторов if-then-else в языке VHDL используют специальное ключевое слово elsif, которое вводит «средние» предложения. Последовательный оператор sequential-statement предложения elsif исполняется в том случае, когда булево выражение boolean-expression в этом предложении истинно, а все предшествующие булевы выражения boolean-expressions оказываются ложными.

Последовательный оператор sequential-statement заключительного необязательного предложения else исполняется только тогда, когда все предыдущие выражения boolean-expressions имеют значения false.

Для пояснения описания комбинационной схемы с использованием оператора if составим таблицу истинности (табл. 2.2) системы логических функций (2.4). В этой таблице в столбцах под общим заголовком «Совпадение» отмечены одинаковые значения указанных функций на соответствующих наборах. В листинге 2.6 представлено поведенческое описание комбинационной схемы с использованием оператора if. Для более компактной записи используется векторное описание как входов, так и выходов схемы.

Идея приведенного описания состоит в том, что последовательно проверяется принадлежность текущего состояния входов одному из подмножеств наборов, определяющих совпадающие значения функций F1, F2 и F3 (см. табл. 2.2), после чего выходам присваивается соответствующее значение.

47

elsif A = "0000" elsif A = "0010" elsif A = "0011" elsif A = "1010" else F <= "000" ; end if;
end process KS6; end KS_6_arch;

Таблица 2.2

Таблица истинности

A

B

C

D

0

0

0

0

0

0

0

1

0

0

1

0

0

0

1

1

0

1

0

0

0

1

0

1

0

1

1

0

0

1

1

1

1

0

0

0

1

0

0

1

1

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

1

1

1

1

F1

F2

F3

Совпадение

1

0

1

 

 

 

0

0

1

+

 

 

1

1

1

 

 

 

0

1

1

 

 

 

1

0

0

 

+

 

0

0

0

 

 

+

1

0

0

 

+

 

0

0

0

 

 

+

0

0

0

 

 

+

0

0

1

+

 

 

1

1

0

 

 

 

0

0

1

+

 

 

1

0

0

 

+

 

0

0

0

 

 

+

1

0

0

 

+

 

0

0

0

 

 

+

Листинг 2.6. Описание комбинационной схемы в поведенческом стиле с использованием оператора if

entity KS_6 is port (

A: in BIT_VECTOR (3 downto 0); F: out BIT_VECTOR (1 to 3)

); end KS_6;

architecture KS_6_arch of KS_6 is begin

KS6: process (A) begin

if A = "0001" or A = "1001" or A = "1011" then F <= "001" ;

elsif A = "0100" or A = "0110" or A = "1100" or A = "1110" then F <= "100" ;

then F <= "101" ; then F <= "111" ; then F <= "011" ; then F <= "110" ;

48