Мне нужно реализовать 32-битный сумматор вычитателя ALU для назначения класса. У меня есть 1-битный сумматор-вычитатель, который отлично работает, и операция выполняется с помощью оператора select (код для всех приведен ниже). В любом случае проблема, с которой я столкнулся, заключается в том, что я не могу понять, как использовать перенос / заимствование из одного модуля в следующий модуль.
module add_sub(select, i0, i1, cin, out, cout
);
input i0, i1, select, cin;
output out, cout;
wire y0, y1, y2, y3, y4, y5, y6;
wire z0, z1, z2, z3, z4;
//diff = i0 xor i1 xor cin
//borrow = cin. ~(i1 xor i2) or ~x.y
xor (y0, i1, cin);
xor (y1, i0, y0); //y1=diff or sum as only carry and borrow vary between adder and subtractor circuits
xor (y2, i1, i0);
and (y3, cin, ~y2);
and (y4, ~i0, i1);
or (y6, y5, y4); //y6 = borrow
and (z0, i0, i1);
xor (z1, i0, i1);
and (z2, cin, z1);
or (z3, z0, z2); //z3= carry out for sum
//conditional operator for assigning sum or difference. if select = 0, we add, else subtract
assign out = y1;
assign cout = select ? y6 : z3;
endmodule
Этот модуль создается в цикле в модуле alu, который приведен ниже ...
module alu(sel, num1, num2, alu_cin, alu_out, alu_c
);
parameter N = 32;
input sel; //select line for add or sub
input [N-1:0] num1; //two inputs
input [N-1:0] num2;
input alu_cin;
output [N-1:0] alu_out; //32 bit output
output alu_c; // becomes final carry or borrow accordingly
genvar i;
generate for (i=0; i<=N-1; i=i+1)
begin: alu_loop
if (i == 0)
add_sub as_i (sel, num1[i], num2[i], alu_cin, alu_out[i], alu_c);
else
add_sub as_i (sel, num1[i], num2[i], alu_loop[i-1].as_i.cout[i-1], alu_out[i], alu_c);
end
endgenerate
endmodule
В тестовом стенде для alu я дал соответствующие 32-битные значения и выбранное значение, которое мне нужно. Проблема связана с
add_sub as_i (sel, num1[i], num2[i], alu_loop[i-1].as_i.cout[i-1], alu_out[i], alu_c);
Он говорит: «Индексирование не может применяться к скаляру». поскольку я пытаюсь смоделировать это. Проверка синтаксиса выполнена на отлично.
Мне нужен доступ к cout из однобитового модуля, чтобы передать его как cin следующему. Alu_c можно перезаписать, так как нужен только последний бит.
Любая помощь будет оценена. Заранее спасибо. :) Все это делается на Xilinx ISE через модули Verilog.