Оператор if
Часть раздела Основы путешествия по Verilog на Coddy — урок 52 из 90.
Инструкция if — это блок принятия решений, который выполняет код только тогда, когда условие истинно. Инструкция if проверяет условие.
Если condition имеет значение true (1), код внутри executes. Если condition имеет значение false (0), код пропускается.
Синтаксис:
if (condition) begin
// Код выполняется, когда условие истинно
endПростой пример
if (reset) begin
count = 0;
endВ этом примере:
beginиendиспользуются для обозначения начала и конца блока кода
- Если
resetравен 1 (true), код внутриbeginиendвыполняется →countстановится равен 0 - Если
resetравен 0 (false), код внутри пропускается → ничего не происходит
begin и end работают как фигурные скобки { } в других языках программирования. Они объединяют инструкции в группу, чтобы Verilog знал, какой код относится к условию if. Даже если здесь только одна инструкция, использование begin и end всё равно является хорошей практикой для единообразия.
Оператор if в блоке always
always @(posedge clk) begin
if (reset)
count <= 0;
endПримечание: Для одной инструкции begin и end необязательны. Например, в блоке always выше begin/end не требуется после if, так как он содержит только одну инструкцию.
Условие может быть любым выражением
if (a > b) begin
max = a;
end
if (a && b) begin
out = 1;
end
if (data == 8'hFF) begin
match = 1;
endВажные правила
| Правило | Пояснение |
|---|---|
| Условие может быть любым выражением | Ненулевые (и известные) значения трактуются как истинные, ноль — как ложные |
begin / end необходимы для нескольких инструкций | Как { } в других языках |
Без begin/end выполняется только одна инструкция | Только следующая строка |
Задание
Что нужно сделать:
- Добавьте отсутствующий оператор
if, чтобы это заработало.
- Когда
enableравен1,outдолжен быть равенa & b - Когда
enableравен0,outдолжен оставаться0(не изменяться)
Начальный код инициализирует out = 0 и проверяет оба случая.
Попробуйте сами
module if_challenge;
reg a, b, enable;
reg out = 0;
initial begin
a = 1;
b = 1;
// Тестовый случай 1: enable = 1
enable = 1;
// TODO: Добавьте оператор if (out = a & b)
$display("enable=1: out = %d (should be 1)", out);
// Тестовый случай 2: enable = 0
enable = 0;
out = 0;
// TODO: out должен остаться 0
$display("enable=0: out = %d (should be 0)", out);
$finish;
end
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial