班级:计算机科学与技术3班学号:20090810310姓名:康小雪日期:2011-9-24实验2运算器实验预习实验报告疑问:1、如何将结果显示在数码管上?2、实验中输入端口比所给实验箱上的输入按钮多,如何解决这个问题?3、让7449在显示十六进制数的时候,会显示乱码,如何解决这个问题?实验报告一、波形图:参数设置:Endtime:2.0usGridsize:100.0ns信号设置:Clk:时钟信号,设置周期为100ns占空比为50%。K:由k[7]~k[0]八个信号组成,数据输入信号,十六进制。sw|r4|r5|ALU_bus:由sw_bus(输入数据到总线)、r4_bus(将R4寄存器的值反馈到总线上)、r5_bus(将R5寄存器的值反馈到总线上)、ALU_bus(将运算结果的值反馈到总线上)四个信号组成,输入信号,二进制,低电平有效。ld_r1|r2|r4|r5:由ld_r1(将运算结果存入R1寄存器)、ld_r2(将运算结果存入R2寄存器)、ld_r4(将运算结果存入R4寄存器)、ld_r5(将运算结果存入R5寄存器)四个信号组成,输入信号,二进制,高电平有效。m|cn:由m(运算种类的选择信号)、cn(表明有无进位的信号)两个信号组成(其中m=0表示算术运算,m=1表示逻辑运算,cn=0表示有进位,cn=1表示无进位),输入信号,二进制。s:算数逻辑单元控制选择信号,由s[3]~s[0]四个信号组成,输入信号,二进制。d:数据输出的中间信号,由d[7]~d[0]八个信号组成,双向信号,显示总线上的数据,十六进制。d~result:最终的数据输出信号,由d[7]result~d[0]result八个信号组成,输出信号,八进制。1)初始状态:K无输入,bus信号无效,lddr信号无效,总线上位高阻态。2)05H总线(sw_bus=0)DR1(ld_r1=1):K输入05,sw_bus=0,ld_r1=1,可以看到d~result=05;06H总线(sw_bus=0)DR2(ld_r2=1):K输入D2,sw_bus=0,ld_r2=1,可以看到d~result=0A。3)AorB的运算结果(m|cn=01、s=0001)总线(ALU_bus=0)R4(ld_r4=1):alu_bus=0,ld_r4=1,m|cn=01,s=0001,可以看到d~result=0F。4)not(AandB)的运算结果(m|cn=10、s=0100)总线(ALU_bus=0)R5(ld_r5):alu_bus=0,ld_r5=1,m|cn=10,s=0100,可以看到d~result=0A。5)R4总线(r4_bus=0)r1(ld_r1=1):r4_bus=0,ld_r1=1,m|cn=00,s=0000,可以看到d~result=0F。6)DR1加B的运算结果(m|cn=01、s=1001)总线(ALU_bus=0)R4(ld_r4):alu_bus=0,ld_r4=1,m|cn=01,s=1001,可以看到d~result=19。7)R4总线(sw_bus=0)DR1(ld_r1=1):r4_bus=0,ld_r1=1,m|cn=00,s=0000,可以看到d~result=19;8)R5总线(sw_bus=0)DR2(ld_r2=1):r5_bus=0,ld_r5=1,m|cn=00,s=0000,可以看到d~result=0A。9)DR1减DR2的运算结果(m|cn=00、s=0110)总线(ALU_bus=0)R4(ld_r4=1):alu_bus=0,ld_r4=1,m|cn=00,s=0110,可以看到d~result=0F。记录实验复合运算:(AorB)减not(AandB)加B运算m,cn,s[3..0]DR1DR2ALU结果R4R5AorB01000105H0AH0FH0FH00Hnot(AandB)10010005H0AH0FH0FH0AHR4加B0110010FH0AH19H19H0AHR4减R500011019H0AH0FH19H0AH调换运算了加B与减R5的运算顺序,可以免去DR2中的数据被覆盖后重新输入B的麻烦。结论:通过将数据05H、0AH输入到两个寄存器中,经过实验设计的运算器,进行(AorB)减not(AandB)加B的复合运算,最终得出0FH的正确结果。说明本实验的设计能实现运算器的运算功能,电路设计正确。二、实验日志思考题:1、存入DR1、DR2的数据如何在总线上显示?答:将m、cn、s分别置0、1、0000,并将alu_bus置0,可完成将DR1中数据在总线上显示。将m、cn、s分别置1、0、1010,并将alu_bus置0,可完成将DR2中数据在总线上显示。2、复合运算时,ALU出的中间结果为什么不能直接存入DR1或DR2?答:因为DR1、DR2作为算术逻辑运算单元的入口,式中利用其他值的运算必须存于DR1或DR2中才能完成运算。如果直接将中间结果存于DR1或DR2,则它有可能在接下来的它参与的运算中数值被覆盖掉。这样中间值没有被保存,得不出最后的正确结果。3、计算机中的负数如何表示?答:通过设置符号位,0表示正数,1表示负数。4、74181的功能表中运算“+”于“加”的区别是什么?答:运算“+”表示逻辑运算中的“与”;运算“加”表示算术运算中的“+”。5、exp_r_alu.vhd中并置运算符“&”主要作用是什么?答:主要作用是连接,由m、cn、s通过“&”组成六位的二进制数,作为运算的选择控制信号,来进行算术逻辑运算的选择。6、exp_r_alu.vhd代码中为什么要调用ieee.std_logic_unsigned库?答:因为ieee.std_logic_unsigned库中定义了基于std_logic以及std_logic_vector的无符号的算术运算,这样才能保证运算器功能的正常实现,得出正确的结果。7、VHDL语言中如何表示十六进制格式数据?答:通过在数据的前面加上x,然后再在“”里写入数据。遇到的问题及解决方案:1.如何将结果显示在数码管上?加入以下附加电路模块:2.实验中输入端口比所给实验箱上的输入按钮多,如何解决这个问题?将数据输入部分用2个16进制的计算器组合而成,对于它的算术逻辑运算单元功能控制选择信号s[3]~s[0]用一个16进制计数器来表示。3.让7449在显示十六进制数的时候,会显示乱码,如何解决这个问题?自己重新写一个译码器,其具体的代码如下:libraryieee;useieee.std_logic_1164.all;entitybus_reg7isport(sin:instd_logic_vector(3downto0);sout:outstd_logic_vector(6downto0));endbus_reg7;architecturertlofbus_reg7issignalxsin:std_logic_vector(3downto0);signalxsout:std_logic_vector(6downto0);beginxsin=sin;process(xsin,xsout)begincasesiniswhen0000=xsout=1111110;--0when0001=xsout=0110000;--1when0010=xsout=1101101;--2when0011=xsout=1111001;--3when0100=xsout=0110011;--4when0101=xsout=1011011;--5when0110=xsout=1011111;--6when0111=xsout=1110000;--7when1000=xsout=1111111;--8when1001=xsout=1111011;--9when1010=xsout=1110111;--Awhen1011=xsout=0011111;--bwhen1100=xsout=1001110;--Cwhen1101=xsout=0111101;--dwhen1110=xsout=1001111;--Ewhen1111=xsout=1000111;--Fendcase;sout=xsout;endprocess;endrtl;4.下载到数码管之后,只有K输入的低位能够正确显示16进制计数器的结果,剩下的s和K的高位都不能正确显示。设计电路时,数码管显示电路的内部实际上我将所有的输出都使用了,也就是可以点亮八个数码管,下载的时候,我只用到了5个,但是,我把方向搞反了,以至于下载到了错误的数码管上,还以为自己的电路设计有问题-_-!!。实验心得:由于这阵子比较忙,实验也落下了好大一部分,前两次实验总体来说难度不是很大,但是在实验过程中依旧会出现很多错误,一些是由于对软件的不熟悉加上一个假期没有做EDA的生疏造成的,还有一些则是在实验过程中慢慢总结出来的错误,关于ALU部分,我觉得比较难的还是操作部分,稍微一个不小心,所有的运算就得重来一遍,所以,在今后的实验中不仅要加强开发能力,对已开发出来的程序的使用也是一个重点,特别是要结合实际环境对输入输出的更改,使自己设计的电路使用起来更加方便。