Проектирование цифровых систем на языках описания аппаратуры/Лекция 7
- Заголовок
- Описание поведения и структур цифровых схем. Многозначная логика. Разрешающие функции.
- Автор
- Ланкевич Ю.Ю.
- Нижний колонтитул
- Проектирование цифровых систем на языках описания аппаратуры/Лекция 7
- Дополнительный нижний колонтитул
- Ланкевич Ю.Ю., 12:32, 5 октября 2020
Слайд:Многозначная логика
Когда сигнал имеет один драйвер (иногда драйвер называют контейнером), то значение сигнала легко определить, потому что, когда процесс приостанавливается, значение сигнала из драйвера передается сигналу. Однако во многих практических ситуациях один и тот же сигнал может назначаться в различных (нескольких) процессах. Например, шина данных в персональном компьютере может получать данные из процессора, памяти (ОЗУ), жесткого диска и других устройств. Сигнал от многих источников называется в языке VHDL разрешаемым (resolved), для таких сигналов требуется написание функции разрешения (разрешающей функции). Разрешающая функция – это функция определения значения сигнала по его значениям из различных источников. Далее будем рассматривать два источника и для этого случая изучать функции разрешения в электронных схемах. Для моделирования процессов прохождения сигналов в реальных электронных схемах используется многозначная логика. Тип bit обобщается на случай девяти значений сигнала
'U' -- не инициализировано; 'X' -- неизвестное значение (сильный источник сигнала); '0' -- логический 0 (сильный источник сигнала); '1' -- логическая 1 (сильный источник сигнала); 'Z' -- высокий импеданс (цепь не подключена к источнику); 'W' -- неизвестное значение (слабый источник сигнала); 'L' -- логический 0 (слабый источник сигнала); 'H' -- логическая 1 (слабый источник сигнала); '-' -- безразличное значение (don't care).
Заметим, что неизвестное значение 'X' не эквивалентно неопределенному значению '-'. Безразличное значение эффективно используется при логическом синтезе схемы и логической оптимизации. Человек, знакомый, например, с методами минимизации не полностью определенных булевых функций, может вспомнить о том, что некоторые безразличные значения '-' функции заменяются при минимизации определенными (0,1) с целью получения лучшего результата. Расширение типа bit на случай девяти значений сигнала привело к понятию типа std_logic. Основное назначение типа std_logic – это повысить точность моделирования и дать "легальную" возможность разработчику делать многократные присваивания одному и тому же сигналу.
Слайд:Многозначная логика
Library IEEE; use IEEE.std_logic_1164.all; entity test_flag is end; architecture beh of test_flag is Signal FlagC : std_logic := 'Z'; signal Carry : boolean; begin ALU: process (carry) begin if Carry then FlagC <= '1'; end if; end process ALU; COMM: process (carry) begin FlagC <= 'Z'; end process COMM; Carry <= true, false after 100 ns, true after 200 ns; end beh;
В данном примере для сигнала FlagC не требуется разрешающая функция, хотя операторы назначения данного сигнала имеются в двух процессах
Слайд:Многозначная логика

Легко проверить моделированием, что сигнал FlagC будет иметь значение‘1’. Почему же в данном примере не требуется написание разрешающей функции?
Дело в том, что для сигналов типа std_logic допустимы присваивания из нескольких источников, и при этом не требуется написание разрешающей функции – данная функция находится в пакете STD_LOGIC_1164,
который всегда требуется указывать, если используется тип std_logic и, естественно, тип std_logic_vector.
! Типы std_logic, std_logic_vector являются разрешаемыми типами, для сигналов данного типа допустимы присваивания из нескольких источников.
Тип std_ulogic (и тип std_ulogic_vector) является не разрешаемым перечислимым типом с множеством значений {'U','X','0','1','Z','W','L','H','-'}.
Для сигналов типа std_ulogic запрещено использовать много источников сигнала, поэтому требуется написание собственной разрешающей функции.
Тип std_logic называется разрешаемым типом, он является подтипом типа std_ulogic. Буква u в названии типа std_ulogic сигнализирует о термине unresolved (не разрешаемый).
Итак, типы std_logic, std_ulogic – это перечислимые типы. Их определение содержится в пакете std_logic_1164.
Слайд:VHDL пакет std_logic_1164
В VHDL пакете std_logic_1164 содержатся определения типов, подтипов, функций на случай многозначной логики:
- тип std_ulogic – не разрешаемый логический тип с девятизначным алфавитом;
- тип std_logic_vector;
- подтип std_logic типа std_ulogic;
- "перегружаемые" логические функции and, nand, or, xor, not для операндов std_ulogic и др.
- разрешающая функция.
Заметим, что для преобразования типа bit в тип std_logic (и наоборот) требуются соответствующие функции.
Слайд:VHDL пакет std_logic_1164
U | X | 0 | 1 | Z | W | L | H |
- | |
U | 'U' | 'U' | 'U' | 'U' | 'U' | 'U' | 'U' | 'U' | 'U' |
X | 'U' | 'X' | 'X' | 'X' | 'X' | 'X' | 'X' | 'X' | 'X' |
0 | 'U' | 'X' | '0' | 'X' | '0' | '0' | '0' | '0' | 'X' |
1 | 'U' | 'X' | 'X' | '1' | '1' | '1' | '1' | '1' | 'X' |
Z | 'U' | 'X' | '0' | '1' | 'Z' | 'W' | 'L' | 'H' | 'X' |
W | 'U' | 'X' | '0' | '1' | 'W' | 'W' | 'W' | 'W' | 'X' |
L | 'U' | 'X' | '0' | '1' | 'L' | 'W' | 'L' | 'W' | 'X' |
H | 'U' | 'X' | '0' | '1' | 'H' | 'W' | 'W' | 'H' | 'X' |
- |
'U' | 'X' | 'X' | 'X' | 'X' | 'X' | 'X' | 'X' | 'X' |

Слайд:VHDL пакет std_logic_1164
Фактически типы std_logic, std_ulogic стали промышленным стандартом и доступны во всех системах моделирования с языком VHDL, поставляющихся вместе с пакетом std_logic_1164. Чтобы использовать пакет std_logic_1164, необходимо указать следующее:
Library IEEE; use IEEE. std_logic_1164.all;
Опишем схему, используя для сигналов тип std_logic.

Слайд:VHDL пакет std_logic_1164
В VHDL-коде используются следующие имена: схема имеет имя circuit_wire, двухвходовый элемент И – имя cc.
library IEEE; use IEEE.std_logic_1164.all; library work; use work.wire.all; entity circuit_wire is port ( x1,x2,x3,x4,x5,x6 : in std_logic; out_circ : out std_logic); end circuit_wire; architecture structure of circuit_wire is component cc port ( x1,x2 : in std_logic; y : out std_logic); end component; signal out_wire : std_logic ; begin p1: cc port map (x1 => x1, x2 => x2, y => out_wire); p2: cc port map (x1 => x3, x2 => x4, y => out_wire ); p3: cc port map (x1 => x5, x2 => x6, y => out_wire ); p4: cc port map (x1 => out_wire, x2 => x2, y => out_circ); end structure; library IEEE; use IEEE.std_logic_1164.all; entity cc is -- описание логического элемента И port ( x1,x2 : in std_logic; y : out std_logic); end cc; architecture functional of cc is begin y <= x1 and x2; end functional;
Слайд:Разрешающая функция для типа bit
Если же в описании сигналов схемы использовать тип bit, то для описания монтажного ИЛИ требуется разрешающая функция.
Введем тип resolved_bit (подтип типа bit) и определим в пакете wire, находящемся в рабочей библиотеке work, разрешающую функцию res_func для сигнала типа resolved_bit.
Разрешающая функция определяет значение сигнала по значениям сигналов из нескольких источников.
В данном примере разрешающая функция назначит сигналу out_wire значение '1', если хотя бы один из выходных сигналов логических элементов И первого уровня схемы будет иметь значение '1', в противном случае сигнал out_wire примет значение '0'.
Ниже приведен пакет wire и тело (body) этого пакета.
package wire is function RES_FUNC(DATA: in bit_vector) return bit; subtype RESOLVED_BIT is RES_FUNC bit; end; package body wire is function RES_FUNC(DATA: in bit_vector) return bit is begin for I in DATA'range loop if DATA(I) = '1' then return '1'; end if; end loop; return '0'; end; end;
В тексте функции RES_FUNC используется атрибут DATA'range – диапазон сигнала DATA.
Слайд:Разрешающая функция для типа bit
Описание схемы (с собственной разрешающей функцией) будет иметь вид.
library WORK; use WORK.wire.all; entity circuit_wire is port ( x1,x2,x3,x4,x5,x6 : in bit; out_circ : out bit); end circuit_wire; architecture structure of circuit_wire is component cc port ( x1,x2 : in bit; y : out bit); end component; signal out_wire : RESOLVED_BIT; begin p1: cc port map (x1 => x1, x2 => x2, y => out_wire); p2: cc port map (x1 => x3, x2 => x4, y => out_wire ); p3: cc port map (x1 => x5, x2 => x6, y => out_wire ); p4: cc port map (x1 => out_wire, x2 => x2, y => out_circ); end;
Слайд:VHDL пакет NUMERIC_STD
Для типа std_logic разрешается назначать значение сигнала из различных источников, что является удобным для описания монтажных соединений в логических схемах и описания шин. Соответствующая разрешающая функция имеется в пакете STD_LOGIC_1164. Еще раз повторим, что в общем случае ее необходимо написать самому разработчику VHDL-кода. Кроме того, имеющиеся в практике проектирования синтезаторы логических схем (LeonardoSpestrum, XST, Synplify и др.), позволяющие по исходным алгоритмическим VHDL-описаниям синтезировать логические схемы, используют для описания синтезированных схем типы std_logic, std_logic_vector. Последний тип является обобщением типа std_logic на случай векторов – одноразмерных массивов значений типа std_logic. Таким образом, если часть VHDLпроекта синтезирована и описывается в терминах девятизначного логического алфавита, а часть проекта остается на алгоритмическом уровне описания и использует типы integer и natural, то возникает проблема совместимости типов std_logic, std_logic_vector с типами integer и natural. Логические функции, описанные в пакете STD_LOGIC_1164, не позволяют напрямую использовать тип std_logic_vector совместно с целыми типами integer и natural. Для того чтобы упростить согласование алгоритмических и схемных описаний, разработан VHDL-пакет NUMERIC_STD. Пакет NUMERIC_STD ориентирован на стандарт языка VHDL’93.
Слайд:Основные типы данных пакета NUMERIC_STD
В пакете NUMERIC_STD определены два новых числовых типа данных (unsigned, signed) и различные арифметические функции над ними, которые поддерживаются системами синтеза. Тип unsigned представляет собой числа без знака в векторном двоичном (булевом) представлении, а тип signed – знаковые числа (числа со знаком). Для векторов signed старший (левый) бит определяет знак числа. Отрицательные числа представляются в дополнительном коде. Например, двоичный вектор "1001" представляет число -7. Вектор "1000" типа unsigned понимается как 8, вектор "1000" типа signed понимается как -8. Базовым элементом типов unsigned и signed является тип std_logic, описанный в пакете STD_LOGIC_1164. Тип std_logic является многозначным (перечислимым) подтипом типа std_ulogic. По сути, тип std_ulogic принимает те же значения, что и тип std_logic, однако тип std_ulogic является неразрешаемым. Типы unsigned и signed в пакете NUMERIC_STD определены следующим образом:
type UNSIGNED is array (NATURAL range <>) of STD_LOGIC; type SIGNED is array (NATURAL range <>) of STD_LOGIC;
Размерности векторов UNSIGNED и SIGNED ограничены типом NATURAL, который определен в пакете STANDARD как подтип типа INTEGER. Тип NATURAL включает в себя все положительные целые числа от 0 до 2147483647, а тип INTEGER – положительные и отрицательные числа от -2147483648 до 2147483647. Если перейти к двоичной системе счисления, то тип INTEGER ограничен 32-раз-рядным вектором, старший (левый) разряд которого означает знак числа ('0' – число положительное, '1' – число отрицательное). Тип NATURAL ограничен 31-разрядным двоичным вектором.
Слайд:Функции пакета NUMERIC_STD
Пакет NUMERIC_STD содержит описания следующих функций над типами UNSIGNED и SIGNED:
- функции, реализующие арифметические операции;
- функции, реализующие операции сравнения;
- функции сдвига (и циклического сдвига);
- функции изменения размерности;
- функции преобразования типов;
- функции, реализующие логические операции.
В основе описания всех функций пакета лежат вспомогательные функции изменения типов, функция преобразования вектора, функции изменения размерности.