verilog - 如何在verilog testbench中将4位十六进制数转换为bcd

标签 verilog

`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");  
else $stop;  

最佳答案

加法器的输入不采用十六进制值。它们是 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

关于verilog - 如何在verilog testbench中将4位十六进制数转换为bcd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24429569/

相关文章:

verilog - 运行执行后出错

syntax-error - 为什么在Verilog代码中总是总是出现语法错误?

counter - 滴答计数器 Verilog

verilog - 在两个 1 之间填充 0's with 1' s(可合成)

verilog - 2 个连续的非阻塞赋值

verilog - verilog中仿真时间的计算

verilog - 如何使用 Verilog 宏模拟 $display?

random - LSFR 随机数计数器

Verilog 移位扩展结果?

verilog - '1在verilog中是什么意思?