32-битный сумматор вычитателя ALU с использованием генерации

Мне нужно реализовать 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.


person plaknas    schedule 14.04.2013    source источник


Ответы (1)


Это синтаксически правильно, но вы используете битовый выбор для одного битового значения, что является семантической ошибкой.

add_sub as_i (
  sel,num1[i],num2[i],alu_loop[i-1].as_i.cout[i-1],alu_out[i],alu_c);
                                         ^^^^

Объявлен как скалярный вывод в add_sub

output out, cout;

Хотя Verilog позволяет ссылаться на порт, используя точечную нотацию (иерархические ссылки), это не очень хорошая практика за пределами тестовых стендов. Вместо этого вы должны объявить провод для этого подключения.

for (i=0; i<=N-1; i=i+1) 
  begin: alu_loop
    wire cout; // Visible as alu_loop[N].cout 
  end
person Community    schedule 14.04.2013