- •Глава 5. Язык описания аппаратуры Verilog hdl
- •5.1.Общие сведения
- •5.2. Операторы
- •5.3. Числа в Verilog.
- •5.3.1. Целые числа (Integers)
- •5.3.2. Неопределенное и высокоимпедансное состояния (X and z values)
- •5.5. Регистры (Registers)
- •5.6. Векторы (Vectors)
- •5.7. Массивы (Arrays)
- •5.8. Регистровые файлы (Memories)
- •5.9. Элементы с третьим состоянием (Tri-state)
- •5.10. Арифметические операторы (Arithmetic operators)
- •5.11. Логические операторы (Logical Operators)
- •5.12. Операторы отношения (Relational Operators)
- •5.13. Операторы эквивалентности (Equality )
- •5.14. Поразрядные Операторы (Bitwise Operators)
- •5.15. Операторы приведения (Reduction Operator)
- •5.16. Операторы сдвига (Shift Operator).
- •5.17. Конкатенация (объединение,Concatenation )
- •5.18. Повторение (Replication)
- •5.19. Системные директивы (System Tasks)
- •5.19.1. Директивы вывода результатов моделирования (Writing to Standard Output)
- •5.19.2. Контроль процесса моделирования (Monitoring a Simulation).
- •5.19.3. Окончание моделирования (Ending a simulation)
- •5.20. Проектирование комбинационных схем: пример проектирования мультиплексора 4 в 1.
- •5.20.1. Реализация на уровне логических вентилей (Gate Level Implementation)
- •5.20.2. Реализация мультиплексора с помощью логических операторов (Logic Statement Implementation)
- •5.20.3. Реализация с помощью оператора выбора (Case Statement Implementation)
- •5.20.4. Реализация с использованием условного оператора (Conditional Operator Implementation)
- •5.20.5. Тестовый модуль (The Stimulus Module)
- •5.21. Модули проекта (Design Blocks Modules)
- •5.21.1. Тестирование
- •5.22. Порты (Ports)
- •5.23. Правила соединения (Connection Rules)
- •5.24.2. Конструкция always (Always Block)
- •5.25. Пример проектирования последовательностного устройства: двоичный счетчик
- •5.25.1. Поведенческая модель счетчика(Behavioural Model)
- •5.26. Временной контроль (Timing Control)
- •5.26.1. Задержки (Delay)
- •5.26.2. Событийный контроль (Event-Based control)
- •5.27. Защелкивание (Triggers)
- •5.30.2. Оператор выбора (case statement)
- •5.30.3. Оператор ветвления (conditional operator)
- •5.31. Циклы (Looping Constructs)
- •5.31.1. Цикл While (While Loop )
- •5.31.2. Цикл For (For Loop)
- •5.31.3. Цикл Repeat (Repeat Loop)
- •5.31.4. Вечный цикл (Forever Loop)
- •5.32.Файлы в Verilog
- •5.32.1. Открытие файла (Opening a file)
- •5.32.2. Запись в файл (Writing to a file)
- •5.32.3. Закрытие файла (Closing a file)
- •5.32.4. Инициализация регистровых файлов (памяти) (Initialising Memories )
- •5.33. Задание векторов входных сигналов для моделирования (Verilog Input Vectors)
- •5.34. Список операторов Verilog
- •5.35. Приоритет операторов
- •5.36. Ключевые слова (Keywords )
- •5.37. Директивы компилятора
- •5.38. Типы цепей (Net Types)
5.22. Порты (Ports)
Порты обеспечивают связь модуля с другими модулями проекта. Ниже приведен порты для нашего примера
module d_ff(q, d, reset, clock);
module e_ff(q, d, enable, reset, clock);
module Stimulus;
Каждый порт может быть объявлен как вход (input), выход (output) или двунаправлекнный (inout). Все объявленные порты по умолчанию назначаются цепи (wire), для изменения типа сигнала необходимо выполнить назначение отдельно. Например
module d_ff(q, d, reset, clock);
output q; // обязательное объявление портов
input d, reset, clock; // как входы и выходы
reg q; // снова объявляем как регистр
Не забываем, что выходы модуля идут первыми в списке портов.
5.23. Правила соединения (Connection Rules)
Выше мы рассматривали два типа модулей - внешние и внутренние (outer and inner), в нашем примере внешним модулем был Е-триггер, внутренним – триггер типа D. Ниже рассмотрим основные правила соединения модулей.
5.23. 1. Входы (Inputs)
Входы внутреннего модуля всегда должны имет тип цепь, поскольку они управляются внешними сигналами. Входы внешнего модуля могут иметь тип как цепь, так и регистр.
5.23.2. Выходы (Outputs)
Во внутреннем модуле выходы могут иметь тип как цепь, так и регистр, в то время как выходы внешнего модуля дожны быть типа цепь, поскольку управляются внутренними модулями.
5.23.3. Двунаправленые выводы (Inouts)
Двунаправленный порт всегда имеет тип цепь.
5.23.4. Соответствие портов (Port Matching)
Очевидно, обращаясь к модулю, необходимо, чтобы совпадала разрядность портов.
5.23.5. Присоединение портов (Connecting Ports)
Присоединение портов осуществляется либо по порядку (ordered list) или по имени порта (or by name). Например
module d_ff( q, d, reset, clock);
...
endmodule
module e_ff(q, d , enable, reset, clock);
output q;
input d, enable, reset, clock;
wire inD;
...
d_ff dff0(q, inD, reset, clock);
...
endmodule
5.24.Базовые блоки (Basic Blocks)
В Verilog приняты два типа назначений – непрерывное и процедурное. Непрерывное назначение может быть выполнено для цепей nets или для их объединений (concatenation of nets). Операнды могут иметь произвольный тип данных.
Процедурное назначение может быть выполнено для данных типов reg, integer, real или time.
5.24.1. Инициализация (Initial Block)
Ключевые слова: initial
Блок инициализации состоит из группы операторов, заключенных в операторные скобки begin... end и которые будут выполняться с момента старта моделирования. Ниже приведен пример инициализации моделирования
initial
clock = 1'b0;
initial
begin
alpha = 0;
#10 alpha = 1; // генерация сигнала
#20 alpha = 0;
#5 alpha = 1;
#7 alpha = 0;
#10 alpha = 1;
#20 alpha = 0;
end;
5.24.2. Конструкция always (Always Block)
Ключевые слова: always
Блок always означает, что действие выполняется непрерывно, пока процесс моделирования не будет остановлен директивойц $finish or $stop.
Note: the $finish command actually terminates the simulation where as $stop. merely pauses Ниже приведен пример формирования тактового импульса с использованием конструкции always . Заметим, что вообще говоря для этих целей удобнее использовать циклы
module pulse;
reg clock;
initial clock = 1'b0; // запуск такта
always #10 clock = ~clock; // такт
initial #5000 $finish // конец моделирования
endmodule