Уровень 36: АЛУ (Verilog)
Задание
Соберите 8-битное арифметико-логическое устройство (АЛУ). При op_code = 0 модуль выполняет сложение, при op_code = 1 — побитовое И.
Модуль ALU8 принимает две 8-битные шины a[7:0] и b[7:0], однобитный op_code и выдаёт out[7:0] и carry_out.
Используйте готовые модули Adder8 (уровень 35) и Mux (уровень 32).
Ключевая идея: в железе оба результата вычисляются параллельно, а массив мультиплексоров выбирает, какой из них подать на выход.
Материалы по теме
- АЛУ — сердце математики
- Мультиплексор — переключатель сигналов
- ALU8 — 8-битное АЛУ
Решение
АЛУ — классический пример аппаратного параллелизма: оба результата (сложение и побитовое И) считаются одновременно, а мультиплексоры выбирают нужный.
Порядок портов Adder8: (sum, c_out, a, b, c_in). c_in не подключаем — по умолчанию 0, что корректно для сложения.
Порядок портов Mux: (out, a, b, sel).
- Объявите две 8-битные шины для промежуточных результатов:
wire [7:0] out_add, out_and; - Инстанцируйте 8-битный сумматор — тракт сложения:
Adder8 adder(out_add, carry_out, a, b); - Вычислите побитовое И — 8 вентилей
and, по одному на каждый бит:and aa0(out_and[0], a[0], b[0]);and aa1(out_and[1], a[1], b[1]);… и так далее доand aa7(out_and[7], a[7], b[7]); - Выберите результат через 8 мультиплексоров — все управляются общим
op_code:Mux m0(out[0], out_add[0], out_and[0], op_code);Mux m1(out[1], out_add[1], out_and[1], op_code);… доMux m7(out[7], out_add[7], out_and[7], op_code);
carry_out пробрасывается напрямую от Adder8 — он корректен при любом значении op_code.