Необходимые материалы для лекции logisim.zip и Quartus.zip.
При проектировании цифровых устройств базовые и производные логические элементы объединяются в более крупные функциональные узлы, именуемые комбинационные и последовательностные схемы.
Комбинационная схема - это цифровая схема, состояние сигналов на выходе которой, зависит от изменения сигналов на его входе.
В данной лекции рассматриваются комбинационные схемы, входящие в микропроцессорные системы, в том числе в процессоры RISC-V, или применяемые для проектирования окружения (обвязки) микропроцессоров.
Дешифратором или декодером (англ. decoder) называют кодирующее устройство, преобразующее двоичный код в унарный. Из всех m выходов дешифратора активный уровень имеется только на одном, а именно на том, номер которого равен поданному на вход двоичному коду.
В то же время существуют другие виды кодирующих устройств, также называемых дешифраторами, например, дешифратор семисегментного индикатора. Реализация данного дешифратора будет рассмотрена в лабораторной работе 2.
Дешифратор используют, когда нужно обращаться к различным цифровым устройствам, и при этом номер (адрес) устройства представлен двоичным кодом.
В таблице 2.1 приведена таблица истинности для дешифратора с выходами 0-7 (на схеме будут обозначены А0-А7), реагирующего на уровни логической "1" на входе. Для получения заданных выходных сигналов необходимо наличие трёхразрядного входа (Х0-Х3).
| Номер декодируемой линии выхода | Сигналы на линиях входа | Сигналы на выходе | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| X2 | X1 | X0 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| 2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 3 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
| 4 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| 5 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 6 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Описать работу дешифратора можно при помощи минтерм (объединение переменных знаком конъюнкции) для каждой выходной функции. Для дешифратора с таблицей истинности, представленной выше будут составлены следующие минтермы: $$A0=\overline{X2}\wedge\overline{X1}\wedge\overline{X0}$$; $$A1=\overline{X2}\wedge\overline{X1}\wedge\overline{X0}$$; $$A2=\overline{X2}\wedge\overline{X1}\wedge\overline{X0}$$; $$A3=\overline{X2}\wedge\overline{X1}\wedge\overline{X0}$$; $$A4=X2\wedge\overline{X1}\wedge\overline{X0}$$; $$A5=X2\wedge\overline{X1}\wedge\overline{X0}$$; $$A6=X2\wedgeX1\wedge\overline{X0}$$; $$A7=X2\wedgeX1\wedgeX0$$.
На основании минтерм далее можно реализовать схему. Для каждой функции будет применятся собственный конъюнктор. Линии данных входа Х0-Х2 идут, как прямые, так и инверсные общие для всех конъюнкторов. Каждую функцию образуют одни и те же переменные. На рисунке 2.1 приведена схема функциональная дешифратора в среде Logisim Evolution. При проектировании схемы для примера дешифратора в среде Logisim Evolution применялись элементы "И" (вкладка "Элементы"). Свойства для данного элемента: "Размер элемента" - узкий, "Количество входов" - 3. В поле метка заносится метка для каждого элемента как показано на рисунке 2.1: D4, D5 и т.д. Инверторы D1-D3 находятся во вкладке "Элементы". Для них задается только свойство метка. Входы и выходы для дешифратора находятся в панели быстрого доступа. Данным элементам задается только значение метки, соответствующее имени сигнала.
(рис 2.1)
Условное буквенное обозначение дешифратора на схемах - DC (X/Y).
На рисунке 2.2а приведено условно-графическое обозначение (УГО) элемента дешифратора в системе отечественных стандартов ЕСКД (Единая система стандартов конструкторской документации). На рисунке 2.2б приведено УГО элемента в системе ANSI (American national standards institute).
(рис 2.2)
Шифратор, или кодер (англ. encoder), выполняет функцию, обратную дешифратору. Классический шифратор имеет m входов и n выходов. При подаче сигнала на один из входов (обязательно на один, и не более) на выходе узла появляется двоичный код номера возбужденного o выхода. Число входов и выходов такого шифратора связано соотношением $$m=2^n$$. Шифратор можно использовать, например, для отображения в виде двоичного кода номера нажатой кнопки или положения многопозиционного переключателя.
Важно! Шифратор может обрабатывать только единичные сигналы на входе. Если на вход данной схемы подать несколько сигналов, то на выходе сформируется неверная кодовая комбинация. В таблице 2.2 приведена таблица истинности для шифратора 8x3, работающего активными высокими уровнями.
| Номер кодируемой линии выхода | Сигналы на линиях входа | Сигналы на выходе | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| X0 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | Q2 | Q1 | Q0 | |
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 2 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| 3 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| 4 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
| 6 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
| 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
Для проектирования шифратора применяются макстермы для каждой функции выхода. То есть выход шифратора Q0 будет активен для чисел 1 или 3 или 5 или 7. Соответственно сигналы с входов X1, X3, X5, X7 объединяются дизъюнкторами ("ИЛИ"). На рисунке 2.3 приведена функциональная схема в среде Logisim Evolution.
(рис 2.3)
На рисунке 2.4а приведено УГО в системе ЕСКД. На рисунке 2.4б представлено символьное обозначение для шифратора 74LS147 (работает с инверсными сигналами). Условное буквенное обозначение шифратора на схемах - CD.
(рис 2.4)
Помимо классической схемы шифратора существует схема, которая имеет широкое применение в микропроцессорных системах - приоритетный шифратор (шифратор приоритетов). Приоритетный шифратор - функциональный узел, выставляющий на выходе адрес наиболее приоритетного входа на котором есть активный входной сигнал.
Эта схема преобразует m-разрядное слово на входе следующим образом: все старшие нули и самая старшая единица входного кода пропускается на выход без изменения. Все младшие разряды, содержащие лог. "1" заменяются на лог. "0".
Любое число старших нулей порождает на выходах своих разрядов единицы и никак не влияет на работу элементов И-НЕ более младших разрядов. Любая самая старшая единица входного слова порождает на соответствующем старшем выходе лог. "0" (активный низкий уровень выхода) и запирает все более младшие элементы И-НЕ, устанавливая на их выходах лог. "1". При этом низкий уровень лог. "0" появляется на выходе разрешения ЕО (Enable Output). Данный выход предназначен для объединения с аналогичной схемой приоритетного шифратора. Для объединения нескольких шифраторов с выхода ЕО старшего узла сигнал подается на вход ЕI младшего узла. Тем самым на выходах всей схемы останется только самая старшая единица входного слова. На рисунке 2.5 представлена схема функциональная, смоделированная в среде Logisim Evolution. На рисунке 2.6 представлена схема объединения - каскадирования нескольких приоритетных шифраторов.
Приоритетные шифраторы применяются при организации схем (контроллеров прерываний) обработки прерываний - событий, требующих от процессора соответствующей реакции.
(рис 2.5)
(рис 2.6)
Мультиплексор (англ. multiplexor) - это функциональный узел осуществляющий подключение (коммутацию) одного из нескольких входов к выходу. Номер выбранного входа соответствует коду, поданному на адресные входы мультиплексора [1].
Термином "мультиплексирование" (MPX) называют процесс передачи данных от нескольких источников по общему каналу, и любое устройство, осуществляющее на передающей стороне операцию сведения данных в один канал, принято называть мультиплексором. Согласно ЕСКД, мультиплексор имеет символьное обозначение в схемах как MUX. В литературе [2] дается таблица истинности для мультиплексора, коммутирующего две дискретных линии. Попытка формализовать работу мультиплексора для большего числа линий входа через таблицу истинности является трудновыполнимой. Так для 7 входов таблица истинности будет содержать 128 строк. Если описывать мультиплексор не для дискретных линий, а для шин данных, то таблицу истинности строить вообще не имеет смысла. Поэтому для описания мультиплексора, приведенного на рисунке 2.7 будет приведена таблица работы (таблица 2.3). Входы Х0-Х3 являются коммутируемыми на выход Q. На входах A0-A1 задают адрес коммутируемого входа. Вход EI - вход управления разрешения работы. При лог. "1" на EI мультиплексор работает, при лог. "0" его работа запрещена, на выходе будет лог. "0".
(рис 2.7)
| Адресные входы | Вход управления | Выход | |
|---|---|---|---|
| A1 | A0 | E1 | Q |
| X | X | 0 | 0 |
| 0 | 0 | 1 | X0 |
| 0 | 1 | 1 | X1 |
| 1 | 0 | 1 | X2 |
| 1 | 1 | 1 | X3 |
На рисунке 2.8а приедено УГО мультиплексора в системе ЕСКД, на 2.8б в системе ANSI.
(рис 2.8)
Обратной схемой для мультиплексора является демультиплексор. Демультиплексор - это функциональный узел, предназначенный для переключения сигнала с одного информационного входа на один из информационных выходов. На схемах обозначается (DX - ЕСКД), DMUX, DMX. На рисунке 2.9 приведена функциональная схема демультиплексора в среде Logisim Evolution.
(рис 2.9)
В таблице 2.4 приведена таблица работы данного узла. На рисунке 2.10а приедено УГО мультиплексора в системе ЕСКД, на 2.10б в системе ANSI.
| Адресные входы | Вход управления | Выходы | ||||
|---|---|---|---|---|---|---|
| A1 | A0 | E1 | Q0 | Q1 | Q2 | Q3 |
| X | X | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | X | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | X | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 | X | 0 |
| 1 | 1 | 1 | 0 | 0 | 0 | X |
Если обратить внимание на таблицу работы и сравнить с таблицей истинности дешифратора, то можно обнаружить сходство в принципе работы. Поэтому если принять информационный вход Х= лог. "1", то демультиплексор начинает выполнять функцию дешифратора.
(рис 2.10)
В среде Logisim Evolution, описанные выше элементы, за исключением шифратора (отсутствует) расположены во вкладке "Плексоры". В таблице 2.5 приведено условно-графическое обозначение данных, а также назначение сигналов.
| Наименование элемента (плексора) | Условно-графическое обозначение | Назначение сигналов |
|---|---|---|
| Мультиплексор | ![]() |
1 - коммутируемые входы данных (шина данных); 2 - выходная линия (шина данных); 3 - шина адреса. |
| Демультиплексор | ![]() |
1 - вход данных (шина данных); 2 -выходные линии (шины данных); 3 - шина адреса. |
| Дешифратор (Декодер) | ![]() |
1 - выходные линии; 2 - вход разрешения (по умолчанию активен); 3 - шина данных. |
| Шифратор приоритетов | ![]() |
1- входные линии данных; 2 - выход разрешения для каскадирования, активен если на всех входных линиях 0 и работа шифратора разрешена; 3 - выход, содержащий адрес приоритетного бита; 4 - выход разрешения для каскадирования/ Выход активен если хотя бы на одном из входов присутствует 1 и работа шифратора разрешена; 5 - вход разрешения (по умолчанию активен); |
| Селектор битов | ![]() |
1 - входная шина данных для выборки; 2 - выбираемый бит данных; 3 - селектор адреса выбираемого бита. Данная схема по функционалу схожа с мультиплексором для дискретных сигналов. |
Большинство из рассмотренных выше узлов будут применятся при организации сложных цифровых на основе схем с памятью и в арифметико-логическом устройстве проектируемого процессора.
В приложении 1 приведены коды описания аппаратуры для комбинационных схем, описанных в данном разделе.
Цель работы: получение практических навыков работы с инструментом комбинационного анализа таблиц истинности для построением схем в среде Logisim. Получение навыков разработки комбинационных схем - дешифраторов для индикации в среде Logisim и Intel Quratus PrimeLite.
В цифровой микропроцессорной технике (системы управления оборудованием, измерительная техника) довольно часто можно встретить в качестве средств индикации не дисплеи, а символьные индикаторы в виде секций, например семисегментые индикаторы. Индикаторы бывают различного количества сегментов как следует из рисунка 2.12.а [3].
В качестве элементов, на которых реализуются индикаторы применяются светодиоды различных цветов. Каждому светодиоду отводится поименованная секция и соответствующий вывод (рисунок 2.2.б ). Для семисегментных индикаторов применяется поименованные буквами сегменты: a-g и точка, которая может обозначаться как h или dp.
(рис 2.11)
В индикаторах светодиоды могут электрически объединяться в одну общую точку катод или анод. Индикаторы именуются с общим анодом (рисунок 2.12.а ) или общим катодом (рисунок 2.12.б )[5], что отражается в технической документации на данное изделие. Исходя из схем включения, различается и способ подачи сигналов на индикаторы. В качестве управляющих устройств может выступать постоянная память, программируемые логические матрицы или специальные дешифраторы. Проектирование как раз дешифратора осуществляется в данной работе.
Помимо описанных выше способов, на индикаторы можно выводить информацию через порты ввода вывода микропроцессора, возлагая обязанность формирование сигналов на управляющую программу.
При физической реализации ядра процессора дешифраторы индикаторов не входят, но при реализации процессора на FPGA разработчик может разместить блок управления индикации, если процессор реализуется под специализированное устройство.
(рис 2.12)
В данной лабораторной работе реализуется дешифратор для индикации цифр от 0 до 9 и символов от A до F, то есть выводится 16 символов. На начальном этапе спроектируем дешифратор для статического семисегментного индикатора с общим катодом. Для проектирования дешифратора потребуется четырехразрядный вход данных. Для описания таблицы истинности необходимо наблюдать каким образом формируются символы на индикаторе.
В таблице 2.6 приведена таблица истинности для дешифратора семисегментного индикатора с графическим обозначением символа на индикаторе.
| Входы | Выходы | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| A3 | A2 | A1 | A0 | a | b | c | d | e | f | G | ![]() |
| 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | ![]() |
| 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | ![]() |
| 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | ![]() |
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | ![]() |
| 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | ![]() |
| 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | ![]() |
| 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | ![]() |
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | ![]() |
| 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ![]() |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | ![]() |
| 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | ![]() |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | ![]() |
| 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | ![]() |
| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | ![]() |
| 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | ![]() |
| 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | ![]() |
В среде Logisim Evolution создается новый файл. Его необходимо сохранить его под именем semiseg.circ. Далее в основном меню выбрать "Окно" - "Комбинационный анализ". В открывшемся окне (рисунок 2.13), во вкладке "Входы и выходы" заполнить имена входов (входные переменные) и выходов (выходные переменные).
(рис 2.13)
Заполненная таблица переменных приведена на рисунке 2.14.
(рис 2.14)
Перейти во вторую вкладку "Таблица". Здесь необходимо перенести данные с таблицы 2.6 в таблицу истинности комбинационного анализа. По умолчанию выходные переменные содержат символы "- " (состояние неопределено), их необходимо заменять на 0 или 2. На рисунке 2.15 приведена таблица истинности. Следующим шагом нажать кнопку "Построить схему"
(рис 2.15)
В открывшемся окне "Построить схему", в поле название схемы ввести DC. Поставить метку в поле "Использовать только двухвходовые элементы" (рисунок 2.16), нажать кнопку "Хорошо".
(рис 2.16)
Автоматически построенная схема приведена на рисунке 2.17.
(рис 2.17)
Можно проверить как среда моделирования свернула логические выражения. Для этого необходимо вернуться в окно "Комбинационный анализ" и перейти на вкладку "Выражение". В данной вкладке (рисунок 2.18) можно наблюдать выражения для каждого выхода проектируемой схемы. В выпадающем списке "Обозначение" можно выбрать наиболее удобный способ отображения выражений.
(рис 2.18)
Для изучения механизма минимизации функций следует перейти на вкладку "Минимизация". Далее, выбирая выход в поле "Выход", пронаблюдать реализацию минимизации через карты Карно для каждого выхода, выбирая вариант свертки СДНФ или СКНФ в поле "Формат". Вкладка "Минимизация" приведена на рисунке 2.19.
(рис 2.19)
Пронаблюдав за результатами работы инструмента комбинационного анализа, необходимо вернуться в основную форму среды. В панели инструментов выбрать "Редактировать внешний вид просматриваемой схемы" (рисунок 2.20).
(рис 2.20)
Среда моделирования откроет форму для редактирования графического отображения проектируемой схемы. На начальном этапе редактирования внешний вид выглядит как показано на рисунке 2.21. Предлагается реализовать условно-графическое обозначение согласно требований отечественной ЕСКД.
(рис 2.21)
Слева показаны входы схемы, справа - выходы. Первый выход имеет ключ, выделенный зеленым цветом. При наведении указателя на вход или выход, всплывает подсказка с меткой, назначенной при проектировании функциональной схемы. Если же кликнуть по входу/выходу левой кнопкой указателя, то внизу будет выведена схема функциональная с выделенным выводом.
Следует выделить прямоугольник и изменить геометрию до следующих размеров: по ширине 7 клеток, по высоте 11 клеток. Используя инструмент линия, построить вертикальные линии по границам второй клетки слева и справа. На рисунке 2.22 приведен внешний вид создаваемого графического обозначения дешифратора. Контакты входов необходимо поменять местами так, чтобы верхним контактом стал вход А0, а нижним - А3.
(рис 2.22)
Далее, используя инструмент текст, подписать центральное поле значением DC. Размер шрифта задать 10, тип шрифта оставить неизменным (рисунок 2.23).
(рис 2.23)
Следующим шагом подписать входы и выходы как показано на рисунке 2.14. Шрифт задать размером 8. На рисунке 2.24 приведено итоговое графическое обозначение. Сохранить изменения и перейти в схему main.
(рис 2.24)
На главной схеме выделить, появившийся в иерархии, элемент DC (удерживая левой кнопкой манипулятора, потянуть элемент до поля схемы). Затем перейти в иерархии в раздел "Ввод/вывод" и выбрать 7-сегментный индикатор. Разместить его на поле и соединить выходы дешифратора с выводами индикатора. У индикатора в среде Logisim Evolution контакты подключены к сегментам как показано на рисунке 2.25.
(рис 2.25)
Схема включения дешифратора приведена на рисунке 2.26. Дополнительно следует убедится, что в свойство семисегментного индикатора "Активен при единице?" установлено "Да". Изменяя состояния входов, пронаблюдать изменение отображаемых символов на индикаторе.
(рис 2.26)
Можно сказать, что проектирование закончено, но для получения универсальности схемы необходимо обеспечить возможность работы с индикаторами с общим анодом. Тем более, что проектирование цифровых устройств на FPGA дает гибкость при проектировании. Для расширения функционала спроектированного дешифратора - добавление возможности работы с индикаторами с общим анодом, необходимо изменить функциональную схему. Для этого дважды кликнуть в иерархии по элементу DC. На функциональной схеме добавить дополнительный вход управления. Данному входу присвоить наименование АК - анод/катод. Далее сделать разрыв в линиях, идущих к выходам a-g. В разрывы включить двухвходовые элементы "Исключающее ИЛИ". Один вход элементов Исключающее ИЛИ включается в разрыв линий. Вторые входы данных элементов объединить и подключить к входу АК как показано на рисунке 2.27.
(рис 2.27)
Следующим этапом перейти к редактированию внешнего вида условно-графического обозначения дешифратора и подписать наименование входа управления АК. Если вход управления размещен выше полей А3-А0, то переместить вниз. Итоговый вариант схемы приведен на рисунке 2.28.
Для проверки работы дешифратора можно изменить свойство семисегментного индикатора "Активен при единице? " на "Нет" и пронаблюдать выводимые символы при логическом "0" на входе управления AK дешифратора. Затем установить логическую "1". Семисегментный индикатор верно отображает информацию.
(рис 2.28)
Дополнительно рекомендуется ознакомиться с информацией по организации динамической индикации [4,5].
Для получения навыков проектирования устройств в среде Quartus PrimeLite выполним разработку и симуляцию проекта для дешифратора семисегментого индикатора с общим анодом.
При создании нового проекта используется встроенная утилита New Project Wizard (NPW). Чтобы её вызвать, необходимо выполнить следующие шаги:
В вводном окне перечислены шаги, которые необходимо выполнить для создания нового проекта. Для перехода к следующему окну NPW нажать кнопку Next левой клавишей мыши.
(рис 2.29) На первой странице окна NPW имеется кнопка Use Existing Project Settings. С помощью этой кнопки пользователь может задать установки, которые будут использоваться по умолчанию в его новом проекте. Причем можно использовать установки либо из последнего открытого в Quartus проекта, либо из указанного пользователем проекта.
(рис 2.30) В открывшемся окне (рисунок 2.31), выбрать тип проекта Empty project - пустой проект. Метка Project template позволяет загрузить существующие примеры для различных семейств программируемой логики.
(рис 2.31) Далее NPW (рисунок 2.32) предложит добавить к проекту необходимые файлы сторонних библиотек или модулей. Имена выбираемых файлов, с указанием пути доступа к ним, появляются в основном окне второй страницы NPW. С помощью кнопок Add, Add All, Remove, Properties, Up, Down пользователь может добавить к своему проекту либо выделяемые им файлы по отдельности, либо сразу все файлы. Также он может удалить файлы, посмотреть их свойства, либо переставить местами. Порядок файлов имеет значение при компиляции проекта.
В рассматриваемом окне NPW с помощью кнопки User Libraries пользователь может добавить к проекту пользовательские библиотеки, содержащие файлы проекта на языках VHDL, Verilog, файлы с определениями макрофункций, мегафункций и другие файлы проекта. При проектировании дешифратора в данном окне файлы добавляться не будут.
(рис 2.32) Для перехода к следующему окну NPW нажать кнопку Next. Вид открывшегося окна, представлен на рисунке 2.33. В этом окне пользователь выбирает микросхему программируемой логической интегральной схемы (ПЛИС), на которой будет реализован проект. В случае выбора кристалла пользователем, следует вначале выбрать его семейство в окне Family, затем определить тип корпуса интегральной схемы в поле Package. В поле Pin Count указать количество выводов кристалла, а в окне Speed grade указать градацию быстродействия кристалла. Затем остается выбрать подходящий кристалл из списка в разделе Available Devices, и с помощью кнопки Next перейти к следующему окну NPW, показанному на рисунке 2.34. На рисунке 2.33 приведен пример задания типа кристалла ПЛИС Cyclone IV EP4CE6E22C8.
(рис 2.33) В следующем окне NPW пользователь может определить средства автоматизации проектирования, которые он планирует использовать для ввода проекта, синтеза, моделирования или временного анализа. В последующем эти средства будут вызываться непосредственно из пакета Quartus.
(рис 2.34) 10. С помощью кнопки Next перейти к завершающему окну NPW, которое показано на рисунке 2.35.
(рис 2.35) В этом окне приведена итоговая информация предыдущих шагов NPW, а также информация по условиям работы выбранного кристалла. Нажатие на кнопку Finish завершит работу NPW. Если теперь открыть окно навигатора проекта, то на странице Hierarchy появится тип выбранного кристалла ПЛИС и имя модуля верхнего уровня, а на странице Files - добавленные к проекту файлы.
Утилита NPW позволяет на каждом шаге своего выполнения вернуться к предыдущим шагам, и в случае необходимости, скорректировать выполненные действия.
Для описания дешифратора необходимо кликнуть левой кнопкой мыши по "File" на панели меню Quartus. В открывшемся окне выбрать Verilog HDL File (рисунок 2.36).
(рис 2.36)
В редакторе кода ввести код из листинга 2.1.
module seven_segment_decoder (
input [3:0] bin, // 4-битный вход (двоичное представление числа)
output reg [6:0] seg // 7-сегментный выход
);
always @(*) begin
case (bin)
4'b0000: seg = 7'b0000001; // 0
4'b0001: seg = 7'b1001111; // 1
4'b0010: seg = 7'b0010010; // 2
4'b0011: seg = 7'b0000110; // 3
4'b0100: seg = 7'b1001100; // 4
4'b0101: seg = 7'b0100100; // 5
4'b0110: seg = 7'b0100000; // 6
4'b0111: seg = 7'b0001111; // 7
4'b1000: seg = 7'b0000000; // 8
4'b1001: seg = 7'b0000100; // 9
4'b1010: seg = 7'b0001000; // A
4'b1011: seg = 7'b1100000; // B
4'b1100: seg = 7'b0110001; // C
4'b1101: seg = 7'b1000010; // D
4'b1110: seg = 7'b0110000; // E
4'b1111: seg = 7'b0111000; // F
default: seg = 7'b1111111; // Все сегменты выключены
endcase
end
endmodule
Сохранить файл под тем же именем, что и имя модуля -seven_segment_decoder.v.
Следующим этапом создать новый Verilog HDL файл, который будет верхним в иерархии файлов для данного проекта. Сохранить файл под именем interf_dec.v. В редакторе кода ввести код из листинга 2.2
module interf_dec (input [0:4] SW, output [6:0] HEX); //определение //интерфейсов seven_segment_decoder ex1(.bin(SW), .seg(HEX));//создание экземпляра //дешифратора и связывание интерфейсов endmodule
Следующим шагом необходимо определить файл interf_dec файлом верхнего уровня. Для этого в разделе "Project Navigator" основной формы выбрать в ниспадающем списке - Files. Щелкнуть левой кнопкой мыши по файлу, определяемому верхним в иерархии. В контекстном меню выбрать Set as a Top-Level Entity (рисунок 2.37) или нажать комбинацию "горячих клавиш" Ctrl+Shift+V.
(рис 2.37)
Далее необходимо выполнить синтез проекта. Для этого в меню быстрого доступа нажать на кнопку
, либо в меню "Processing" - "Start" выбрать Analysis Synthesis. По окончании моделирования можно просмотреть результат в виде представления на уровне регистровых передач - RTL.
Для просмотра данного уровня передач необходимо вызвать в главном меню "Tools" - "Netlis Viewers" - "RTL Viewer". Результат представлен на рисунке 2.38.
(рис 2.38)
Для просмотра схемы на уровне логических функций можно выбрать "Tools" - "Netlis Viewers" - "Technology Map Viewer" - "Post Mapping" (рисунок 2.39).
(рис 2.39)
Для симуляции работы дешифратора с использованием ModelSim необходимо создать новый каталог, например simulation. Скопировать в него seven_segment_decoder.v. В текстовом редакторе создать файл и сохранить его под именем testbench.v. Данный файл является файлом тестовых сигналов для спроектированного модуля. В данный файл ввести код из листинга 2.3.
module testbench;
reg [3:0] bin; // Входной сигнал (4 бит)
wire [6:0] seg; // Выходной сигнал (7 сегментов)
seven_segment_decoder uut ( // Инстанцирование модуля дешифратора
.bin(bin),
.seg(seg)
);
initial begin
// Печатаем заголовок тестов
$display("Testing Seven Segment Decoder\n");
// Тестируем значения от 0 до 15
for (bin = 0; bin < 16; bin = bin + 1) begin
#10; // Задержка 10 тактов
$display("Input: %b | Output: %b", bin, seg); // Выводим вход и соответствующий выход
end
// Завершение симуляции
$finish;
end
endmodule
В литературе [3] описаны принципы создания скриптов для управления симуляцией проектов в ModelSim. По аналогии с приведенными скриптами опишем управляющие скрипты для дешифратора. В текстовом редакторе создать файл и сохранить его под именем simulation.tcl.
Набрать код из листинга 2.4.
# создание рабочей библиотеки в симуляторе vlib work # указание компилятору на компилируемые файлы vlog ../testbench.v ../../ seven_segment_decoder.v # открыть тест в симуляторе vsim work.testbench # добавить сигналы для построения диаграммы add wave sim:/testbench/* # запуск симулятора run -all # добавить сигналы на диаграмму построить диаграмму wave zoom full
Для исполнения описанного выше файла предлагается создать файл пакетной обработки. В текстовом редакторе создать новый файл, сохранить его под именем start.bat.
Ввести код из листинга 2.5.
rd /s /q sim md sim cd sim rem start the simulation vsim -do ../simulation.tcl rem return to the parent folder cd ..
Запустить на исполнение файл start.bat. Описанные в данном примере файлы должны находиться в одном каталоге. Работа симулятора ModelSim показана на рисунке 2.40. На рисунке 2.41 показана диаграмма в с временной меткой на сигнале bin 1000 - 8.
(рис 2.40)
(рис 2.41)
Цель: закрепление практических навыков моделирования комбинационных элементов на примере существующих решений.
Главной особенностью комбинационных схем является то, что сигнал на их выходе зависит только от комбинации сигналов на входах системы и не зависит от времени. Таким образом, при многократном поступлении одного и того же сигнала на выходах комбинационной схемы будет формироваться один и тот же входной сигнал.
Как было сказано выше, комбинационные схемы используются для технической реализации логических функций. При помощи комбинационной схемы определяется значение логической функции для заданных значений логических переменных.
В качестве примера реализации будет рассмотрено устройство микросхемы 4048 (КМОП).
Микросхема MMC4048 [7] это многофункциональный логический элемент. Микросхема MMC4048 имеет 8 информационных входов (А, В,С,D,Е,F,G,Н), три управляющих входа Ка, Кв и Кс определяют 8 различных логических функций микросхемы: ИЛИ-НЕ, ИЛИ, И-НЕ, ИЛИ, И-ИЛИ, ИЛИ-И-НЕ, И-ИЛИ, И-ИЛИ-НЕ. Вход Kd является входом разрешения работы выхода (для работы необходимо присутствие лог. "1"). Вход EXPAND позволяет наращивать количество входов объединением двух и более микросхем (необходимо присутствие лог. "0").
На рисунке 2.42 приведены варианты реализуемых логических комбинаций данной микросхемой.
(рис 2.42)
Проводится анализ документа, описывающего внутреннюю структуру микросхемы (рисунок 2.43).
(рис 2.43)
Комбинации входного алфавита с результатом работы микросхемы в зависимости от управляющей комбинации приведены на рисунке 2.44.
(рис 2.44)
Для выполнения практической работы необходимо в среде Logisim Evolution реализовать функционал микросхемы 4048 (согласно рисунка 2.42). Ниже описывается этап моделирования базовой функциональной схемы микросхемы 4048 без транзисторов на выходе - они заменены на эквивалентный логический элемент ИЛИ-НЕ. Схема проектируется для четырех входов A,B и E,F.
В среде Logisim Evolution (рисунок 2.45), используя указатель 1, выбрать в разделе "Элементы" (2) логический элемент "исключающее или" (3). Разместить элемент на поле, задав параметры как на показано рисунке 2.46.
(рис 2.45)
(рис 2.46)
На рисунке 2.46 отображены настройки элементов: размер элемента - узкий (возможно выбрать другой размер). Количество входов - 2. Данные настройки необходимо применить ко всем используемым в проекте элементам, за исключением элемента НЕ. Для него количество входов отсутствует - один вход.
Далее на схему добавить входы и выход. Данные элементы находятся в меню быстрого доступа (рисунок 2.47). Имена входам присвоить согласно функциональной схемы ( рисунок 2.43).
(рис 2.47)
На рисунке 2.48 приведена моделируемая схема для описанного выше количества входов, полностью отражающая модель работы исследуемой микросхемы. После проектирования модели микросхемы 4048, руководствуясь рисунком 2.44, проверить корректность работы таблицы истинности.
Внимание! Из документации к микросхеме следует, что выходы функций объединяются полевыми транзисторами. В случае данной практической работы выходы объединяются схемой ИЛИ-НЕ (NOR) см. рисунок 2.48.
(рис 2.48)
Самостоятельно:
Выполнить моделирование логических функций NOR, OR, AND, NAND по вариантам таблиц истинности для следующих входов управления: Ka,Kb,Kc,Kd (таблица 2.7) в среде Logisim. По аналогии с лабораторной работой 1, на языке описания аппаратуры описать свой вариант комбинационной схемы.
| Вариант | NOR (ИЛИ-НЕ) | OR (ИЛИ) | AND (И) | NAND (И-НЕ) | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Ka | Kb | Kc | Kd | Ka | Kb | Kc | Kd | Ka | Kb | Kc | Kd | Ka | Kb | Kc | Kd | |
| 1,10,19 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
| 2,11,20 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 |
| 3,12,21 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
| 4,13,22 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 5,14,23 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
| 6,15,24 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 |
| 7,16,25 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
| 8,17,26 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
| 9,18,27 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
В листинге 2.6 приведен код на языке описания аппаратуры Verilog HDL для схемы, приведенной на рисунке 2.48. Входы, над которыми производятся логические операции, разделены на два четырехразрядных входа А и В. Код можно реализовать проще, видоизменяя функции, так как в примере операция выполняется побитно с описанием каждого бита данных.
module mmc4048 (input wire [3:0] A,B, input Ka,Kb,Kc,Kd, output reg J);
always @(*)//анализируем все входы
case ({Ka,Kb,Kc,Kd}) //проверка сигналов управления
4'b0000: J=~((A[3]|A[2]|A[1]|A[0])|(B[3]|B[2]|B[1]|B[0]));// операция NOR
4'b0010: J=((A[3]|A[2]|A[1]|A[0])|(B[3]|B[2]|B[1]|B[0]));//операция OR
4'b0100: J=(A[3]|A[2]|A[1]|A[0])(B[3]|B[2]|B[1]|B[0]);//операция OR_AND
4'b0110: J=~((A[3]|A[2]|A[1]|A[0])(B[3]|B[2]|B[1]|B[0]));//операция OR_NAND
4'b1000: J=((A[3]A[2] A[1] A[0]) (B[3] B[2] B[1] B[0]));//операция AND
4'b1010: J=(~(A[3] A[2] A[1] A[0])|~(B[3] B[2] B[1] B[0]));//операция NAND
4'b1100:J=~((A[3] A[2] A[1] A[0])|(B[3] B[2] B[1] B[0]));//операция //AND_NOR
4'b1110: J=((A[3] A[2] A[1] A[0])|(B[3] B[2] B[1] B[0]));//операция AND_OR
default: J=1'b0;
endcase
endmodule
default: J=1'b0;
endcase
endmodule
На рисунке 2.49 приведено представление описанной в листинге 2.6 схемы на уровне регистровых передач (RTL).
(рис 2.49)
В языке описания аппаратуры Verilog существует два способа описания аппаратуры:
Разберем различия в описаниях аппаратуры данными методами на примере мультиплексора, приведенного на рисунке 2.7. Для этого добавим на рисунок дополнительные подписи у элементов D1,D2,D3,D4: w1, w2, w3, w4. Выходы инвертора входа А0 подпишем s0n, у инвертора входа А1 - s1n (рисунок 2.50).
(рис 2.50)
Теперь объявим входы и выходы непосредственно в конструкции module. Имена присвоим те же, что и на рисунке 2.50:
module mux_4(input X0, X1, X2, X3, A0, A1, EI, output Q);
Объявим внутренние цепи - выходы логических элементов, применяемых в схеме:
wire s0n,s1n; wire w1,w2,w3,w4;
Далее получим инверсии адресных входов:
not n0(s0n,A0); // инверсия "имя", "имя выхода цепи", вход not n1(s1n,A1);
Следующим шагом реализуем логические операции для входов X0-X3, управляющего сигнала EI, адресных входов A0,A1 и их производных - внутренних сигналов. Получая внутренние цепи w1-w4:
and and1(w1,X0,s0n,s1n,EI); and and2(w2,X1,A0,s1n,EI); and and3(w3,X2,A1,s0n,EI); and and4(w4,X3,A0,A1,EI);
Результирующий выход Q является объединением внутренних цепей w1-w4 через дизъюнкцию:
or or1(Q,w1,w2,w3,w4);
В листинге 2.7 приведен исходный код данного мультиплексора
module mux_4(input X0, X1, X2, X3, A0, A1, EI, output Q); wire s0n,s1n; wire w1,w2,w3,w4; not n0(s0n,A0); not n1(s1n,A1); and and1(w1,X0,s0n,s1n,EI); and and2(w2,X1,A0,s1n,EI); and and3(w3,X2,A1,s0n,EI); and and4(w4,X3,A0,A1,EI); or or1(Q,w1,w2,w3,w4); endmodule
На рисунке 2.51 показан RTL вид полученной схемы.
(рис 2.51)
Далее опишем мультиплексор, но уже поведенческим методом. Вход А в данном случае будет объявлен как двухразрядная шина:
module mux2to1 (input X0, X1, X2, X3, EI, input wire[1:0]A, output Q);.
Объявим внутреннюю шину для прямого выхода данных:
wire mux_output;
Связываем внутреннюю шину с входами, в зависимости от адреса:
assign mux_output = (A == 2'b00) ? X0 :
(A == 2'b01) ? X1 :
(A == 2'b10) ? X2 :
(A == 2'b11) ? X3 : 1'b0; // Значение по умолчанию.
Выходное состояние будет зависеть от входа управления EI через выражение:
assign Q = ~EI ? ~mux_output : mux_output;.
Итоговый листинг имеет вид:
module mux2to1 (input X0, X1, X2, X3, EI,input wire[1:0]A, output Q);
wire mux_output;
assign mux_output = (A == 2'b00) ? X0 :
(A == 2'b01) ? X1 :
(A == 2'b10) ? X2 :
(A == 2'b11) ? X3 : 1'b0;
assign Q = ~EI ? ~mux_output : mux_output;
endmodule
На рисунке 2.52 показан RTL вид полученной схемы.
(рис 2.52)
Ниже в листинге 2.8 приведен пример поведенческого описания для шифратора, в листинге 2.9 приведен код для дешифратора.
module encoder3 (
input wire [7:0] in, // 8-битный входной сигнал
output reg [2:0] out, // 3-битный выходной сигнал
output reg valid // Сигнал активности выхода
);
// Определяем поведение шифратора
always @(*) begin
case (in)
8'b00000001: begin out = 3'b000; valid = 1; end
8'b00000010: begin out = 3'b001; valid = 1; end
8'b00000100: begin out = 3'b010; valid = 1; end
8'b00001000: begin out = 3'b011; valid = 1; end
8'b00010000: begin out = 3'b100; valid = 1; end
8'b00100000: begin out = 3'b101; valid = 1; end
8'b01000000: begin out = 3'b110; valid = 1; end
8'b10000000: begin out = 3'b111; valid = 1; end
default: begin out = 3'b000; valid = 0; end // Сигнал по умолчанию
endcase
end
endmodule
На рисунке 2.53 приведено RTL представление шифратора
(рис 2.53)
module decoder3to8 (
input wire [2:0] in, // 3-битный входной сигнал
output reg [7:0] out // 8-битный выходной сигнал
);
// Определяем поведение дешифратора
always @(*) begin
// Сбрасываем выход на нули
out = 8'b00000000;
// Устанавливаем один бит в 1 в зависимости от входного сигнала
case (in)
3'b000: out[0] = 1'b1;
3'b001: out[1] = 1'b1;
3'b010: out[2] = 1'b1;
3'b011: out[3] = 1'b1;
3'b100: out[4] = 1'b1;
3'b101: out[5] = 1'b1;
3'b110: out[6] = 1'b1;
3'b111: out[7] = 1'b1;
default: out = 8'b00000000; // В случае ошибки сбрасываем на нули
endcase
end
endmodule
На рисунке 2.54 приведено RTL представление дешифратора
(рис 2.54)
Необходимые материалы для лекции logisim.zip и Quartus.zip.
При проектировании цифровых устройств базовые и производные логические элементы объединяются в более крупные функциональные узлы, именуемые комбинационные и последовательностные схемы.
Комбинационная схема - это цифровая схема, состояние сигналов на выходе которой, зависит от изменения сигналов на его входе.
В данной лекции рассматриваются комбинационные схемы, входящие в микропроцессорные системы, в том числе в процессоры RISC-V, или применяемые для проектирования окружения (обвязки) микропроцессоров.
Дешифратором или декодером (англ. decoder) называют кодирующее устройство, преобразующее двоичный код в унарный. Из всех m выходов дешифратора активный уровень имеется только на одном, а именно на том, номер которого равен поданному на вход двоичному коду.
В то же время существуют другие виды кодирующих устройств, также называемых дешифраторами, например, дешифратор семисегментного индикатора. Реализация данного дешифратора будет рассмотрена в лабораторной работе 2.
Дешифратор используют, когда нужно обращаться к различным цифровым устройствам, и при этом номер (адрес) устройства представлен двоичным кодом.
В таблице 2.1 приведена таблица истинности для дешифратора с выходами 0-7 (на схеме будут обозначены А0-А7), реагирующего на уровни логической "1" на входе. Для получения заданных выходных сигналов необходимо наличие трёхразрядного входа (Х0-Х3).
| Номер декодируемой линии выхода | Сигналы на линиях входа | Сигналы на выходе | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| X2 | X1 | X0 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| 2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 3 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
| 4 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| 5 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 6 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Описать работу дешифратора можно при помощи минтерм (объединение переменных знаком конъюнкции) для каждой выходной функции. Для дешифратора с таблицей истинности, представленной выше будут составлены следующие минтермы: $$A0=\overline{X2}\wedge\overline{X1}\wedge\overline{X0}$$; $$A1=\overline{X2}\wedge\overline{X1}\wedge\overline{X0}$$; $$A2=\overline{X2}\wedge\overline{X1}\wedge\overline{X0}$$; $$A3=\overline{X2}\wedge\overline{X1}\wedge\overline{X0}$$; $$A4=X2\wedge\overline{X1}\wedge\overline{X0}$$; $$A5=X2\wedge\overline{X1}\wedge\overline{X0}$$; $$A6=X2\wedgeX1\wedge\overline{X0}$$; $$A7=X2\wedgeX1\wedgeX0$$.
На основании минтерм далее можно реализовать схему. Для каждой функции будет применятся собственный конъюнктор. Линии данных входа Х0-Х2 идут, как прямые, так и инверсные общие для всех конъюнкторов. Каждую функцию образуют одни и те же переменные. На рисунке 2.1 приведена схема функциональная дешифратора в среде Logisim Evolution. При проектировании схемы для примера дешифратора в среде Logisim Evolution применялись элементы "И" (вкладка "Элементы"). Свойства для данного элемента: "Размер элемента" - узкий, "Количество входов" - 3. В поле метка заносится метка для каждого элемента как показано на рисунке 2.1: D4, D5 и т.д. Инверторы D1-D3 находятся во вкладке "Элементы". Для них задается только свойство метка. Входы и выходы для дешифратора находятся в панели быстрого доступа. Данным элементам задается только значение метки, соответствующее имени сигнала.
(рис 2.1)
Условное буквенное обозначение дешифратора на схемах - DC (X/Y).
На рисунке 2.2а приведено условно-графическое обозначение (УГО) элемента дешифратора в системе отечественных стандартов ЕСКД (Единая система стандартов конструкторской документации). На рисунке 2.2б приведено УГО элемента в системе ANSI (American national standards institute).
(рис 2.2)
Шифратор, или кодер (англ. encoder), выполняет функцию, обратную дешифратору. Классический шифратор имеет m входов и n выходов. При подаче сигнала на один из входов (обязательно на один, и не более) на выходе узла появляется двоичный код номера возбужденного o выхода. Число входов и выходов такого шифратора связано соотношением $$m=2^n$$. Шифратор можно использовать, например, для отображения в виде двоичного кода номера нажатой кнопки или положения многопозиционного переключателя.
Важно! Шифратор может обрабатывать только единичные сигналы на входе. Если на вход данной схемы подать несколько сигналов, то на выходе сформируется неверная кодовая комбинация. В таблице 2.2 приведена таблица истинности для шифратора 8x3, работающего активными высокими уровнями.
| Номер кодируемой линии выхода | Сигналы на линиях входа | Сигналы на выходе | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| X0 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | Q2 | Q1 | Q0 | |
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 2 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| 3 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| 4 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
| 6 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
| 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
Для проектирования шифратора применяются макстермы для каждой функции выхода. То есть выход шифратора Q0 будет активен для чисел 1 или 3 или 5 или 7. Соответственно сигналы с входов X1, X3, X5, X7 объединяются дизъюнкторами ("ИЛИ"). На рисунке 2.3 приведена функциональная схема в среде Logisim Evolution.
(рис 2.3)
На рисунке 2.4а приведено УГО в системе ЕСКД. На рисунке 2.4б представлено символьное обозначение для шифратора 74LS147 (работает с инверсными сигналами). Условное буквенное обозначение шифратора на схемах - CD.
(рис 2.4)
Помимо классической схемы шифратора существует схема, которая имеет широкое применение в микропроцессорных системах - приоритетный шифратор (шифратор приоритетов). Приоритетный шифратор - функциональный узел, выставляющий на выходе адрес наиболее приоритетного входа на котором есть активный входной сигнал.
Эта схема преобразует m-разрядное слово на входе следующим образом: все старшие нули и самая старшая единица входного кода пропускается на выход без изменения. Все младшие разряды, содержащие лог. "1" заменяются на лог. "0".
Любое число старших нулей порождает на выходах своих разрядов единицы и никак не влияет на работу элементов И-НЕ более младших разрядов. Любая самая старшая единица входного слова порождает на соответствующем старшем выходе лог. "0" (активный низкий уровень выхода) и запирает все более младшие элементы И-НЕ, устанавливая на их выходах лог. "1". При этом низкий уровень лог. "0" появляется на выходе разрешения ЕО (Enable Output). Данный выход предназначен для объединения с аналогичной схемой приоритетного шифратора. Для объединения нескольких шифраторов с выхода ЕО старшего узла сигнал подается на вход ЕI младшего узла. Тем самым на выходах всей схемы останется только самая старшая единица входного слова. На рисунке 2.5 представлена схема функциональная, смоделированная в среде Logisim Evolution. На рисунке 2.6 представлена схема объединения - каскадирования нескольких приоритетных шифраторов.
Приоритетные шифраторы применяются при организации схем (контроллеров прерываний) обработки прерываний - событий, требующих от процессора соответствующей реакции.
(рис 2.5)
(рис 2.6)
Мультиплексор (англ. multiplexor) - это функциональный узел осуществляющий подключение (коммутацию) одного из нескольких входов к выходу. Номер выбранного входа соответствует коду, поданному на адресные входы мультиплексора [1].
Термином "мультиплексирование" (MPX) называют процесс передачи данных от нескольких источников по общему каналу, и любое устройство, осуществляющее на передающей стороне операцию сведения данных в один канал, принято называть мультиплексором. Согласно ЕСКД, мультиплексор имеет символьное обозначение в схемах как MUX. В литературе [2] дается таблица истинности для мультиплексора, коммутирующего две дискретных линии. Попытка формализовать работу мультиплексора для большего числа линий входа через таблицу истинности является трудновыполнимой. Так для 7 входов таблица истинности будет содержать 128 строк. Если описывать мультиплексор не для дискретных линий, а для шин данных, то таблицу истинности строить вообще не имеет смысла. Поэтому для описания мультиплексора, приведенного на рисунке 2.7 будет приведена таблица работы (таблица 2.3). Входы Х0-Х3 являются коммутируемыми на выход Q. На входах A0-A1 задают адрес коммутируемого входа. Вход EI - вход управления разрешения работы. При лог. "1" на EI мультиплексор работает, при лог. "0" его работа запрещена, на выходе будет лог. "0".
(рис 2.7)
| Адресные входы | Вход управления | Выход | |
|---|---|---|---|
| A1 | A0 | E1 | Q |
| X | X | 0 | 0 |
| 0 | 0 | 1 | X0 |
| 0 | 1 | 1 | X1 |
| 1 | 0 | 1 | X2 |
| 1 | 1 | 1 | X3 |
На рисунке 2.8а приедено УГО мультиплексора в системе ЕСКД, на 2.8б в системе ANSI.
(рис 2.8)
Обратной схемой для мультиплексора является демультиплексор. Демультиплексор - это функциональный узел, предназначенный для переключения сигнала с одного информационного входа на один из информационных выходов. На схемах обозначается (DX - ЕСКД), DMUX, DMX. На рисунке 2.9 приведена функциональная схема демультиплексора в среде Logisim Evolution.
(рис 2.9)
В таблице 2.4 приведена таблица работы данного узла. На рисунке 2.10а приедено УГО мультиплексора в системе ЕСКД, на 2.10б в системе ANSI.
| Адресные входы | Вход управления | Выходы | ||||
|---|---|---|---|---|---|---|
| A1 | A0 | E1 | Q0 | Q1 | Q2 | Q3 |
| X | X | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | X | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | X | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 | X | 0 |
| 1 | 1 | 1 | 0 | 0 | 0 | X |
Если обратить внимание на таблицу работы и сравнить с таблицей истинности дешифратора, то можно обнаружить сходство в принципе работы. Поэтому если принять информационный вход Х= лог. "1", то демультиплексор начинает выполнять функцию дешифратора.
(рис 2.10)
В среде Logisim Evolution, описанные выше элементы, за исключением шифратора (отсутствует) расположены во вкладке "Плексоры". В таблице 2.5 приведено условно-графическое обозначение данных, а также назначение сигналов.
| Наименование элемента (плексора) | Условно-графическое обозначение | Назначение сигналов |
|---|---|---|
| Мультиплексор | ![]() |
1 - коммутируемые входы данных (шина данных); 2 - выходная линия (шина данных); 3 - шина адреса. |
| Демультиплексор | ![]() |
1 - вход данных (шина данных); 2 -выходные линии (шины данных); 3 - шина адреса. |
| Дешифратор (Декодер) | ![]() |
1 - выходные линии; 2 - вход разрешения (по умолчанию активен); 3 - шина данных. |
| Шифратор приоритетов | ![]() |
1- входные линии данных; 2 - выход разрешения для каскадирования, активен если на всех входных линиях 0 и работа шифратора разрешена; 3 - выход, содержащий адрес приоритетного бита; 4 - выход разрешения для каскадирования/ Выход активен если хотя бы на одном из входов присутствует 1 и работа шифратора разрешена; 5 - вход разрешения (по умолчанию активен); |
| Селектор битов | ![]() |
1 - входная шина данных для выборки; 2 - выбираемый бит данных; 3 - селектор адреса выбираемого бита. Данная схема по функционалу схожа с мультиплексором для дискретных сигналов. |
Большинство из рассмотренных выше узлов будут применятся при организации сложных цифровых на основе схем с памятью и в арифметико-логическом устройстве проектируемого процессора.
В приложении 1 приведены коды описания аппаратуры для комбинационных схем, описанных в данном разделе.
Цель работы: получение практических навыков работы с инструментом комбинационного анализа таблиц истинности для построением схем в среде Logisim. Получение навыков разработки комбинационных схем - дешифраторов для индикации в среде Logisim и Intel Quratus PrimeLite.
В цифровой микропроцессорной технике (системы управления оборудованием, измерительная техника) довольно часто можно встретить в качестве средств индикации не дисплеи, а символьные индикаторы в виде секций, например семисегментые индикаторы. Индикаторы бывают различного количества сегментов как следует из рисунка 2.12.а [3].
В качестве элементов, на которых реализуются индикаторы применяются светодиоды различных цветов. Каждому светодиоду отводится поименованная секция и соответствующий вывод (рисунок 2.2.б ). Для семисегментных индикаторов применяется поименованные буквами сегменты: a-g и точка, которая может обозначаться как h или dp.
(рис 2.11)
В индикаторах светодиоды могут электрически объединяться в одну общую точку катод или анод. Индикаторы именуются с общим анодом (рисунок 2.12.а ) или общим катодом (рисунок 2.12.б )[5], что отражается в технической документации на данное изделие. Исходя из схем включения, различается и способ подачи сигналов на индикаторы. В качестве управляющих устройств может выступать постоянная память, программируемые логические матрицы или специальные дешифраторы. Проектирование как раз дешифратора осуществляется в данной работе.
Помимо описанных выше способов, на индикаторы можно выводить информацию через порты ввода вывода микропроцессора, возлагая обязанность формирование сигналов на управляющую программу.
При физической реализации ядра процессора дешифраторы индикаторов не входят, но при реализации процессора на FPGA разработчик может разместить блок управления индикации, если процессор реализуется под специализированное устройство.
(рис 2.12)
В данной лабораторной работе реализуется дешифратор для индикации цифр от 0 до 9 и символов от A до F, то есть выводится 16 символов. На начальном этапе спроектируем дешифратор для статического семисегментного индикатора с общим катодом. Для проектирования дешифратора потребуется четырехразрядный вход данных. Для описания таблицы истинности необходимо наблюдать каким образом формируются символы на индикаторе.
В таблице 2.6 приведена таблица истинности для дешифратора семисегментного индикатора с графическим обозначением символа на индикаторе.
| Входы | Выходы | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| A3 | A2 | A1 | A0 | a | b | c | d | e | f | G | ![]() |
| 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | ![]() |
| 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | ![]() |
| 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | ![]() |
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | ![]() |
| 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | ![]() |
| 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | ![]() |
| 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | ![]() |
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | ![]() |
| 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ![]() |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | ![]() |
| 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | ![]() |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | ![]() |
| 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | ![]() |
| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | ![]() |
| 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | ![]() |
| 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | ![]() |
В среде Logisim Evolution создается новый файл. Его необходимо сохранить его под именем semiseg.circ. Далее в основном меню выбрать "Окно" - "Комбинационный анализ". В открывшемся окне (рисунок 2.13), во вкладке "Входы и выходы" заполнить имена входов (входные переменные) и выходов (выходные переменные).
(рис 2.13)
Заполненная таблица переменных приведена на рисунке 2.14.
(рис 2.14)
Перейти во вторую вкладку "Таблица". Здесь необходимо перенести данные с таблицы 2.6 в таблицу истинности комбинационного анализа. По умолчанию выходные переменные содержат символы "- " (состояние неопределено), их необходимо заменять на 0 или 2. На рисунке 2.15 приведена таблица истинности. Следующим шагом нажать кнопку "Построить схему"
(рис 2.15)
В открывшемся окне "Построить схему", в поле название схемы ввести DC. Поставить метку в поле "Использовать только двухвходовые элементы" (рисунок 2.16), нажать кнопку "Хорошо".
(рис 2.16)
Автоматически построенная схема приведена на рисунке 2.17.
(рис 2.17)
Можно проверить как среда моделирования свернула логические выражения. Для этого необходимо вернуться в окно "Комбинационный анализ" и перейти на вкладку "Выражение". В данной вкладке (рисунок 2.18) можно наблюдать выражения для каждого выхода проектируемой схемы. В выпадающем списке "Обозначение" можно выбрать наиболее удобный способ отображения выражений.
(рис 2.18)
Для изучения механизма минимизации функций следует перейти на вкладку "Минимизация". Далее, выбирая выход в поле "Выход", пронаблюдать реализацию минимизации через карты Карно для каждого выхода, выбирая вариант свертки СДНФ или СКНФ в поле "Формат". Вкладка "Минимизация" приведена на рисунке 2.19.
(рис 2.19)
Пронаблюдав за результатами работы инструмента комбинационного анализа, необходимо вернуться в основную форму среды. В панели инструментов выбрать "Редактировать внешний вид просматриваемой схемы" (рисунок 2.20).
(рис 2.20)
Среда моделирования откроет форму для редактирования графического отображения проектируемой схемы. На начальном этапе редактирования внешний вид выглядит как показано на рисунке 2.21. Предлагается реализовать условно-графическое обозначение согласно требований отечественной ЕСКД.
(рис 2.21)
Слева показаны входы схемы, справа - выходы. Первый выход имеет ключ, выделенный зеленым цветом. При наведении указателя на вход или выход, всплывает подсказка с меткой, назначенной при проектировании функциональной схемы. Если же кликнуть по входу/выходу левой кнопкой указателя, то внизу будет выведена схема функциональная с выделенным выводом.
Следует выделить прямоугольник и изменить геометрию до следующих размеров: по ширине 7 клеток, по высоте 11 клеток. Используя инструмент линия, построить вертикальные линии по границам второй клетки слева и справа. На рисунке 2.22 приведен внешний вид создаваемого графического обозначения дешифратора. Контакты входов необходимо поменять местами так, чтобы верхним контактом стал вход А0, а нижним - А3.
(рис 2.22)
Далее, используя инструмент текст, подписать центральное поле значением DC. Размер шрифта задать 10, тип шрифта оставить неизменным (рисунок 2.23).
(рис 2.23)
Следующим шагом подписать входы и выходы как показано на рисунке 2.14. Шрифт задать размером 8. На рисунке 2.24 приведено итоговое графическое обозначение. Сохранить изменения и перейти в схему main.
(рис 2.24)
На главной схеме выделить, появившийся в иерархии, элемент DC (удерживая левой кнопкой манипулятора, потянуть элемент до поля схемы). Затем перейти в иерархии в раздел "Ввод/вывод" и выбрать 7-сегментный индикатор. Разместить его на поле и соединить выходы дешифратора с выводами индикатора. У индикатора в среде Logisim Evolution контакты подключены к сегментам как показано на рисунке 2.25.
(рис 2.25)
Схема включения дешифратора приведена на рисунке 2.26. Дополнительно следует убедится, что в свойство семисегментного индикатора "Активен при единице?" установлено "Да". Изменяя состояния входов, пронаблюдать изменение отображаемых символов на индикаторе.
(рис 2.26)
Можно сказать, что проектирование закончено, но для получения универсальности схемы необходимо обеспечить возможность работы с индикаторами с общим анодом. Тем более, что проектирование цифровых устройств на FPGA дает гибкость при проектировании. Для расширения функционала спроектированного дешифратора - добавление возможности работы с индикаторами с общим анодом, необходимо изменить функциональную схему. Для этого дважды кликнуть в иерархии по элементу DC. На функциональной схеме добавить дополнительный вход управления. Данному входу присвоить наименование АК - анод/катод. Далее сделать разрыв в линиях, идущих к выходам a-g. В разрывы включить двухвходовые элементы "Исключающее ИЛИ". Один вход элементов Исключающее ИЛИ включается в разрыв линий. Вторые входы данных элементов объединить и подключить к входу АК как показано на рисунке 2.27.
(рис 2.27)
Следующим этапом перейти к редактированию внешнего вида условно-графического обозначения дешифратора и подписать наименование входа управления АК. Если вход управления размещен выше полей А3-А0, то переместить вниз. Итоговый вариант схемы приведен на рисунке 2.28.
Для проверки работы дешифратора можно изменить свойство семисегментного индикатора "Активен при единице? " на "Нет" и пронаблюдать выводимые символы при логическом "0" на входе управления AK дешифратора. Затем установить логическую "1". Семисегментный индикатор верно отображает информацию.
(рис 2.28)
Дополнительно рекомендуется ознакомиться с информацией по организации динамической индикации [4,5].
Для получения навыков проектирования устройств в среде Quartus PrimeLite выполним разработку и симуляцию проекта для дешифратора семисегментого индикатора с общим анодом.
При создании нового проекта используется встроенная утилита New Project Wizard (NPW). Чтобы её вызвать, необходимо выполнить следующие шаги:
В вводном окне перечислены шаги, которые необходимо выполнить для создания нового проекта. Для перехода к следующему окну NPW нажать кнопку Next левой клавишей мыши.
(рис 2.29) На первой странице окна NPW имеется кнопка Use Existing Project Settings. С помощью этой кнопки пользователь может задать установки, которые будут использоваться по умолчанию в его новом проекте. Причем можно использовать установки либо из последнего открытого в Quartus проекта, либо из указанного пользователем проекта.
(рис 2.30) В открывшемся окне (рисунок 2.31), выбрать тип проекта Empty project - пустой проект. Метка Project template позволяет загрузить существующие примеры для различных семейств программируемой логики.
(рис 2.31) Далее NPW (рисунок 2.32) предложит добавить к проекту необходимые файлы сторонних библиотек или модулей. Имена выбираемых файлов, с указанием пути доступа к ним, появляются в основном окне второй страницы NPW. С помощью кнопок Add, Add All, Remove, Properties, Up, Down пользователь может добавить к своему проекту либо выделяемые им файлы по отдельности, либо сразу все файлы. Также он может удалить файлы, посмотреть их свойства, либо переставить местами. Порядок файлов имеет значение при компиляции проекта.
В рассматриваемом окне NPW с помощью кнопки User Libraries пользователь может добавить к проекту пользовательские библиотеки, содержащие файлы проекта на языках VHDL, Verilog, файлы с определениями макрофункций, мегафункций и другие файлы проекта. При проектировании дешифратора в данном окне файлы добавляться не будут.
(рис 2.32) Для перехода к следующему окну NPW нажать кнопку Next. Вид открывшегося окна, представлен на рисунке 2.33. В этом окне пользователь выбирает микросхему программируемой логической интегральной схемы (ПЛИС), на которой будет реализован проект. В случае выбора кристалла пользователем, следует вначале выбрать его семейство в окне Family, затем определить тип корпуса интегральной схемы в поле Package. В поле Pin Count указать количество выводов кристалла, а в окне Speed grade указать градацию быстродействия кристалла. Затем остается выбрать подходящий кристалл из списка в разделе Available Devices, и с помощью кнопки Next перейти к следующему окну NPW, показанному на рисунке 2.34. На рисунке 2.33 приведен пример задания типа кристалла ПЛИС Cyclone IV EP4CE6E22C8.
(рис 2.33) В следующем окне NPW пользователь может определить средства автоматизации проектирования, которые он планирует использовать для ввода проекта, синтеза, моделирования или временного анализа. В последующем эти средства будут вызываться непосредственно из пакета Quartus.
(рис 2.34) 10. С помощью кнопки Next перейти к завершающему окну NPW, которое показано на рисунке 2.35.
(рис 2.35) В этом окне приведена итоговая информация предыдущих шагов NPW, а также информация по условиям работы выбранного кристалла. Нажатие на кнопку Finish завершит работу NPW. Если теперь открыть окно навигатора проекта, то на странице Hierarchy появится тип выбранного кристалла ПЛИС и имя модуля верхнего уровня, а на странице Files - добавленные к проекту файлы.
Утилита NPW позволяет на каждом шаге своего выполнения вернуться к предыдущим шагам, и в случае необходимости, скорректировать выполненные действия.
Для описания дешифратора необходимо кликнуть левой кнопкой мыши по "File" на панели меню Quartus. В открывшемся окне выбрать Verilog HDL File (рисунок 2.36).
(рис 2.36)
В редакторе кода ввести код из листинга 2.1.
module seven_segment_decoder (
input [3:0] bin, // 4-битный вход (двоичное представление числа)
output reg [6:0] seg // 7-сегментный выход
);
always @(*) begin
case (bin)
4'b0000: seg = 7'b0000001; // 0
4'b0001: seg = 7'b1001111; // 1
4'b0010: seg = 7'b0010010; // 2
4'b0011: seg = 7'b0000110; // 3
4'b0100: seg = 7'b1001100; // 4
4'b0101: seg = 7'b0100100; // 5
4'b0110: seg = 7'b0100000; // 6
4'b0111: seg = 7'b0001111; // 7
4'b1000: seg = 7'b0000000; // 8
4'b1001: seg = 7'b0000100; // 9
4'b1010: seg = 7'b0001000; // A
4'b1011: seg = 7'b1100000; // B
4'b1100: seg = 7'b0110001; // C
4'b1101: seg = 7'b1000010; // D
4'b1110: seg = 7'b0110000; // E
4'b1111: seg = 7'b0111000; // F
default: seg = 7'b1111111; // Все сегменты выключены
endcase
end
endmodule
Сохранить файл под тем же именем, что и имя модуля -seven_segment_decoder.v.
Следующим этапом создать новый Verilog HDL файл, который будет верхним в иерархии файлов для данного проекта. Сохранить файл под именем interf_dec.v. В редакторе кода ввести код из листинга 2.2
module interf_dec (input [0:4] SW, output [6:0] HEX); //определение //интерфейсов seven_segment_decoder ex1(.bin(SW), .seg(HEX));//создание экземпляра //дешифратора и связывание интерфейсов endmodule
Следующим шагом необходимо определить файл interf_dec файлом верхнего уровня. Для этого в разделе "Project Navigator" основной формы выбрать в ниспадающем списке - Files. Щелкнуть левой кнопкой мыши по файлу, определяемому верхним в иерархии. В контекстном меню выбрать Set as a Top-Level Entity (рисунок 2.37) или нажать комбинацию "горячих клавиш" Ctrl+Shift+V.
(рис 2.37)
Далее необходимо выполнить синтез проекта. Для этого в меню быстрого доступа нажать на кнопку
, либо в меню "Processing" - "Start" выбрать Analysis Synthesis. По окончании моделирования можно просмотреть результат в виде представления на уровне регистровых передач - RTL.
Для просмотра данного уровня передач необходимо вызвать в главном меню "Tools" - "Netlis Viewers" - "RTL Viewer". Результат представлен на рисунке 2.38.
(рис 2.38)
Для просмотра схемы на уровне логических функций можно выбрать "Tools" - "Netlis Viewers" - "Technology Map Viewer" - "Post Mapping" (рисунок 2.39).
(рис 2.39)
Для симуляции работы дешифратора с использованием ModelSim необходимо создать новый каталог, например simulation. Скопировать в него seven_segment_decoder.v. В текстовом редакторе создать файл и сохранить его под именем testbench.v. Данный файл является файлом тестовых сигналов для спроектированного модуля. В данный файл ввести код из листинга 2.3.
module testbench;
reg [3:0] bin; // Входной сигнал (4 бит)
wire [6:0] seg; // Выходной сигнал (7 сегментов)
seven_segment_decoder uut ( // Инстанцирование модуля дешифратора
.bin(bin),
.seg(seg)
);
initial begin
// Печатаем заголовок тестов
$display("Testing Seven Segment Decoder\n");
// Тестируем значения от 0 до 15
for (bin = 0; bin < 16; bin = bin + 1) begin
#10; // Задержка 10 тактов
$display("Input: %b | Output: %b", bin, seg); // Выводим вход и соответствующий выход
end
// Завершение симуляции
$finish;
end
endmodule
В литературе [3] описаны принципы создания скриптов для управления симуляцией проектов в ModelSim. По аналогии с приведенными скриптами опишем управляющие скрипты для дешифратора. В текстовом редакторе создать файл и сохранить его под именем simulation.tcl.
Набрать код из листинга 2.4.
# создание рабочей библиотеки в симуляторе vlib work # указание компилятору на компилируемые файлы vlog ../testbench.v ../../ seven_segment_decoder.v # открыть тест в симуляторе vsim work.testbench # добавить сигналы для построения диаграммы add wave sim:/testbench/* # запуск симулятора run -all # добавить сигналы на диаграмму построить диаграмму wave zoom full
Для исполнения описанного выше файла предлагается создать файл пакетной обработки. В текстовом редакторе создать новый файл, сохранить его под именем start.bat.
Ввести код из листинга 2.5.
rd /s /q sim md sim cd sim rem start the simulation vsim -do ../simulation.tcl rem return to the parent folder cd ..
Запустить на исполнение файл start.bat. Описанные в данном примере файлы должны находиться в одном каталоге. Работа симулятора ModelSim показана на рисунке 2.40. На рисунке 2.41 показана диаграмма в с временной меткой на сигнале bin 1000 - 8.
(рис 2.40)
(рис 2.41)
Цель: закрепление практических навыков моделирования комбинационных элементов на примере существующих решений.
Главной особенностью комбинационных схем является то, что сигнал на их выходе зависит только от комбинации сигналов на входах системы и не зависит от времени. Таким образом, при многократном поступлении одного и того же сигнала на выходах комбинационной схемы будет формироваться один и тот же входной сигнал.
Как было сказано выше, комбинационные схемы используются для технической реализации логических функций. При помощи комбинационной схемы определяется значение логической функции для заданных значений логических переменных.
В качестве примера реализации будет рассмотрено устройство микросхемы 4048 (КМОП).
Микросхема MMC4048 [7] это многофункциональный логический элемент. Микросхема MMC4048 имеет 8 информационных входов (А, В,С,D,Е,F,G,Н), три управляющих входа Ка, Кв и Кс определяют 8 различных логических функций микросхемы: ИЛИ-НЕ, ИЛИ, И-НЕ, ИЛИ, И-ИЛИ, ИЛИ-И-НЕ, И-ИЛИ, И-ИЛИ-НЕ. Вход Kd является входом разрешения работы выхода (для работы необходимо присутствие лог. "1"). Вход EXPAND позволяет наращивать количество входов объединением двух и более микросхем (необходимо присутствие лог. "0").
На рисунке 2.42 приведены варианты реализуемых логических комбинаций данной микросхемой.
(рис 2.42)
Проводится анализ документа, описывающего внутреннюю структуру микросхемы (рисунок 2.43).
(рис 2.43)
Комбинации входного алфавита с результатом работы микросхемы в зависимости от управляющей комбинации приведены на рисунке 2.44.
(рис 2.44)
Для выполнения практической работы необходимо в среде Logisim Evolution реализовать функционал микросхемы 4048 (согласно рисунка 2.42). Ниже описывается этап моделирования базовой функциональной схемы микросхемы 4048 без транзисторов на выходе - они заменены на эквивалентный логический элемент ИЛИ-НЕ. Схема проектируется для четырех входов A,B и E,F.
В среде Logisim Evolution (рисунок 2.45), используя указатель 1, выбрать в разделе "Элементы" (2) логический элемент "исключающее или" (3). Разместить элемент на поле, задав параметры как на показано рисунке 2.46.
(рис 2.45)
(рис 2.46)
На рисунке 2.46 отображены настройки элементов: размер элемента - узкий (возможно выбрать другой размер). Количество входов - 2. Данные настройки необходимо применить ко всем используемым в проекте элементам, за исключением элемента НЕ. Для него количество входов отсутствует - один вход.
Далее на схему добавить входы и выход. Данные элементы находятся в меню быстрого доступа (рисунок 2.47). Имена входам присвоить согласно функциональной схемы ( рисунок 2.43).
(рис 2.47)
На рисунке 2.48 приведена моделируемая схема для описанного выше количества входов, полностью отражающая модель работы исследуемой микросхемы. После проектирования модели микросхемы 4048, руководствуясь рисунком 2.44, проверить корректность работы таблицы истинности.
Внимание! Из документации к микросхеме следует, что выходы функций объединяются полевыми транзисторами. В случае данной практической работы выходы объединяются схемой ИЛИ-НЕ (NOR) см. рисунок 2.48.
(рис 2.48)
Самостоятельно:
Выполнить моделирование логических функций NOR, OR, AND, NAND по вариантам таблиц истинности для следующих входов управления: Ka,Kb,Kc,Kd (таблица 2.7) в среде Logisim. По аналогии с лабораторной работой 1, на языке описания аппаратуры описать свой вариант комбинационной схемы.
| Вариант | NOR (ИЛИ-НЕ) | OR (ИЛИ) | AND (И) | NAND (И-НЕ) | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Ka | Kb | Kc | Kd | Ka | Kb | Kc | Kd | Ka | Kb | Kc | Kd | Ka | Kb | Kc | Kd | |
| 1,10,19 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
| 2,11,20 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 |
| 3,12,21 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
| 4,13,22 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 5,14,23 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
| 6,15,24 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 |
| 7,16,25 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
| 8,17,26 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
| 9,18,27 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
В листинге 2.6 приведен код на языке описания аппаратуры Verilog HDL для схемы, приведенной на рисунке 2.48. Входы, над которыми производятся логические операции, разделены на два четырехразрядных входа А и В. Код можно реализовать проще, видоизменяя функции, так как в примере операция выполняется побитно с описанием каждого бита данных.
module mmc4048 (input wire [3:0] A,B, input Ka,Kb,Kc,Kd, output reg J);
always @(*)//анализируем все входы
case ({Ka,Kb,Kc,Kd}) //проверка сигналов управления
4'b0000: J=~((A[3]|A[2]|A[1]|A[0])|(B[3]|B[2]|B[1]|B[0]));// операция NOR
4'b0010: J=((A[3]|A[2]|A[1]|A[0])|(B[3]|B[2]|B[1]|B[0]));//операция OR
4'b0100: J=(A[3]|A[2]|A[1]|A[0])(B[3]|B[2]|B[1]|B[0]);//операция OR_AND
4'b0110: J=~((A[3]|A[2]|A[1]|A[0])(B[3]|B[2]|B[1]|B[0]));//операция OR_NAND
4'b1000: J=((A[3]A[2] A[1] A[0]) (B[3] B[2] B[1] B[0]));//операция AND
4'b1010: J=(~(A[3] A[2] A[1] A[0])|~(B[3] B[2] B[1] B[0]));//операция NAND
4'b1100:J=~((A[3] A[2] A[1] A[0])|(B[3] B[2] B[1] B[0]));//операция //AND_NOR
4'b1110: J=((A[3] A[2] A[1] A[0])|(B[3] B[2] B[1] B[0]));//операция AND_OR
default: J=1'b0;
endcase
endmodule
default: J=1'b0;
endcase
endmodule
На рисунке 2.49 приведено представление описанной в листинге 2.6 схемы на уровне регистровых передач (RTL).
(рис 2.49)
В языке описания аппаратуры Verilog существует два способа описания аппаратуры:
Разберем различия в описаниях аппаратуры данными методами на примере мультиплексора, приведенного на рисунке 2.7. Для этого добавим на рисунок дополнительные подписи у элементов D1,D2,D3,D4: w1, w2, w3, w4. Выходы инвертора входа А0 подпишем s0n, у инвертора входа А1 - s1n (рисунок 2.50).
(рис 2.50)
Теперь объявим входы и выходы непосредственно в конструкции module. Имена присвоим те же, что и на рисунке 2.50:
module mux_4(input X0, X1, X2, X3, A0, A1, EI, output Q);
Объявим внутренние цепи - выходы логических элементов, применяемых в схеме:
wire s0n,s1n; wire w1,w2,w3,w4;
Далее получим инверсии адресных входов:
not n0(s0n,A0); // инверсия "имя", "имя выхода цепи", вход not n1(s1n,A1);
Следующим шагом реализуем логические операции для входов X0-X3, управляющего сигнала EI, адресных входов A0,A1 и их производных - внутренних сигналов. Получая внутренние цепи w1-w4:
and and1(w1,X0,s0n,s1n,EI); and and2(w2,X1,A0,s1n,EI); and and3(w3,X2,A1,s0n,EI); and and4(w4,X3,A0,A1,EI);
Результирующий выход Q является объединением внутренних цепей w1-w4 через дизъюнкцию:
or or1(Q,w1,w2,w3,w4);
В листинге 2.7 приведен исходный код данного мультиплексора
module mux_4(input X0, X1, X2, X3, A0, A1, EI, output Q); wire s0n,s1n; wire w1,w2,w3,w4; not n0(s0n,A0); not n1(s1n,A1); and and1(w1,X0,s0n,s1n,EI); and and2(w2,X1,A0,s1n,EI); and and3(w3,X2,A1,s0n,EI); and and4(w4,X3,A0,A1,EI); or or1(Q,w1,w2,w3,w4); endmodule
На рисунке 2.51 показан RTL вид полученной схемы.
(рис 2.51)
Далее опишем мультиплексор, но уже поведенческим методом. Вход А в данном случае будет объявлен как двухразрядная шина:
module mux2to1 (input X0, X1, X2, X3, EI, input wire[1:0]A, output Q);.
Объявим внутреннюю шину для прямого выхода данных:
wire mux_output;
Связываем внутреннюю шину с входами, в зависимости от адреса:
assign mux_output = (A == 2'b00) ? X0 :
(A == 2'b01) ? X1 :
(A == 2'b10) ? X2 :
(A == 2'b11) ? X3 : 1'b0; // Значение по умолчанию.
Выходное состояние будет зависеть от входа управления EI через выражение:
assign Q = ~EI ? ~mux_output : mux_output;.
Итоговый листинг имеет вид:
module mux2to1 (input X0, X1, X2, X3, EI,input wire[1:0]A, output Q);
wire mux_output;
assign mux_output = (A == 2'b00) ? X0 :
(A == 2'b01) ? X1 :
(A == 2'b10) ? X2 :
(A == 2'b11) ? X3 : 1'b0;
assign Q = ~EI ? ~mux_output : mux_output;
endmodule
На рисунке 2.52 показан RTL вид полученной схемы.
(рис 2.52)
Ниже в листинге 2.8 приведен пример поведенческого описания для шифратора, в листинге 2.9 приведен код для дешифратора.
module encoder3 (
input wire [7:0] in, // 8-битный входной сигнал
output reg [2:0] out, // 3-битный выходной сигнал
output reg valid // Сигнал активности выхода
);
// Определяем поведение шифратора
always @(*) begin
case (in)
8'b00000001: begin out = 3'b000; valid = 1; end
8'b00000010: begin out = 3'b001; valid = 1; end
8'b00000100: begin out = 3'b010; valid = 1; end
8'b00001000: begin out = 3'b011; valid = 1; end
8'b00010000: begin out = 3'b100; valid = 1; end
8'b00100000: begin out = 3'b101; valid = 1; end
8'b01000000: begin out = 3'b110; valid = 1; end
8'b10000000: begin out = 3'b111; valid = 1; end
default: begin out = 3'b000; valid = 0; end // Сигнал по умолчанию
endcase
end
endmodule
На рисунке 2.53 приведено RTL представление шифратора
(рис 2.53)
module decoder3to8 (
input wire [2:0] in, // 3-битный входной сигнал
output reg [7:0] out // 8-битный выходной сигнал
);
// Определяем поведение дешифратора
always @(*) begin
// Сбрасываем выход на нули
out = 8'b00000000;
// Устанавливаем один бит в 1 в зависимости от входного сигнала
case (in)
3'b000: out[0] = 1'b1;
3'b001: out[1] = 1'b1;
3'b010: out[2] = 1'b1;
3'b011: out[3] = 1'b1;
3'b100: out[4] = 1'b1;
3'b101: out[5] = 1'b1;
3'b110: out[6] = 1'b1;
3'b111: out[7] = 1'b1;
default: out = 8'b00000000; // В случае ошибки сбрасываем на нули
endcase
end
endmodule
На рисунке 2.54 приведено RTL представление дешифратора
(рис 2.54)
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.