Оператор if
Часть раздела Основы путешествия по Verilog на Coddy — урок 52 из 90.
Оператор if — это блок принятия решений, который выполняет код только тогда, когда условие истинно. Оператор if проверяет условие.
Если условие true (1), код внутри выполняется. Если условие 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Важные правила
| Правило | Объяснение |
|---|---|
| Условие должно быть однобитным | Или выражение, которое вычисляется как 0 или 1 |
begin / end необходимы для нескольких операторов | Как { } в других языках |
Без begin/end следует только один оператор | Только следующая строка |
Задание
Что нужно сделать:
- Добавьте недостающий оператор
if, чтобы код заработал.
- Когда
enableравен1,outдолжен быть равенa & b - Когда
enableравен0,outдолжен оставаться равным0(не изменяться)
Начальный код инициализирует out = 0 и проверяет оба случая.
Шпаргалка
Оператор if выполняет код только тогда, когда условие истинно (1), и пропускает его, когда оно ложно (0).
if (condition) begin
// выполняется, когда условие истинно
endДля одиночного оператора ключевые слова begin/end необязательны:
always @(posedge clk) begin
if (reset)
count <= 0;
endУсловиями могут быть любые выражения, результатом которых является 0 или 1:
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
Попробуйте сами
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