«Схемы без памяти» icon

«Схемы без памяти»


Смотрите также:
Лабораторная работа №4. Энтропия источника дискретных сообщений без памяти...
1. Общие представления о памяти. Круг явлений памяти. Патологии памяти...
Представление о памяти и ее основных видах Гамидова А. П...
Методы проверки электронных компонентов...
"Без памяти нет традиций, без воспитания нет духовности, без духовности нет личности...
Программа годового курса «Численные методы решения задач математической физики»...
Врасчетно-теоретическом разделе рассмотрены вопросы, касающиеся обоснования структурной схемы...
Врасчетно-теоретическом разделе рассмотрены вопросы, касающиеся обоснования структурной схемы...
Исследования памяти в ассоцианизме, поведенческой и когнитивной психологии...
Тест числового ряда Тест «Сходство»...
Билеты: 1
Вопросы по курсу «аналоговые электронные схемы» 2007...



Загрузка...

Введение в логическое проектирование аппаратуры

Аннотация к курсу


Курс представляет собой краткое введение в логическое проектирование цифровой аппаратуры, в частности, в язык описания аппаратуры Verilog. Его цель — познакомить студентов с методами описания и логического моделирования цифровых схем, подготовить фундамент для возможной специализации в области функциональной верификации аппаратуры. В курсе рассматриваются основные математические формализмы, используемые при проектировании аппаратуры (схемы из функциональных элементов, абстрактные и структурные автоматы), и то, как эти формализмы представляются на языке Verilog. Курс читается в рамках спецсеминара «Верификация и валидация программ» и рассчитан на студентов 3 курса.
^

Лекция 1 «Схемы без памяти»

Введение


Цифровой аппаратурой называются устройства, в которых (с логической точки зрения, со стороны пользователя) входная и выходная информация представляется в дискретной форме, а обработка информации осуществляется с помощью дискретных преобразований. Примерами цифровой аппаратуры являются счеты, арифмометры, калькуляторы, микропроцессоры, процессоры цифровой обработки сигналов и другие устройства. Как правило, если речь идет о цифровой электронике, под дискретным представлением информации понимается двоичное представление. Есть и исключения, например, троичная ЭВМ «Сетунь» (Н.П. Брусенцов, МГУ, 1959 г.). Оппозицию цифровой аппаратуре составляет так называемая аналоговая аппаратура. К этому классу относятся радио, пленочные фотоаппараты, аналоговые компьютеры и другие. Аналоговая аппаратура в курсе не рассматривается, поэтому в дальнейшем (для краткости) будем называть цифровую (электронную) аппаратуру просто аппаратурой.

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

Различают следующие основные этапы процесса проектирования аппаратуры:

  1. Поведенческое проектирование (уровень архитектуры).

  2. Детальное проектирование (уровень регистровых передач).

  3. Логический синтез (уровень логических вентилей).

  4. Физический синтез (уровень транзисторов).

Основным средством поведенческого проектирования (первый этап) являются языки программирования высокого уровня (C/C++) и языки системного проектирования (SystemC, SystemVerilog). Результатом этого этапа, помимо уточнения требований и создания соответствующей документации, является программный эмулятор разрабатываемой аппаратуры. Важно отметить, что такие эмуляторы используются для верификации в качестве эталонных моделей.

На втором этапе с использованием языка описания аппаратуры (Verilog, VHDL) предельно точно описывается логическая структура и функционирование устройства. Широко распространенным подходом, применяемым при построении аппаратуры, является синхронизация подсистем с помощью так называемого синхроимпульса (тактового сигнала), который передается во все модули устройства и управляет пересылками сигналов внутри модулей и между ними. Такое описание называется моделью уровня регистровых передач (RTL, register transfer level).

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

На четвертом этапе осуществляется размещение и трассировка топологии схемы на кристалле для заданного набора технологических ограничений (взаимное расположение элементов схемы, площадь кристалла, минимальное расстояние между проводниками, размер проводника и т.п.). Этап физического проектирования, также как и предшествующий ему этап логического проектирования, автоматизирован средствами современных САПР. Процесс, в результате которого решаются указанные выше задачи называется физическим синтезом.

