Уровень 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).

Ключевая идея: в железе оба результата вычисляются параллельно, а массив мультиплексоров выбирает, какой из них подать на выход.

Решение

АЛУ — классический пример аппаратного параллелизма: оба результата (сложение и побитовое И) считаются одновременно, а мультиплексоры выбирают нужный.

Порядок портов Adder8: (sum, c_out, a, b, c_in). c_in не подключаем — по умолчанию 0, что корректно для сложения.

Порядок портов Mux: (out, a, b, sel).

  1. Объявите две 8-битные шины для промежуточных результатов: wire [7:0] out_add, out_and;
  2. Инстанцируйте 8-битный сумматор — тракт сложения: Adder8 adder(out_add, carry_out, a, b);
  3. Вычислите побитовое И — 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]);
  4. Выберите результат через 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.