Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog 使用generate的32位加法器-减法器ALU_Verilog_Xilinx - Fatal编程技术网

Verilog 使用generate的32位加法器-减法器ALU

Verilog 使用generate的32位加法器-减法器ALU,verilog,xilinx,Verilog,Xilinx,我需要为类赋值实现一个32位加法器-减法器ALU。我有一个1位加法器-减法器,它工作得很好,操作是在select语句的帮助下完成的(下面给出了all的代码)。无论如何,我面临的问题是,我无法弄清楚如何将一个模块的进位/借位用于后续模块 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;

我需要为类赋值实现一个32位加法器-减法器ALU。我有一个1位加法器-减法器,它工作得很好,操作是在select语句的帮助下完成的(下面给出了all的代码)。无论如何,我面临的问题是,我无法弄清楚如何将一个模块的进位/借位用于后续模块

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
它说“索引不能应用于标量”,因为我试图模拟它。语法检查完美完成

我需要从一位模块访问cout,将其作为cin传递到下一个模块。alu_c可以被覆盖,因为只需要最后一位


任何帮助都将不胜感激。提前感谢。:)所有这些都是通过Verilog模块在Xilinx ISE上完成的

它在语法上是正确的,但在单个位值上使用位选择,这是一个语义错误

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
(i=0;i)的

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