Нас, прежде всего, будет интересовать логическое (функциональное) проектирование аппаратуры, которое охватывает первые три этапа. Особое внимание мы будем уделять проектированию на уровне регистровых передач и немного на уровне вентилей (gate-level design). Результатом логического проектирования является исполнимая модель (другими словами, программа), которую можно выполнять в специальной среде имитационного моделирования (симуляторе).

В своей работе мы будем использовать следующие инструменты:

  1. Icarus Verilog (http://sourceforge.net/projects/iverilog) — Verilog-симулятор.

  2. GTKWave (http://sourceforge.net/projects/gtkwave) — визуализатор диаграмм сигналов.

^ Домашнее задание. Установить указанные выше инструменты на домашний компьютер. Проще это сделать под Linux. Если вы привыкли работать в Windows, можете установить виртуальную машину VirtualBox (https://www.virtualbox.org).
^

Схемы из функциональных элементов


Различают схемы без памяти (комбинационные схемы) и схемы с памятью (последовательные схемы). Одной из математических моделей комбинационных схем являются схемы из функциональных элементов (СФЭ). Другими моделями являются контактные схемы (C. Shannon, 1937) и двоичные решающие диаграммы (C. Lee, 1959). По сути, указанные формализмы являются разными способами представления функций алгебры логики (ФАЛ). Напомним определение СФЭ.

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

Определение. Схемой из функциональных элементов (СФЭ) в базисе B называется размеченный ориентированный граф без циклов, в котором

  1. вершины, являющиеся истоками, помечены символами переменных и называются входами (разным вершинам соответствуют разные переменные);

  2. каждая вершина, в которую входит k  1 дуг, помечена функцией из базиса B, зависящей от k переменных (такие вершины называются функциональными элементами или вентилями);

  3. некоторые вершины выделены как выходы (входные вершины могут быть и выходными).

Определение. Сложностью СФЭ называется число входящих в нее ФЭ.

Часто в качестве базиса используют {, , }. Соответствующие ФЭ называются дизъюнктором (вентиль ИЛИ), конъюнктором (вентиль И) и инвертором (вентиль НЕ). Графически вентили изображаются следующим образом (стандарт ANSI).



OR

Дизъюнкция (ИЛИ)



AND

Конъюнкция (И)



NOT

Отрицание (НЕ)



XOR

Сумма по модулю 2 (исключающее ИЛИ)



NOR

Стрелка Пирса (НЕ-ИЛИ)



NAND

Штрих Шеффера (НЕ-И)



XNOR

Эквиваленция (исключающее ИЛИ-НЕ)

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

Задание. Изобразить графически схемы, реализующие следующие функции:

1) мультиплексор 2-в-1 (if sel then out=in0 else out=in1);

^ 2) мультиплексор 4-в-1.

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

1) демультиплексор 1-в-2 (if sel then out0=in else out1=in);

2) демультиплексор 1-в-4.
^

Представление схем на языке Verilog

Общая информация о языке


Язык Verilog был создан Филом Мурби (Phil Moorby) в 1983-1984 гг. в фирме Automated Integrated Design Systems (с 1985 г. Gateway Design Automation) как язык описания аппаратуры. (В 1990 г. Gateway Design Automation была куплена Cadence Design Systems.) Verilog, как и VHDL, относится к классу языков известных как HDL (hardware description languages). Язык Verilog часто сравнивают с языком программирования C, а VHDL — с языком Ada, в виду сходства некоторых синтаксических конструкций. Язык стандартизован в IEEE (стандарты IEEE 1364—{1995,2001,2005}). Имеется объектно-ориентированное расширение SystemVerilog (по большому счету, это новый язык, для которого Verilog является подмножеством).
^

Модули, пример “Hello World”


Основной сущностью языка Verilog является модуль. Модуль описывает часть схемы, решающую некоторую задачу. У модуля есть интерфейс (входные и выходные сигналы) и реализация (способ вычисления значений выходных сигналов по значениям входных сигналов). Ниже приведено описание интерфейса модуля mux4_1 (мультиплексора 4-в-1).

// начало определения модуля (имя и список интерфейсных сигналов)

module mux4_1(out, in0, in1, in2, in3, sel);

output out; // одноразрядный выход

input in0, in1, in2, in3; // одноразрядные входы

input [1:0] sel; // двухразрядный вход

...

// конец определения модуля

endmodule /* mux4_1 */

