2014-06-26 126 views
0
`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 adder.The输入“A”和“B”设计了一个4位数BCD加法器正在服用十六进制values.how我可以写一个测试平台,以便输入值应仅为小数。如果({Cout,S} == A + B + Cin)$ display(“pass”);我不得不检查以下条件,
else $ stop;如何转换4位十六进制数的Verilog测试平台以BCD

回答

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

+0

不要忘了八进制的'o':) – toolic

+0

@Dwikle我在unix中没有使用vi编辑器。我用for循环来生成输入值。默认情况下,输入值将是十六进制,所以我必须将它们转换为十进制,得到的十进制结果将被转换为十六进制来检查上面提到的条件。 – user3331420

+0

其16位bcd加法器不是4位 – user3331420

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}转换为十六进制写。