输出波形显示 sum
、dif
、burrow
和 out
没有变化。即使增加延迟时间后,输出仍然没有变化。这应该像 mod 加法器一样工作,例如 add 10 和 2,并且 mod 3 给出输出零。
代码
module Mod_adder(a,b,p,out);
input [3:0] a;
input [3:0] b;
input [3:0] p;
output [3:0] out;
wire [3:0] sum;
wire cout;
wire burrow;
wire [3:0] dif;
ripple_carry_adder r1(a,b,sum,cout,1'b0);
ripple_carry_adder r2(sum,~p,dif,burrow,1'b1);
repeat_sum rs1(dif,burrow,sum);
outval o1(sum,burrow,out);
endmodule
module full_adder(in0, in1, cin, out, cout);
input in0, in1, cin;
output out, cout;
assign out = in0 ^ in1 ^ cin;
assign cout = ((in0 ^ in1) & cin) | (in0 & in1);
endmodule
module ripple_carry_adder(in0, in1, out, cout,cin);
input [3:0] in0;
input [3:0] in1;
output [3:0] out;
output cout;
input cin;
wire c1, c2, c3;
full_adder fa0(in0[0], in1[0], cin, out[0], c1);
full_adder fa1(in0[1], in1[1], c1, out[1], c2);
full_adder fa2(in0[2], in1[2], c2, out[2], c3);
full_adder fa3(in0[3], in1[3], c3, out[3], cout);
endmodule
module repeat_sum(dif,burrow,sum);
input [3:0] dif;
input burrow;
output [3:0] sum;
assign sum = (burrow == 1'b0) ? dif:sum;
endmodule
module outval(sum,burrow,out);
input [3:0] sum;
input burrow;
output [3:0] out;
assign out = (burrow == 1'b1) ? sum:out;
endmodule
测试台
` include "MOD_ADDER.V"
module Mod_adder_tb;
reg [3:0] a;
reg [3:0] b;
reg [3:0] p;
wire [3:0] out; // wires
// Instantiate the module to be tested
Mod_adder MA1(a,b,p,out);
initial begin // initial block
$dumpfile("Test_Full_Adder.vcd");
$dumpvars(1, MA1);
a=4'b1010;
b=4'b0100;
p=4'b0011;
#100;
end // end of initial block
endmodule
最佳答案
我发现两个主要问题。
由于驱动程序争用,您的 out
测试平台信号未知 (X
)。例如,Mod_adder
中的 sum
信号有多个驱动程序:来自 r1
实例和来自 rs1
实例。 r1
的 out
输出和 rs1
的 sum
输出均驱动 sum
电线。您不应从 2 个不同的模块实例驱动相同的信号。您可以将其中一个 sum
信号重命名为唯一的名称,例如 sum_rs1
并声明一条新的 wire
。
wire [3:0] sum, sum_rs1;
此外,您还有组合反馈循环。例如:
assign out = (burrow == 1'b1) ? sum:out;
out
信号不应同时位于连续分配的左侧和右侧。
关于verilog - 模加法器输出显示没有变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68161442/