Как правило, каждый модуль определяется в отдельном файле, имя которого совпадает с именем модуля. В качестве расширения имени файла обычно используется *.v или *.vl. Приведенный выше модуль логично определить в файле mux4_1.v.

Рассмотрим пример простейшего модуля на языке Verilog, осуществляющего вывод на экран строки “Hello World”.

// модуль верхнего уровня не имеет интерфейсных сигналов

// (список в скобках можно опустить)

module hello_world;

initial begin // начало блока инициализации

$display(“Hello World”); // вывод строки на печать

end // конец блока инициализации

// блоков инициализации может быть несколько

// конец определения модуля

endmodule /* hello_world */
^

Синтезируемое подмножество языка


Подмножество языка Verilog, состоящее из конструкций, допускающих представление в форме элементарных логических вентилей и триггеров, называется синтезируемым подмножеством. Очевидно, что конструкция $display() не является синтезируемой.
^

Логические значения и операции над ними


В языке Verilog используется 4-значная логика. Возможны следующие логические значения:

  • 0 – логический нуль;

  • 1 – логическая единица;

  • X – неопределенное значение;

  • Z – высокий импеданс.

Логические значения {0,1,X} вместе с операциями над ними образуют сильную трехзначную логику Клини (0 & X = X & 0 = 0; 1 & X = X & 1 = X).

Использование логического значения Z в выражении приводит к такому же результату, что и при использовании значения X (например, 1 & Z = X). Другими словами, Z — это частный, но особо выделенный случай неопределенного значения.

Над логическими значениями определены следующие операции:

  • & — И;

  • | — ИЛИ;

  • ^ — исключающее ИЛИ;

  • ~ — НЕ;

  • ~& — НЕ-И (только в редуцированной форме: ~&v, v — вектор);

  • ~| — НЕ-ИЛИ (только в редуцированной форме: ~|v, v — вектор);

  • ~^ — исключающее НЕ-ИЛИ.

  • Сравнение ==, != (X если хотя бы один из операндов X или Z), ===, !==.

Следует заметить, что данные операции можно применять и для многоразрядных сигналов (в этом случае операция осуществляется поразрядно).

При моделировании на уровне логических вентилей можно использовать соответствующие модули: buf(out, in), not (для buf и not можно задавать несколько выходов, вход должен быть один), and(out, in1, in2), or, xor, nor, nand, xnor (можно задавать более двух входов).
^

Многоразрядные константы


В языке Verilog используется следующий формат многоразрядных (числовых) констант: разрядность’система_счислениязначение. В значении для наглядности можно использовать незначащий символ _. Примеры констант приведены ниже.

4’b1001

64’h0

16’b1010_0101_1111_0000

16’hDEAD

Задание. Чему равно значение выражения:

  • 2’bZX^2’bZX (2’bXX);

  • 4’b01XZ&4’bXZX1 (4’b0XXX).
^

Непрерывное присваивание


Комбинационные схемы обычно определяются с помощью конструкции непрерывного присваивания:

wire out;

assign out = in1 & in2;


wire out = in1 & in2;

В операторе непрерывного присваивания можно задавать величину задержку:

wire out;

assign #10 out = in1 & in2;

assign out = #10 in1 & in2;


wire #10 out;

assign out = in1 & in2;

Пример. Тактовый генератор.

assign clk = #10 ~clk;

Пример. Штрих Шеффера (вентиль НЕ-И).

module nand(out, in0, in1);

output out;

input in0, in1;

assign out = ~(in0 & in1);

endmodule /* nand */

Для задания единицы измерения времени используется директива `timescale единица / точность. Допускаются следующие значения {1 | 10 | 100} {s | ms | us | ns | ps}.

Пример. Использование директивы `timescale.

