`include "bcd.v"
module bcd_4(A,B,Cin,S,Cout);
input [15:0] A,B;
input Cin;
output [15:0] S;
output Cout;
wire w1,w2,w3;
bcd_adder U1(.A(A[3:0]),.B(B[3:0]),.Cin(Cin),.S(S[3:0]),.Cout(w1));
bcd_adder U2(.A(A[7:4]),.B(B[7:4]),.Cin(w1),.S(S[7:4]),.Cout(w2));
bcd_adder U3(.A(A[11:8]),.B(B[11:8]),.Cin(w2),.S(S[11:8]),.Cout(w3));
bcd_adder U4(.A(A[15:12]),.B(B[15:12]),.Cin(w3),.S(S[15:12]),.Cout(Cout));
endmodule
我使用四个4位BCD加法器设计了一个4位BCD加法器。输入'A'和'B'采用十六进制值。我可以编写一个测试平台,以便输入值只能是十进制的。我还要检查以下情况,即
if({Cout,S} == A + B + Cin)$ display(“pass”);
别的$ stop;
答案 0 :(得分:1)
加法器的输入不采用十六进制值。它们是16位输入,代表4个BCD数字,每个数字为4位。每个数字的输入范围为0到15(十进制),但由于它们是BCD,任何大于9的值都将无效。
可以在任何基数(二进制,八进制,十进制或十六进制)中指定输入。
以下都是等效的:
A <= 10;
A <= 4'd10;
A <= 4'hA;
A <= 4'b1010;
如果您只想在测试平台中生成有效BCD值输入,则应将整个4位数字生成为整数,然后将每个数字转换为适当的位以驱动您的设计。
例如,要驱动输入A
(0到9999)的每个有效值,您可以执行以下操作:
integer a;
for (a = 0; a < 10000; a = a + 1) begin
// a is an integer
// A is a 16-bit, 4-digit BCD value
A[3:0] = a % 10; // digit 0, ones place
A[7:4] = (a / 10) % 10; // digit 1, tens place
A[11:8] = (a / 100) % 10; // digit 2, hundreds place
A[15:12] = (a / 1000) % 10; // digit 3, thousands place
end
对于输出采样,您可以进行反向转换 - 将4个4位BCD数字转换为整数。
这是一个完整的,可运行的示例,其中包含用于抽样和验证输出的代码:http://www.edaplayground.com/x/2pT
答案 1 :(得分:0)
我明白了。我可以使用以下功能
来编写它`function integer hexatodecimal;
input [16:0] a;
integer b;
begin
b=a[3:0]+a[7:4]*10+a[11:8]*100+a[15:12]*1000+a[16]*10000;
hexatodecimal=b;
end
endfunction `
我可以调用此函数将{Cout,S}转换为十六进制。