Я пытаюсь сделать очень простой аппаратный модуль / тестовый стенд, чтобы получить представление о Verilog. Я пробовал реализовать полный сумматор.
Если я не ошибаюсь, у вас есть три входа, немедленное добавление a и b и перенос с места 2 ^ n-1.
Выходы суммируются и выполняются (которые могут служить переносом в другой модуль в базовом сумматоре или как бы то ни было, что называется упреждающим переносом).
Если я не ошибаюсь, выходная логика
сумма = (a & b) | (а & cin) | (b & cin) // или все три, на которые распространяется любой из этих
cout = a ^ b ^ cin
Вот полный модуль сумматора
module FullAdder(
a,
b,
cin,
sum,
co
);
input a;
input b;
input cin;
output sum;
output co;
//wire a;
//wire b;
//wire ci;
wire sum;
wire co;
//At least two
assign co = (a & b) | (a & cin) | (b & cin);
//one or three
assign sum = a ^ b ^ cin; //(a & ~b & ~cin) | (~a & b & ~cin) | (~a & ~b & cin) | (a & b & cin);
endmodule
А вот и тестовый стенд
module HalfAdderTB();
reg a_in;
reg b_in;
reg cin_in;
wire s_out;
wire cout_out;
FullAdder DUT(
a_in,
b_in,
cin_in,
s_out,
cout_out
);
initial begin
a_in = 1'b0;
b_in = 1'b0;
cin_in = 1'b0;
#20
a_in = 1'b0;
b_in = 1'b0;
cin_in = 1'b0;
$display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
$display("s: %b, cout: %b", s_out, cout_out);
#20
a_in = 1'b0;
b_in = 1'b0;
cin_in = 1'b1;
$display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
$display("s: %b, cout: %b", s_out, cout_out);
#20
a_in = 1'b0;
b_in = 1'b1;
cin_in = 1'b0;
$display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
$display("s: %b, cout: %b", s_out, cout_out);
#20
a_in = 1'b0;
b_in = 1'b1;
cin_in = 1'b1;
$display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
$display("s: %b, cout: %b", s_out, cout_out);
#20
a_in = 1'b1;
b_in = 1'b0;
cin_in = 1'b0;
$display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
$display("s: %b, cout: %b", s_out, cout_out);
#20
a_in = 1'b1;
b_in = 1'b0;
cin_in = 1'b1;
$display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
2,1 4%
a_in = 1'b1;
b_in = 1'b1;
cin_in = 1'b0;
$display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
$display("s: %b, cout: %b", s_out, cout_out);
#20
assign a_in = 1'b1;
assign b_in = 1'b1;
assign cin_in = 1'b1;
$display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
$display("s: %b, cout: %b", s_out, cout_out);
#20
$finish;
end
endmodule
Мой вывод выглядит так
a: 0, b: 0, cin: 0
s: 0, cout: 0
а: 0, б: 0, син: 1
s: 0, cout: 0
a: 0, b: 1, cin: 0
s: 1, cout: 0
а: 0, б: 1, син: 1
s: 1, cout: 0
a: 1, b: 0, cin: 0
s: 0, cout: 1
а: 1, б: 0, син: 1
s: 1, cout: 0
a: 1, b: 1, cin: 0
s: 0, cout: 1
а: 1, б: 1, син: 1
s: 0, cout: 1
Я считаю, что логические утверждения в моем коде соответствуют логическим уравнениям, которые я написал выше. Я уверен в своей логике. Я не могу понять, что не так с Verilog. Я что-то пропустил с таймингом и вводом тестового стенда в Full Adder?