`timescale 10ps/1ps

assign #1.23 out = in1 & in2; // задержка 12 ps

Пример. Мультиплексор 4-в-1.

module mux4_1(out, in0, in1, in2, in3, sel0, sel1);

output out;

input in0, in1, in2, in3;

input sel1, sel0;

assign out = (~sel1 & ~sel0 & in0) |

(~sel1 & sel0 & in1) |

( sel1 & ~sel0 & in2) |

( sel1 & sel0 & in3);

endmodule /* mux4_1 */
^

Операции над битовыми массивами


  • val[i] — доступ к элементу;

  • val[i2:i1] — получение подмассива;

  • {val1, ..., valn} — конкатенация;

  • n{val} — повторение ({val, …, val}).
^

Инстанцирование модулей


Инстанцирование модулей рассмотрим на следующем примере.

module testbench;

reg clk;

wire [7:0] data;


count target(

.clk(clk),

.data(data)

);


initial begin

clk = 1'b0;

#10;

clk = 1'b1;

...

end

endmodule /* testbench */


Домашнее задание. Опишите на языке Verilog следующие модули:

1) 8-битный сумматор.

2) демультиплексор 1-в-4.
^

Лекция 2 «Схемы с памятью»

Введение


На прошлой лекции нами были рассмотрены схемы без памяти, называемые также комбинационными схемами. Очевидно, что область применения таких схем ограничена. Они подходят для описания функций (преобразований данных), но не годятся для описания систем, поведение которых зависит от истории взаимодействия с окружением (так называемых реагирующих систем). Между тем, практически в любой аппаратуре присутствует управляющая логика (или явно выделенное устройство управления), отвечающая за обработку событий окружения и планированием запуска тех или иных функциональных блоков. В качестве примера можно привести устройство управления конвейером микропроцессора. Устройство получает на вход поток инструкций, разбивает инструкции на микрооперации и подает на функциональные блоки, синхронизируя их работу. Ключевое отличие реагирующих систем от систем преобразования данных заключается в том, что реагирующие системы работают в «бесконечном цикле».

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

Абстрактный автомат


Определение. Абстрактным автоматом называется четверка S, X, Y, T, где:

  • S – множество состояний;

  • X – множество входных символов (стимулов);

  • Y – множество выходных символов (реакций);

  • TSXYS – отношение переходов.

Определение. Автомат с выделенным начальным состоянием s0 называется инициальным.

Определение. Если отношение переходов конечно, автомат называется конечным.

Определение. Автомат называется детерминированным, если для любой пары переходов (s1x1y1s1') и (s2x2y2s2') из равенства (s1x1) = (s2x2) вытекает равенство (y1s1') = (y2s2').

Другими словами, для детерминированного автомата существует функциональные зависимости результирующего состояния (s') и реакции (y) от исходного состояния (s) и стимула (x): : SX  S (функция переходов) и : SX  Y (функция выходов). В дальнейшем будем рассматривать только детерминированные инициальные конечные автоматы, называя их просто автоматами.

Автомат функционирует в дискретном времени t = 0, 1, 2, ... Обозначим, через s(t), x(t) и y(t) состояние автомата, подаваемый стимул и выдаваемую реакцию в момент времени t. Тогда, функционирование автомата описывается следующими уравнениями (*):

s(0) = s0;

s(t+1) = (s(t), x(t));

y(t) = (s(t), x(t)).

Следует сразу отметить, что различают два типа автоматов: автоматы Мили и автоматы Мура. В отличие от автоматов Мили, функционирование которых описывается уравнениями (*), в автоматах Мура функция выходов  зависит только от текущего состояния (**):

s(0) = s0;

s(t+1) = (s(t), x(t));

y(t) = (s(t)).

Нетрудно показать, что для любого автомата Мили можно построить эквивалентный ему автомат Мура и наоборот.

Существует множество способов описания конечных автоматов. Наиболее известными являются графический и табличный методы. В первом из них автомат представляется графом переходов – ориентированным графом, вершинами которого являются состояния, а дугами – переходы (каждая дуга помечается стимулом и реакцией). В табличном способе автомат представляется в форме таблиц (двух или одной):

:X\S

s1

...

sn




:X\S

s1

...

sn




X\S

s1

...

sn

x1

s11

...

sn1




x1

y11

...

yn1




x1

s11/y11

...

sn1/yn1

...

...

...

...




...

...

...

...




...

...

...

...

xm

s1m

...

snm




xm

y1m

...

ynm




xm

s1m/y1m

...

snm/ynm

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

Задание. Изобразите граф состояний автомата, управляющего пешеходным переходом. Если для пешеходов горит красный свет, чтобы ускорить включение зеленого сигнала, можно нажать кнопку.
^

Структурный автомат


Если абстрактный автомат является лишь абстрактной моделью реагирующей системы, то в структурном автомате учитывается кодирование состояний, входных и выходных символов, а также его внутреннее устройство на уровне структурных схем.

Определение. Структурным автоматом (структурных схемой автомата) называется конечный автомат, в котором состояния, стимулы и реакции представлены в форме двоичных векторов, заданы типы элементов памяти для хранения состояния, функции переходов и выходов реализованы в форме комбинационных схем (КС).

Кодирование состояний не влияет на функциональность аппаратуры, но важно для таких характеристик устройства как надежность, энергопотребление и других. Надежность, к примеру, обеспечивается избыточным кодированием (биты четности, коды Хэмминга, CRC и т.п.). Для минимизации энергопотребления выбирают такой способ кодирования, при котором коды соседних состояний отличаются в небольшом числе разрядов (это минимизирует число переключений триггеров).

Структурный автомат можно представить состоящим из двух частей: (1) элементов памяти и (2) комбинационной схемы.



Функция (s1(t+1), ..., sk(t+1)) называется функцией возбуждения памяти автомата (она зависит от типов и элементов памяти и, вообще говоря, не обязана совпадать с функцией переходов ); сигналы (s1(t), ..., sk(t)) образуют обратную связь от памяти к комбинационной схеме.

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

Задание. Предложить способ кодирования состояний, стимулов и реакций определенного ранее абстрактного автомата.

Триггеры


В общем случае возможны разные типы элементов памяти — триггеры. Триггеры бывают синхронными и асинхронными. Некоторые разновидности триггеров, например, RS-триггеры, допускают как синхронное, так и асинхронное исполнение. Триггер называется синхронным, если его работа управляется тактовым сигналом (обозначаемым C или CLK от англ. clock).



Фронты тактового сигнала разбивают непрерывное время на дискретный набор интервалов, называемых тактами. Фронтом называется изменение уровня сигнала с низкого на высокий (положительный фронт, positive edge) или с высокого на низкий (отрицательный фронт, negative edge). Для простоты будем считать, что схемы работают по положительному фронту, то есть входные сигналы считываются при высоком уровне тактового сигнала и игнорируются при низком уровне.

Самыми распространенными типами элементов памяти являются D-, RS- (SR-) и JK-триггеры. D-триггеры (от англ. delay) являются синхронными, RS- (от англ. reset/set) и JR-триггеры (от англ. jump/kill) могут быть как синхронными, так и асинхронными. Ниже представлены таблицы переходов для данных типов триггеров.

D\T 0 1 RS\T 0 1 JK\T 0 1

0 0 0 00 0 1 00 0 1

1 1 1 01 1 1 01 0 0

10 0 0 10 1 1

11 1 0

D-триггер является не чем иным, как единичной задержкой: он запоминает и воспроизводит на выходе (с задержкой) то, что подается ему на вход.

RS-триггер устанавливает состояние в 1, если S=1; сбрасывает состояние в 0, если R=1; не изменяет состояние, если RS=00; комбинация RS=11 запрещена.

JK-триггер работает как RS-триггер (где J=S, K=R), но при подаче на вход комбинации JK=11 инвертирует состояние.

Задание. Определить функцию перехода синхронных D-, RS- и JK-триггеров.

D: Q(t+1) = D(t)

RS: Q(t+1) = ~R(t)&(Q(t)|S(t)) | (x&S&R), x неопределенное значение.

JK: Q(t+1) = ~Q(t)&J(t) | Q(t)&~K(t)

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

Задание. Реализовать единичную задержку через (D-триггер), используя:

  1. синхронные RS-триггеры;

  2. синхронные JK-триггеры.

Триггеры можно определить через схемы из функциональных элементов с обратными связями. Формально семантику таких схем мы определять не будем. Идея заключается в том, что выходное значение схемы стабилизируется не сразу, а после серии итераций (входы нужно держать неизменными некоторое время). Полученное стабильное состояние и есть выходное значение. Например, асинхронный RS-триггер можно представить следующей схемой.



Эта схема на языке Verilog описывается следующим образом.

// асинхронный RS-триггер

module rs_flipflop(q, n, r, s);

output q, n;

input r, s;

nor gate1(q, r, n);

nor gate2(n, s, q);

endmodule /* rs_flipflop */


Домашнее задание. Нарисовать схему для синхронного JK-триггера, описать схему на языке Verilog, написать функциональный тест.
^

Описание схем с памятью на языке Verilog


Рассмотрим пример D-триггера (D flip-flop).

// D-триггер с асинхронным сбросом

module d_flipflop(q, d, clk, rst);

output q;

input d, clk, rst;

reg q; // возможность присваивания

always @(posedge clk or posedge rst) // список чувствительности

if(rst)

q = 1’b0;

else

q = d;

endmodule /* d_flipflop */
^

Моделирование памяти


Для моделирования памяти обычно используется конструкция reg.

Примеры

reg mem; // один бит

reg mem[0:15]; // 16-разрядный регистр

reg [0:7] mem [0:31]; // 32 8-разрядных регистров

Ключевое слово reg можно использовать как в отношении внутренних данных, так и выходных сигналов (см. пример D-триггера).

Замечание. К регистрам нельзя применять непрерывное присваивание. Непрерывное присваивание можно применять только к проводам (net, в частности, wire). Для регистров следует использовать процедурное присваивание.
^

Процедурное присваивание


  • = — блокируемое присваивание;

  • <= — неблокируемое присваивание.

Примеры

// блокируемое присваивание

a = 1; b = 2;

begin

a = b;

b = a; // a == 2, b == 2

end


// неблокируемое присваивание

a = 1; b = 2;

begin

a <= b;

b <= a; // a == 2, b == 1

end

Always-блоки


Примеры

always // бесконечный цикл

clk = #10 ~clk;


always @(posedge clk) // обработчик события

...


always @(posedge clk or posedge rst) // обработчик нескольких событий

...


// Гонка: возможны разные порядки

always @(posedge clk) a = b;

always @(posedge clk) b = a;

// Гонки нет

always @(posedge clk) a <= b;

always @(posedge clk) b <= a;

Конструкция @(событие1 or ... событиеn) называется списком чувствительности процесса.
^

Управляющие конструкции


Конструкция if

if(1>) 1>;

else if(2>) 2>;

...

else ;

Конструкция case

case()

1>: 1>;

2>: 2>;

...

default: ;

endcase

Пример. Мультиплексор 4-в-1.

module mux4_1(out, i0, i1, i2, i3, s1, s0);

output out;

input i0, i1, i2, i3;

input s1, s0;

reg out;

always @(s1 or s0 or i0 or i1 or i2 or i3)

begin

case({s1, s0})

2'b00: out = i0;

2'b01: out = i1;

2'b10: out = i2;

2'b11: out = i3;

default: out = 1'bx;

endcase

end

endmodule /* mux4_1 */

Задание. Описать на языке Verilog модуль управления пешеходным переходом.

`timescale 1s/1ms

  • Входы: button (импульсный сигнал).

  • Выходы: r1, y1, g1, r2, y2, g2 (потенциальные сигналы).

