Verilog 中的简单加法
Simple Addition in Verilog
我对 Verilog 比较陌生,所以希望我能正确地表达我的想法。我正在尝试实现一个基本的十六进制计算器。到目前为止,我可以使用两个 7 段显示器来显示要添加的整数(A 和 B)。我还可以表示从十六进制#00 到十六进制#10
的数字
以下是我迄今为止整理的重要代码片段。
我的 FourBitAdder 的一部分:
// Four Bit Adder
module FourBitAdder (A, B, Aout1, Aout0, Bout1, Bout0, Cout3, Cout2, Cout1,
Cout0, Sum, PrintSum, Carry);
output Carry;
output [4:0] Sum;
output [4:0] PrintSum;
input [3:0] A; // SW15-SW8
input [3:0] B; // SW7-SW0
assign PrintSum = A+B;
我使用 "Printsum" 因为它不会让我声明 "Sum" 两次...
我对应的全加器:
// Full Adder
module FullAdder (A, B, C, Sum, Carry);
output Sum;
output Carry;
input A;
input B;
input C;
assign Sum = A^B^C;
assign Carry = (A&B) | (B&C) | (C&A);
endmodule
最后,我的 7 段显示器总和案例陈述。我以为我可以使用 PrintSum,范围从 5'b00000 到 5'b11110(1E,最大和)。
// Hex 1 (MSB)
always@*
case(PrintSum)
5'b0???? : Cout1 = 7'b1000000; //0
5'b1???? : Cout1 = 7'b1111001; //1 if S[4] = 1
default
Cout1 = 7'b1000000; //0 by default
endcase
// Hex 0 (LSB)
always@*
case(PrintSum)
5'b?0000 : Cout0 = 7'b1000000; //0
...
5'b?1111 : Cout0 = 7'b0001110; //F
default
Cout0 = 7'b1000000; //0 by default
endcase
endmodule
提前谢谢大家:)
Perhaps I can take the logic values of A[3-0] and B[3-0] and somehow
convert that to hex.
逻辑值是十六进制的。您所要做的就是将向量分成 4 位部分,从 LS 开始到 MS。 (最后可能还剩下不到 4 位。)
至于你的代码:你正在使用一种高级语言而不是门。因此,要将两个数字相加,您只需使用加法运算符:“+”。无需实例化一系列全加器:
Sum = A + B;
但是你有一个问题,你添加两个 4 位数字可以得到 5 位结果。所以 Sum 应该是 5 位宽。这也意味着你的两个十六进制显示的 MS 将只显示 0 或 1(结果在 0x00 和 0x1E 之间或凡人:0 到 30)
use case statements similar to the ones I used to show inputs A and B
我无法检查你的案例陈述,因为我不知道哪个位控制显示的哪个部分。但是原理是对的
另外:您必须决定要显示 A、B 或 Sum 的内容。下一个不错的挑战可能是显示一个序列:A,然后是 B,然后是 Sum。
我对 Verilog 比较陌生,所以希望我能正确地表达我的想法。我正在尝试实现一个基本的十六进制计算器。到目前为止,我可以使用两个 7 段显示器来显示要添加的整数(A 和 B)。我还可以表示从十六进制#00 到十六进制#10
的数字以下是我迄今为止整理的重要代码片段。
我的 FourBitAdder 的一部分:
// Four Bit Adder
module FourBitAdder (A, B, Aout1, Aout0, Bout1, Bout0, Cout3, Cout2, Cout1,
Cout0, Sum, PrintSum, Carry);
output Carry;
output [4:0] Sum;
output [4:0] PrintSum;
input [3:0] A; // SW15-SW8
input [3:0] B; // SW7-SW0
assign PrintSum = A+B;
我使用 "Printsum" 因为它不会让我声明 "Sum" 两次...
我对应的全加器:
// Full Adder
module FullAdder (A, B, C, Sum, Carry);
output Sum;
output Carry;
input A;
input B;
input C;
assign Sum = A^B^C;
assign Carry = (A&B) | (B&C) | (C&A);
endmodule
最后,我的 7 段显示器总和案例陈述。我以为我可以使用 PrintSum,范围从 5'b00000 到 5'b11110(1E,最大和)。
// Hex 1 (MSB)
always@*
case(PrintSum)
5'b0???? : Cout1 = 7'b1000000; //0
5'b1???? : Cout1 = 7'b1111001; //1 if S[4] = 1
default
Cout1 = 7'b1000000; //0 by default
endcase
// Hex 0 (LSB)
always@*
case(PrintSum)
5'b?0000 : Cout0 = 7'b1000000; //0
...
5'b?1111 : Cout0 = 7'b0001110; //F
default
Cout0 = 7'b1000000; //0 by default
endcase
endmodule
提前谢谢大家:)
Perhaps I can take the logic values of A[3-0] and B[3-0] and somehow convert that to hex.
逻辑值是十六进制的。您所要做的就是将向量分成 4 位部分,从 LS 开始到 MS。 (最后可能还剩下不到 4 位。)
至于你的代码:你正在使用一种高级语言而不是门。因此,要将两个数字相加,您只需使用加法运算符:“+”。无需实例化一系列全加器:
Sum = A + B;
但是你有一个问题,你添加两个 4 位数字可以得到 5 位结果。所以 Sum 应该是 5 位宽。这也意味着你的两个十六进制显示的 MS 将只显示 0 或 1(结果在 0x00 和 0x1E 之间或凡人:0 到 30)
use case statements similar to the ones I used to show inputs A and B
我无法检查你的案例陈述,因为我不知道哪个位控制显示的哪个部分。但是原理是对的
另外:您必须决定要显示 A、B 或 Sum 的内容。下一个不错的挑战可能是显示一个序列:A,然后是 B,然后是 Sum。