Как писать код Verilog для модифицированного энкодера будки?
MODULE MODIFIT_BOOTH_ENCODER (
Ввод [3:0] Multiplickand, // 4-битный множитель
Ввод [3:0] множитель, // 4-битный множитель
Вывод [7:0] Продукт // 8-битный продукт
);
// внутренние регистры для частичных продуктов
reg [7:0] partial_product [0:3];
// Инициализация частичных продуктов до 0
начальное начало
partial_product [0] <=0;
partial_product [1] <=0;
partial_product [2] <=0;
partial_product [3] <=0;
конец
// логика кодирования стенда
Всегда @(*) начинать
// переворачивается через каждый бит множителя
для (целое число i =0; i <4; i =i + 1) начать
// Проверка на шаблоны кодирования стенда
case ({multiplier [i], multiplier [i-1]})
2'b00:начинать
partial_product [i] <=partial_product [i];
конец
2'b01:начинать
partial_product [i] <=partial_product [i] + multipluckand;
конец
2'b10:начинать
partial_product [i] <=partial_product [i] - multipliclAnd;
конец
2'b11:начинать
partial_product [i] <=partial_product [i];
конец
по умолчанию:начинать
partial_product [i] <=partial_product [i];
конец
Конец
конец
конец
// Рассчитайте конечный продукт
Назначить продукт =partial_product [0] + (partial_product [1] <<1) + (partial_product [2] <<2) + (partial_product [3] <<3);
EndModule
`` `
Объяснение:
1. Входы и выходы:
- `multiplickand`:4-битный вход, представляющий множитель.
- `Multiplier ':4-битный вход, представляющий множитель.
- `Product`:8-битный выход, представляющий продукт множителя и множителя.
2. Внутренние регистры:
- `partial_product`:массив из 4 регистров, каждый из которых хранит частичный продукт. Эти регистры будут обновлены на основе кодирования стенда.
3. Инициализация:
- Начальный блок устанавливает все частичные регистры продукта на 0 в начале.
4. логика кодирования стенда:
- Блок `always @(*)` реализует алгоритм кодирования стенда.
- Он итерации через каждый бит множителя (от MSB до LSB).
- Для каждого бита он проверяет текущий бит и предыдущий бит, чтобы определить шаблон кодирования стенда.
- На основании шаблона, он выполняет соответствующую работу на частичном продукте:
- 00: Нет операции (частичный продукт остается неизменным).
- 01: Добавьте множитель в частичный продукт.
- 10: Вычтите множитель из частичного продукта.
- 11: Нет операции (частичный продукт остается неизменным).
5. Окончательный расчет продукта:
- Оператор `назначить` вычисляет конечный продукт, добавляя смещенные частичные продукты.
- Каждый частичный продукт смещается влево на соответствующее битовое положение.
Как работает код:
Модифицированный алгоритм кодирования стенда заменяет процесс умножения серией добавок и вычитаний на основе шаблонов в множителе. Просматривая пары последовательных битов в множителе, мы можем эффективно выполнить умножение.
Пример:
Предположим, что `multipliclAnd =5` (Binary:` 0101`) и `Multiplier =3` (Binary:` 0011`).
1. Итерация 1: `Многочисленчик [3:2] =00` - без работы.
2. Итерация 2: `Multiplier [2:1] =01` - Добавить` ulliplickand` в `partial_product [1]`.
3. Итерация 3: `Multiplier [1:0] =11` - без работы.
После петли у нас будет:
- `partial_product [0] =0`
- `partial_product [1] =5`
- `partial_product [2] =0`
- `partial_product [3] =0`
Наконец, `product =0 + (5 <<1) + (0 <<2) + (0 <<3) =10` (двоичный:` 1010`), который является правильным продуктом 5 и 3.