Домашнее задание. Модуль управления лифтом. Сформулировать требования. Продумать интерфейс. Описать на языке Verilog. Написать тест.


^

Лекция 3 «Примеры проектирования на языке Verilog»


В данной лекции будет рассмотрено несколько примеров проектирования аппаратуры. Цель лекции – продемонстрировать (пусть и в несколько упрощенной форме) основные этапы процесса проектирования аппаратуры (поведенческое проектирование и проектирование на уровне регистровых передач).

Пример 0. «Память прямого доступа на 4 слова»

`timescale 1ns/1ps


// RAM consisting of four 32-bit items

module ram(clk, rst, val_rd, val_wr, addr_in, data_in, val_out, data_out, is_ready);

input clk;

input rst;

input val_rd;

input val_wr;

input [1:0] addr_in;

input [31:0] data_in;

output val_out;

output [31:0] data_out;

output is_ready;


reg [31:0] mem0;

reg [31:0] mem1;

reg [31:0] mem2;

reg [31:0] mem3;


reg [31:0] result;

reg [1:0] state;


// State encoding

parameter^ RAM_IDLE = 2'b00;

parameter RAM_READ = 2'b01;

parameter RAM_WRITE = 2'b10;

parameter RAM_RESULT = 2'b11;


assign is_ready = (state == RAM_IDLE);

assign val_out = (state == RAM_RESULT);

assign data_out = (state == RAM_RESULT) ? result : 32'h0000_0000;


always @(posedge rst)

begin

mem0 <= 32'hXXXX_XXXX;

mem1 <= 32'hXXXX_XXXX;

mem2 <= 32'hXXXX_XXXX;

mem3 <= 32'hXXXX_XXXX;

result <= 32'hXXXX_XXXX;

state <= 2'b00;

end


always @(posedge clk)

begin

if(state == RAM_IDLE)

begin

// Read operation

if(~rst & val_rd)

begin

state <= RAM_READ;


// Multiplexor 4-to-1

case(addr_in)

2'b00: result <= mem0;

2'b01: result <= mem1;

2'b10: result <= mem2;

2'b11: result <= mem3;

endcase

end

// Write operation

else if(~rst & val_wr)

begin

state <= RAM_WRITE;

result <= 32'hXXXX_XXXX;


// Demultiplexor 1-to-4

case(addr_in)

2'b00: mem0 <= data_in;

2'b01: mem1 <= data_in;

2'b10: mem2 <= data_in;

2'b11: mem3 <= data_in;

endcase

end

end

else

begin

if(state == RAM_RESULT)

begin

state <= RAM_IDLE;

end

else

begin

state <= RAM_RESULT;

end

end

end

endmodule /* ram */

Пример 1. «Очередь FIFO»

`timescale 1ns/1ps


