四位二进制数的可控加法实验报告
四位二进制数的可控加法实验报告
一、实验目的。
1. 了解四位二进制数运算的基本原理, 制定设计方案。
2. 利用ISE 软件进行可编程逻辑器件设计, 完成逻辑仿真功能。
3. 使用编译器将设计实现, 下载到BASYS2实验板上进行调试和验证所设计的四位二进制数的运算。
二、实验器材。
1. Pentium —Ⅲ计算机 一台;
2. BASYS2 实验板一只;
三、实验方案。
1.基本功能。
实现了两个四位二进制数的加减法运算, 能够在输出端得出结果.
2.清零功能。
利用一个微动开关,在逻辑程序中表示出当按下微动开关后两个操作数都 变为零。再调用以前的加法程序,即可实现输出结果清零。
3.用数码管显示。
编写程序,将数值转换为七段显示器显示。将运算结果输送到数码管中。值得注意的是四个数码管要显示不同的数字,就需要利用到人的视觉误差,做一些短暂的延时。
4.溢出显示。
本实验中,设计的是一个无符号数加减法器,因而其共有两种溢出情况 一,减法时,减数大于被减数,针对这种情况可以利用比较大小进行溢出判断;
二,加法时,被操作数之和大于15。判断进位,如果进位为1则显示溢出, 若反之,则不显示。
四、实验原理图。
五、实验模块说明及部分代码。
1.add1部分。将输入的两个操作数相加并判断大小。相加结果放在led 中,进位放在carry 中。
led[0]=num1[0]^num2[0];
carry[0]=num1[0]&num2[0];
led[1]=num1[1]^num2[1]^carry[0];
carry[1]=(num1[1]&num2[1])|(carry[0]&(num1[1]^num2[1]));
led[2]=num1[2]^num2[2]^carry[1];
carry[2]=(num1[2]&num2[2])|(carry[1]&(num1[2]^num2[2]));
led[3]=num1[3]^num2[3]^carry[2];
if(add)
begin
carry[3]=(num1[3]&num2[3])|(carry[2]&(num1[3]^num2[3]));
end
if(sub)
begin
if(compare)
carry[3]=1;
else
carry[3]=(num1[3]&num2[3])|(carry[2]&(num1[3]^num2[3]))&(~sub);
2.seg7ment 。输入数值,用七段显示器进行显示。
case (num)
0:a_to_g=7'b0000001;
1:a_to_g=7'b1001111;
'hE:a_to_g=7'b0110000;
3.AA 部分(主模块)。实现其余功能,包括判断溢出,清零,输送显示等。 清零:
if (clr)
begin
num11=4'b0000;
num22=4'b0000;
溢出判断:
if(carry[3])
begin
an1=4'b0001;
num='hE;
六、实验中的问题及解决办法。
1. 利用微动开关输入时如果利用if(x)和if(~x)来判断,按下去能显示正确结果,抬起来就会出错。这是由于微动开关按下去是1,抬起来是0造成的。利用几个并列的if 语句对不同变量进行判断可以解决此问题,如:
if (sub)
begin
num11=sw1;
num22=~sw2+4'b0001;
end
if (add)
begin
num11=sw1;
num22=sw2;
end
if (clr)
begin
num11=4'b0000;
num22=4'b0000;
2. 数码管显示,理论上若四个都被触动则会显示相同的数值,所以可每次触动一个,循环显示,利用人的视觉误差产生四个显示不同数值的效果。
3. 一个变量在多个always 块中被赋值会出错。
解决办法:尽量将所有的判断条件都放在一个always 里面
七、实验心得体会。
1. 当完全不熟悉一种编程语言时,适当参考示例代码是非常必要的。在完成数码管显示过程中,我开始按照自己的思路编写代码,但不仅出错,而且代码冗长复杂。后来我参考了课上老师给的示例代码,最终理清了思路。
2. 在调试程序时,上板测验的过程中一点要耐心并细心,如果不知道到底哪里出错,可以先将一部分代码注释,一点一点排除错误。
3. 实验过程中可以先做基础,在一点点的添加拓展内容,但需要我们理清每个模块的作用和相互之间的联系。
4. 通过这次实验我还明白,一门编程语言的学习不能只看书本上的知识,而应该在学习的基础上多多应用,我之前从来没有接触过verilog ,但通过这几天的不断摸索,已经对verilog 有了相当一部分的了解,我想后续的学习过程,也应该多以实践为主。
5. 最后非常感谢实验前老师的耐心讲解。