
- •Глава 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.31.3. Цикл Repeat (Repeat Loop)
Синтаксис:
looping_statement::== repeat (conditional) statement
Цикл repeat выполняется конечное число раз, условие (conditional) можеит быть константой, переменной или сигналом, но обязательно быть целым числом. Ниже приведен пример цикла repeat
module comply;
int count;
initial begin
count = 128;
repeat (count) begin
$display("%d seconds to comply", count);
count = count - 1;
end
end
endmodule
Note: The loop will execute 128 times regardless of whether the value of count changes after entry to the loop
5.31.4. Вечный цикл (Forever Loop)
Синтаксис:
forever statement
Цикл forever выполняется непрерывно, пока моделирование не будет остановлено командой $finish. Ниже приведен пример вечного цикла
reg clock;
initial begin
clock = 1'b0;
forever #5 clock = ~clock;
end
initial #2000 $finish;
5.32.Файлы в Verilog
5.32.1. Открытие файла (Opening a file)
Ключевые слова: $open
Синтаксис:
<file_handle> = $fopen("<file_name");
В процессе моделирования в языке Verilog имеется возможность записывать результаты прогона в файл, что в дальнейшем позволяет провести его более подробный анализ
Ниже приведен пример открытия файлов на запись.
integer handleA, handleB;
// an integer has 32 bits so is perfect
// for this usage
initial begin
handleA = $fopen("myfile.out);
// handleA = 0000_0000_0000_0000_0000_0000_0000_0010
handleB = $fopen("anotherfile.out");
// handleB = 0000_0000_0000_0000_0000_0000_0000_0100
end
Когда файл открыт, его можно использовать для записи. Всего допустимо открыть не более 31 файла одновременно.
5.32.2. Запись в файл (Writing to a file)
Ключевые слова: $fdisplay, $fmonitor, $fwrite Синтаксис:
$fdisplay(<file_handles>, --same as display--); $fmonitor(<file_handles>, --same as monitor--); $fwrite(<file_handles>, --same as write--);
Для записиможет быть открыто несколько файлов, ниже приведен пример записи числа 0000_0000_0000_0000_0000_0000_0000_0011 в файлы.
integer channelsA;
initial begin
channelsA = handleA | 1;
$fdisplay(channelsA, "Hello");
end
5.32.3. Закрытие файла (Closing a file)
Ключевое слово: $fclose
Синтаксис:
$fclose(handle);
Когда используется несколько файлов, то обычно файлы, которые уже не требуются закрывают для облегчения жизни несчастной операционной системе. Для этого и служит директива $fclose, после закрытия работа с данным файлом естественно невозможна.
5.32.4. Инициализация регистровых файлов (памяти) (Initialising Memories )
Ключевые слова: $readmemb, $readmemh
Синтаксис:
$readmemb("<file_name>", <memory_name>");
$readmemb("<file_name>", <memory_name>, memory_start");
$readmemb("<file_name>", <memory_name>, memory_start, memory_finish");
Для инициализации регистровых файлов используется следующая конструкция. Содержимое регистрового файла храниться в файле с форматом, приведенном ниже, все адреса 16-ричные
@003
00000011
00000100
00000101
00000110
00000111
00001000
00001001
Для улучшения читаемости возможна и такая запись
@003
00000011
00000100
00000101
@006
00000110
00000111
@008
00001000
00001001
Пример инициализации памяти приведен ниже
module testmemory;
reg [7:0] memory [9:0];
integer index;
initial begin
$readmemb("mem.dat", memory);
for(index = 0; index < 10; index = index + 1)
$display("memory[%d] = %b", index[4:0], memory[index]);
end
endmodule // testmemory
Содержимое файла файла mem.data имеет вид
1000_0001
1000_0010
0000_0000
0000_0001
0000_0010
0000_0011
0000_0100
0000_0101
0000_0110
0000_0000