// FIFO queue consisting of four 8-bit items

module fifo(clk, rst, val_rd, val_wr, data_in, val_out, data_out, is_full, is_ready);

input clk;

input rst;

input val_rd;

input val_wr;

input [31:0] data_in;

output val_out;

output [31:0] data_out;

output is_full;

output is_ready;


// RAM[i] is available

reg val0, val1, val2, val3;


reg [1:0] addr0;

reg [1:0] addr1;

reg [1:0] addr2;

reg [1:0] addr3;


reg [1:0] last;


wire [1:0] free_addr;

wire [1:0] addr_in;


assign is_full = val0 & val1 & val2 & val3;


assign free_addr = (~val0 ? 2'h0 :

(~val1 ? 2'h1 :

(~val2 ? 2'h2 :

(~val3 ? 2'h3 : 2'hX))));


assign addr_in = val_wr ? free_addr : (val_rd ? addr0 : 2'h0);


ram memory

(

.clk(clk),

.rst(rst),

.val_rd(val_rd),

.val_wr(val_wr),

.addr_in(addr_in),

.data_in(data_in),

.val_out(val_out),

.data_out(data_out),

.is_ready(is_ready)

);


always @(posedge rst)

begin

val0 <= 1'b0;

val1 <= 1'b0;

val2 <= 1'b0;

val3 <= 1'b0;

addr0 <= 2'hX;

addr1 <= 2'hX;

addr2 <= 2'hX;

addr3 <= 2'hX;

last <= 2'h0;

end


always @(posedge clk)

begin

if(~rst & val_wr)

begin

@(val_out);


case(last)

2'h0: begin

addr0 <= free_addr; val0 <= 1'b1; last <= 2'h1;

end

2'h1: begin

addr1 <= free_addr; val1 <= 1'b1; last <= 2'h2;

end

2'h2: begin

addr2 <= free_addr; val2 <= 1'b1; last <= 2'h3;

end

2'h3: begin

addr3 <= free_addr; val3 <= 1'b1; last <= 2'h3;

end

endcase

end

else if(~rst & val_rd)

begin

case(addr0)

2'h0: val0 <= 1'b0;

2'h1: val1 <= 1'b0;

2'h2: val2 <= 1'b0;

2'h3: val3 <= 1'b0;

endcase


case(last)

2'h0: last <= 2'h0;

2'h1: last <= 2'h0;

2'h2: last <= 2'h1;

2'h3: last <= 2'h2;

endcase


@(val_out);


addr0 <= addr1;

addr1 <= addr2;

addr2 <= addr3;

addr3 <= 2'hX;

end

end

endmodule /* fifo */

Домашнее задание. Доделать модуль FIFO, написать базовый тест, результат отправить по почте.
^

Лекция 4 «Дискретно-событийное моделирование»

Введение


Как мы уже знаем, модели аппаратуры на HDL-языках можно выполнять в специальном программном окружении — симуляторе. Большинство симуляторов аппаратуры основано на парадигме дискретно-событийного имитационного моделирования (event-driven simulation), называемой также принципом особых состояний. Суть этого подхода заключается в абстрагировании от непрерывной природы явлений (например, распространение электрического тока) и рассмотрении только основных событий в моделируемой системе (изменение уровня сигнала, окончание времени ожидания). Дискретно-событийное моделирование имеет огромную сферу приложений, включая рассматриваемое нами моделирование аппаратуры, а также моделирование бизнес-процессов, боевых действий, транспортных потоков. Основателем подхода считается Джеффри Гордон (1960-ые гг.).

Альтернативой событийному моделированию является моделирование по интервалам времени (cycle-driven simulation).
^

Дискретно-событийное моделирование аппаратуры

Основные понятия


Модельное время (время симулятора) — дискретная величина, не убывающая в процессе моделирования, значения которой кратны заданной точности моделирования.

Событие — это изменение значение сигнала, осуществляемое в определенное время. События вызываются присваиваниями и происходят мгновенно. Если присваивание не меняет значения сигнала, события не возникает.

^ Очередь присваиваний (транзакций) — упорядоченный по времени список запланированных присваиваний (с каждым присваиванием A ассоциировано время tA, когда оно осуществляется). Список является глобальным для всех сигналов модели.

^ Драйвер сигнала — проекция очереди присваиваний для данного сигнала, то есть драйвер сигнала — это список запланированных изменений этого сигнала.

Пример

A <= #2 1;

B <= #4 0;

C <= #8 1;

^ Очередь присваиваний: (A, 1, 2), (B, 4, 0), (C, 8, 1)

Обработчик события — множество процессов, которые запускаются при возникновении события. Обработчик события, может порождать новые присваивания (transaction generation), которые добавляются в очередь присваиваний. Важно отметить, что сами присваивания при этом не осуществляются.

Примеры

always @(posedge clk) ... // обработчик положительного фронта clk


assign z = #10 x & y // обработчик изменения x или y
^

Цикл работы симулятора


  1. Получить очередное присваивание (или присваивания) A из очереди.

  2. Изменить текущее время симулятора Tsim на время TA.

  3. Осуществить присваивание (присваивания).

  4. Если возникло событие, вызвать обработчик события.

В начальный момент Tsim=0 и запускаются процессы инициализации (initial) и другие процессы, для которых не указан список чувствительности.

При обновлении очереди присваиваний (драйвера сигнала) возможны конфликты — одновременные присваивания различных значений. Разрешение конфликтов управляется типами соединений (например, wor и wand), которые в нашем курсе не рассматриваются.

Если несколько присваиваний имеют одно и то же время, их порядок не определен. Порядок вызова активных процессов также не определен. Для задания порядка «одновременных» присваиваний используются дельта-задержки.

Дельта-задержка


Дельта-задержка — это бесконечно малая задержка, используемая для упорядочивания событий, происходящих одновременно.

Примеры

initial A = 1;

initial A = 0; // порядок не определен


initial A = 1;

initial A = #0 0; // сначала A = 1, потом A = 0

Примеры

A <= #2 1; // в очередь добавляется <A, 1, Tsim+2>


A <= 1; // в очередь добавляется <A, 1, Tsim+1>

Теоретически, любое конечное число дельта-задержек меньше одной единицы времени. На практике, максимальное число дельта-задержек, в одной единице времени является параметром симулятора.

Таким образом, в симуляторах используется двумерная модель времени. На оси абсцисс указываются моменты времени наступления событий. На оси ординат откладываются дельта-задержки. Например, (4, 2) означает, что событие происходит в момент времени 4 спустя две дельта-задержки.

Занятие 5: Контрольная работа









Скачать 269.68 Kb.
оставить комментарий
Дата28.08.2012
Размер269.68 Kb.
ТипЛекция, Образовательные материалы
Добавить документ в свой блог или на сайт

Ваша оценка этого документа будет первой.
Ваша оценка:
Разместите кнопку на своём сайте или блоге:
rudocs.exdat.com

Загрузка...
База данных защищена авторским правом ©exdat 2000-2017
При копировании материала укажите ссылку
обратиться к администрации
Анализ
Справочники
Сценарии
Рефераты
Курсовые работы
Авторефераты
Программы
Методички
Документы
Понятия

опубликовать
Загрузка...
Документы

Рейтинг@Mail.ru
наверх