verilog 中的 4 位加减法器
4 bit adder-subtractor in verilog
我正在为 4 位加法减法器编写 verilog 代码。我正在使用结构设计。起初我为 1 位全加器编写了 verilog 代码。然后我用它来编写 4 位加法器减法器的代码。
module fadder (A, B, Cin, Sum, Cout);
input A, B;
input Cin;
output Sum;
output Cout;
wire t1,t2,t3,t4;
xor x1(t1,A,B);
xor x2(Sum,t1,Cin);
and g1(t2,A,B);
and g2(t3,B,Cin);
and g3(t4,Cin,A);
or g4(Cout,t2,t3,t4);
endmodule
module add_sub_4 (A, B, In, Res, Out);
input [3:0] A, B;
input In;
output [3:0] Res;
output Out;
wire t1,t2,t3,t4,t5,t6,t7;
xor x3(t3,B[0],In);
xor x4(t4,B[1],In);
xor x5(t5,B[2],In);
xor x6(t6,B[3],In);
fadder f5(A[0],t3,In,Res[0],t1);
fadder f6(A[1],t4,t1,Res[1],t2);
fadder f7(A[2],t5,t2,Res[2],t3);
fadder f8(A[3],t6,t3,Res[3],Out);
endmodule
你其实很接近。您似乎不明白的是,在 Verilog 中,您的设计是在编译时合成的,而不是在 运行 时。您不能有条件地实例化模块,因为在编译时我们不知道是否会满足该条件。所以你在减法位低的情况下的第一个陈述并没有真正意义。将它放在 always 块中也没有意义,因为 rtl 已经在模块中定义了。
但是,您的第二个陈述包含了问题的大部分解决方案。当符号位为低时,adder/subtractor 顶部的那些异或将保留传入的位,并且设计将简化为仅一个加法器。尝试只使用第二个块。
在将值放入实例化模块之前,使用 XOR
门(当 in=1 时)对 B 进行补充。
当 in=0
时,相同的 B 将添加到 A,当 in=1
时,~B 将添加到 A。
我正在为 4 位加法减法器编写 verilog 代码。我正在使用结构设计。起初我为 1 位全加器编写了 verilog 代码。然后我用它来编写 4 位加法器减法器的代码。
module fadder (A, B, Cin, Sum, Cout);
input A, B;
input Cin;
output Sum;
output Cout;
wire t1,t2,t3,t4;
xor x1(t1,A,B);
xor x2(Sum,t1,Cin);
and g1(t2,A,B);
and g2(t3,B,Cin);
and g3(t4,Cin,A);
or g4(Cout,t2,t3,t4);
endmodule
module add_sub_4 (A, B, In, Res, Out);
input [3:0] A, B;
input In;
output [3:0] Res;
output Out;
wire t1,t2,t3,t4,t5,t6,t7;
xor x3(t3,B[0],In);
xor x4(t4,B[1],In);
xor x5(t5,B[2],In);
xor x6(t6,B[3],In);
fadder f5(A[0],t3,In,Res[0],t1);
fadder f6(A[1],t4,t1,Res[1],t2);
fadder f7(A[2],t5,t2,Res[2],t3);
fadder f8(A[3],t6,t3,Res[3],Out);
endmodule
你其实很接近。您似乎不明白的是,在 Verilog 中,您的设计是在编译时合成的,而不是在 运行 时。您不能有条件地实例化模块,因为在编译时我们不知道是否会满足该条件。所以你在减法位低的情况下的第一个陈述并没有真正意义。将它放在 always 块中也没有意义,因为 rtl 已经在模块中定义了。
但是,您的第二个陈述包含了问题的大部分解决方案。当符号位为低时,adder/subtractor 顶部的那些异或将保留传入的位,并且设计将简化为仅一个加法器。尝试只使用第二个块。
在将值放入实例化模块之前,使用 XOR
门(当 in=1 时)对 B 进行补充。
当 in=0
时,相同的 B 将添加到 A,当 in=1
时,~B 将添加到 A。