这是一个设计组合电路的练习,可以显示二十转换器和二进制编码的十进制(BCD)加法。
设计一个BCD加法器即是将加法器和显示电路结合起来。显示电路比较简单,只需要输入一个bcd数,我们就可以在数码管上显示这个bcd数,用简单的case语句即可实现:
module decoder(
input [3:0]in2,
output reg[6:0]display
);
always@(*) begin
display = 7'b1111111;
case(in2)
0 : display = 7'b0000001;
1 : display = 7'b1001111;
2 : display = 7'b0010010;
3 : display = 7'b0000110;
4 : display = 7'b1001100;
5 : display = 7'b0100100;
6 : display = 7'b0100000;
7 : display = 7'b0001111;
8 : display = 7'b0000000;
9 : display = 7'b0000100;
endcase
end
endmodule
再然后是bcd加法器,因为是两位bcd加法器,所以要考虑进位cin和cout,我们可以实例化两个一位的bcd加法器,可以直接采用全加器的方式,将a+b+cin的值进行判断是否大于9,若大于9即进位,2个1位的bcd数相加应该放在2位也就是8bit寄存器里,同理,2个2位bcd数相加的结果应该放在3位也就是12bit寄存器里:
module BCDadder(
input [3:0]a,b,
input cin,
output reg[3:0]sum,
output reg cout
);
always@(*)
if( a+b+cin > 9 ) begin
cout <= 1;
sum <= a + b + cin - 10;
end
else begin
cout <= 0;
sum <= a + b + cin;
end
endmodule
最后我们只需要将bcd加法器和显示电路组合起来即可得到2位bcd加法器电路,首先我们将2个2位bcd数显示在4个数码管上,然后用两个加法器分别加个位和十位,将个位的进位cout连接到十位的cin上即可组合成为一个2位的bcd加法器电路,最后再将等于号=、十位上的加法器的进位ct1、十位上的和、个位的和,这4个显示到数码管上即可。
module lab2(
input [15:0]SW,//A1 A0 B1 B0
output [0:6]HEX7_D,HEX6_D,HEX5_D,HEX4_D,//A1 A0 B1 B0
HEX2_D,HEX1_D,HEX0_D,//=sum
output [0:6]HEX3_D
);
wire ct0,ct1;
wire [3:0]sum0,sum1;
decoder u1(SW[15:12],HEX7_D);//A1
decoder u2(SW[11: 8],HEX6_D);//A0
decoder u3(SW[ 7: 4],HEX5_D);//B1
decoder u4(SW[ 3: 0],HEX4_D);//B0
assign HEX3_D = 7'b1110110; //=
BCDadder u5(SW[11: 8],SW[ 3: 0],0,sum0,ct0);
BCDadder u6(SW[15:12],SW[ 7: 4],ct0,sum1,ct1);
decoder u7(ct1,HEX2_D);
decoder u8(sum1,HEX1_D);
decoder u9(sum0,HEX0_D);//sum
endmodule
下图是在板子上两个加法验证,在验证过程中发现问题:用开关控制大于9的数时,由于在代码中大于9的不显示,但是却没有将加法器也禁止相加,所以还是会计算相加,在显示和的数码管上也会显示出诸如F+F的值。
在DE2板子上做FPGA实验很有趣,但是由于时间关系,在仅有的几次上机时间里无法完成10个实验,等以后有机会再做完剩下的实验。
我们可以在官方的引脚分配csv文件中将实验所用到的引脚和对应位置直接复制出来,中间用逗号分隔,保存成txt文件,即可直接在Quartus II中导入这个txt文件来分配引脚。