Числа с заданным размером
Часть раздела Основы путешествия по Verilog на Coddy — урок 14 из 90.
В Verilog существует способ объявления числа с заданным размером. Оно называется числом с заданным размером (sized number). Это полезно, так как позволяет избежать путаницы в количестве бит и гарантирует, что аппаратная часть будет работать именно так, как ожидается.
Число с указанием размера следует этому формату: [bits]'[format][value]
<strong>bits</strong>— количество бит (например,8)<strong>'</strong>— апостроф, который отделяет размер от формата (обязательно)
<strong>format</strong>— основание системы счисления:bдля двоичной,dдля десятичной,hдля шестнадцатеричной илиoдля восьмеричной<strong>value</strong>— само число (например,1010)
Например:
4'b1010— 4 бита, двоичное 1010 (десятичное 10)8'd255— 8 бит, десятичное 255 (двоичное 11111111)16'hFF— 16 бит, шестнадцатеричное FF (двоичное 0000000011111111)3'b1— 3 бита, двоичное 001 (левые биты заполняются нулями)
Пример кода:
reg [7:0] data;
data = 8'b10101010; // 8 бит, двоичное 10101010
data = 8'd170; // 8 бит, десятичное 170
data = 8'hAA; // 8 бит, шестнадцатеричное AAВсе три примера присваивают одно и то же значение переменной data.
Почему важен размер
Без указания размера:
reg [7:0] data;
data = 1; // Что это значит? 1 бит? 8 бит?Verilog по умолчанию считает небольшие числа 32-битными, что может вызвать проблемы.
С размером:
reg [7:0] data;
data = 8'b00000001; // Явно: 8-битное значение 1Дополнение нулями
Когда вы присваиваете меньшее значение большему вектору, Verilog заполняет левые биты нулями:
reg [7:0] data;
data = 4'b1010; // Становится 8'b00001010Задание
Завершите код, записав числа правильного размера.
Что нужно сделать:
- Установите
aв значение 8-битного двоичного числа для десятичного 170 (двоичное 10101010) - Установите
bв значение 4-битного двоичного числа для десятичного 12 (двоичное 1100) - Установите
cв значение 16-битного шестнадцатеричного числа для десятичного 255 (шестнадцатеричное FF)
Шпаргалка
Число с указанием разрядности в Verilog имеет следующий формат: [bits]'[format][value]
bits— количество бит'— обязательный разделитель (апостроф)format—b(двоичный),d(десятичный),h(шестнадцатеричный),o(восьмеричный)value— само число
reg [7:0] data;
data = 8'b10101010; // 8 бит, двоичный формат
data = 8'd170; // 8 бит, десятичный формат
data = 8'hAA; // 8 бит, шестнадцатеричный формат (все три значения равны)Без указания разрядности Verilog по умолчанию использует 32 бита, что может привести к неожиданному поведению. Старшие (левые) биты дополняются нулями, если значение меньше объявленного размера:
reg [7:0] data;
data = 4'b1010; // Превращается в 8'b00001010Попробуйте сами
module sized_challenge;
reg [7:0] a;
reg [3:0] b;
reg [15:0] c;
initial begin
a = ______; // 8-битное двоичное число для 170 (10101010)
b = ______; // 4-битное двоичное число для 12 (1100)
c = ______; // 16-битное шестнадцатеричное число для 255 (FF)
$display("a = %b", a);
$display("b = %b", b);
$display("c = %h", c);
$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