4-битный сумматор-вычитатель в verilog
Я пишу код verilog для 4-битного вычитателя сумматора. Я использую структурный дизайн. Сначала я написал код verilog для 1-битного полного сумматора. Затем я использую это, чтобы написать код для 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
3 ответа
Вы на самом деле довольно близко. Кажется, вы не понимаете, что в Verilog ваш дизайн синтезируется во время компиляции, а не во время выполнения. Вы не можете создавать экземпляры модулей условно, потому что во время компиляции мы не знаем, будет ли выполнено это условие или нет. Таким образом, ваше первое утверждение в случае низкого бита вычитания не имеет смысла. Также не имеет смысла помещать его в блок всегда, так как rtl уже определен в модулях.
Однако ваше второе утверждение содержит большую часть решения проблемы. Когда бит знака низкий, эти xors в верхней части сумматора / вычитателя сохранят входящие биты, и конструкция упростится до простого сумматора. Попробуйте использовать только второй блок.
Ошибка связана с тем, что вы используете t3 для хранения результатов операции xor, а также операции полного сумматора. Я изменил имена связанных переменных, чтобы они не конфликтовали, и создал тестовый стенд. Теперь все работает нормально. При вычитании он возвращает отрицательные числа как дополнение до 2 соответствующего положительного значения.
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 t0,t1,t2,t3,t4,t5,t6;
xor x3(t0,B[0],In);
xor x4(t1,B[1],In);
xor x5(t2,B[2],In);
xor x6(t3,B[3],In);
fadder f5(A[0],t0,In,Res[0],t4);
fadder f6(A[1],t1,t4,Res[1],t5);
fadder f7(A[2],t2,t5,Res[2],t6);
fadder f8(A[3],t3,t6,Res[3],Out);
endmodule
module add_sub_4_tb;
reg [3:0] A,B;
reg In;
wire [3:0] Res;
wire Out;
add_sub_4 tb(A,B,In,Res,Out);
initial
begin
In=0; A=4'b1010; B=4'b0101;
#10 In=1;
#10 In=0; A=4'b0101; B=4'b1010;
#10 In=1;
#10 In=0; A=4'b1111; B=4'b1111;
end
endmodule
Используйте комплимент B, используя XOR
gate (когда в =1) перед вводом в значения в экземплярах модулей.
когда in=0
тот же B будет добавлен к A и когда in=1
, ~B будет добавлено к A.