Отрицательные числа
Часть раздела Основы путешествия по Verilog на Coddy — урок 16 из 90.
В Verilog отрицательные числа представляются с использованием формата дополнительного кода (two's complement). Дополнительный код — это способ представления как положительных, так и отрицательных чисел в двоичном виде. Старший значащий бит (MSB) указывает на знак:
- 0 = положительное число
- 1 = отрицательное число
Как вычислить дополнение до двух (Two's Complement)
Чтобы найти дополнительный код (two's complement) числа:
- Запишите положительное число в двоичной системе
- Инвертируйте все биты (0 становится 1, 1 становится 0)
- Прибавьте 1
Пример: Представление -5 в 4 bit
| Шаг | Операция | Результат |
|---|---|---|
| 1 | Positive 5 в двоичном коде | 0101 |
| 2 | Инвертировать все bit | 1010 |
| 3 | Прибавить 1 | 1011 |
-5 в 4-bit двух (two's) complement — это <strong>4'b1011</strong>
Запись отрицательных чисел в Verilog
Вы можете записывать отрицательные числа напрямую, используя десятичный формат:
reg signed [3:0] a;
a = -5; // Verilog автоматически использует дополнительный кодДля двоичных чисел с указанием размерности необходимо записывать значение в дополнительном коде:
a = 4'b1011; // This is -5 in 4-bit two's complementSigned vs Unsigned
По умолчанию Verilog обрабатывает числа как unsigned. Чтобы работать с отрицательными числами, объявляйте сигналы как signed:
reg signed [3:0] negative; // Может хранить от -8 до 7
reg [3:0] positive; // Может хранить от 0 до 15Диапазон чисел со знаком
Для N бит число со знаком может представлять:
- Минимум: -2^(N-1)
- Максимум: 2^(N-1) - 1
| Биты | Диапазон |
|---|---|
| 4 бита | от -8 до 7 |
| 8 бит | от -128 до 127 |
| 16 бит | от -32768 до 32767 |
Важные примечания
- Используйте ключевое слово
signedдля включения обработки отрицательных чисел - Без
signedVerilog рассматривает все значения как положительные
- Арифметика в дополнительном коде работает
automaticallyпри использованииsigned - Старший бит (MSB) определяет знак: 1 =
negative, 0 =positive
Задание
Дополните код, записав правильные значения в дополнительном коде (two's complement).
Что нужно сделать:
- Присвойте
aзначение -3, используя 4-битный двоичный дополнительный код - Присвойте
bзначение -8, используя 4-битный двоичный дополнительный код - Присвойте
cзначение -1, используя 4-битный двоичный дополнительный код
Попробуйте сами
module negative_challenge;
reg signed [3:0] a, b, c;
initial begin
a = 4'b______; // -3 in 4-bit two's complement
b = 4'b______; // -8 in 4-bit two's complement
c = 4'b______; // -1 in 4-bit two's complement
$display("a = %d", a);
$display("b = %d", b);
$display("c = %d", 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