Menu
Coddy logo textTech

Числа с заданным размером

Часть раздела Основы путешествия по 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
challenge icon

Задание

Завершите код, записав числа правильного размера.

Что нужно сделать:

  1. Установите a в значение 8-битного двоичного числа для десятичного 170 (двоичное 10101010)
  2. Установите b в значение 4-битного двоичного числа для десятичного 12 (двоичное 1100)
  3. Установите c в значение 16-битного шестнадцатеричного числа для десятичного 255 (шестнадцатеричное FF)

Шпаргалка

Число с указанием разрядности в Verilog имеет следующий формат: [bits]'[format][value]

  • bits — количество бит
  • ' — обязательный разделитель (апостроф)
  • formatb (двоичный), 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы