实验CPU算术逻辑单元姓名:闫盼蛟学号:2009432017一、实验目的(1)掌握运算器的工作原理。(2)验证运算器的功能。二、实验原理算术逻辑单元的主要功能是对二进制数据进行定点算术运算、逻辑运算和各种移位操作。算术运算包括定点加减乘除运算;逻辑运算主要有逻辑与、逻辑或、逻辑异或和逻辑非操作。ALU通常有两个数据输入端A和B,一个数据输出端Y以及标志位等。三、实验要求1、实验设计目标设计一个16位算术逻辑单元,满足以下要求。(1)16位算术逻辑单元能够进行下列运算:加法、减法、加1、减1、与、或、非和传送。用3位运算操作码OP[2..0]进行运算,控制方式如下表所示。运算操作码OP[2..0]运算对标志位Z和C的影响000ResultA+B影响标志位Z和C001ResultA+1影响标志位Z和C010ResultA-B影响标志位Z和C011ResultA-1影响标志位Z和C100ResultAandB影响标志位Z101ResultAorB影响标志位Z110ResultnotB影响标志位Z111ResultB不影响标志位Z和C(2)设立两个标志寄存器Z和C。当复位信号reset为低电平时,将这两个标志寄存器清零。当运算结束后,在时钟clk的上升沿改变标志寄存器Z和C的值。运算结果改变标志寄存器C、Z的情况如下:加法、减法、加1、减1运算改变Z、C;与、或、非运算改变Z,C保不变;传送操作保持Z、C不变。因此在运算结束Z、C需要两个D触发器保存。(3)为了保存操作数A和B,设计两个16位寄存器A和B。当寄存器选择信号sel=0时,如果允许写信号write=1.,则在诗中clk的上升沿将数据输入dinput送入A寄存器;当寄存器选择信号sel=1时,如果允许写信号write=1.,则在诗中clk的上升沿将数据输入dinput送入B寄存器。(4)算术逻辑单元用一个设计实体完成。2.顶层设计实体的引脚要求(1)clk对应试验台上的时钟(单脉冲)。(2)reset对应实验台上的CPU复位信号CPU-RST。(3)数据输入dinput对应试验台开关SD15~SD0。(4)允许写信号write对应试验台开关SA5.(5)OP[2..0]对应试验台开关SA2~SA0.(6)寄存器选择信号sel对应试验台开关SA4.(7)16为运算结果result对应实验台上的指示灯A15~A0.(8)Z、C标志位对应试验台上的Z、C指示灯。四、实验代码libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityALUisport(reset,clk:instd_logic;OP:instd_logic_vector(2downto0);sel:instd_logic;write:instd_logic;C,Z:outstd_logic;Dinput:instd_logic_vector(15downto0);result:outstd_logic_vector(15downto0));endALU;architecturebehavofaluiscomponentregisport(clr:instd_logic;D:instd_logic_vector(15downto0);clock:instd_logic;write:instd_logic;sel:instd_logic;Q:outstd_logic_vector(15downto0));endcomponent;signalz_tmp:std_logic;signalA,B:std_logic_vector(15downto0);signalresult_t:std_logic_vector(16downto0);beginA_reg:regportmap(clr=reset,D=Dinput,clock=clk,write=write,sel=(notsel),Q=A);B_reg:regportmap(clr=reset,D=Dinput,clock=clk,write=write,sel=sel,Q=B);alu_proc:process(OP,A,B)begincaseOPiswhen000=result_t=('0'&A)+('0'&B);when001=result_t=('0'&A)+'1';when010=result_t=('0'&A)-('0'&B);when011=result_t=('0'&A)-'1';when100=result_t=('0'&A)and('0'&B);when101=result_t=('0'&A)or('0'&B);when110=result_t=not('0'&B);when111=result_t=('0'&B);endcase;endprocess;result=result_t(15downto0);z_tmp=(notresult_t(15))and(notresult_t(14))and(notresult_t(13))and(notresult_t(12))and(notresult_t(11))and(notresult_t(10))and(notresult_t(9))and(notresult_t(8))and(notresult_t(7))and(notresult_t(6))and(notresult_t(5))and(notresult_t(4))and(notresult_t(3))and(notresult_t(2))and(notresult_t(1))and(notresult_t(0));c_proc:Process(reset,clk,result_t,OP)beginifreset='0'thenC='0';elsifclk'eventandclk='1'thenifOP(2)='0'thenC=result_t(16);endif;endif;endprocess;z_proc:process(reset,clk,z_tmp,OP)beginifreset='0'thenZ='0';elsifclk'eventandclk='1'thenifOP/=111thenZ=z_tmp;endif;endif;endprocess;endbehav;五、实验步骤(1)实验台设置成FPGA-CPU独立调试模式。REGSEL=0、CLKSEL=1、FDSEL=0。使用实验台上的单脉冲,即STEP_CLK短路子短接,短路子RUN_CLK断开。(2)将设计在QuartusⅡ下输入,编译后下载到TEC-CA上的FPGA中。(3)对第1组数据进行8种运算,A为0xAAAA,B为0x5555(4)对第2组数据进行8种运算,A为0xFFFF,B为0x0000(5)对第3组数据进行8种运算,A为0x0000,B为0xFFFF(6)对第4组数据进行8种运算,A为0x8950,B为0x9863(7)根据4组数据运算结果,连同标志位的状态填写下表:算术逻辑单元实验运算数据运算类型操作码OP运算结果rezult标志C标志Z运算前运算后运算前运算后第1组数据A=0xAAAAB=0x5555Result-A+B000oxFFFF0000Result-A+1001oxAAAB0000Result-A-B010ox55550000Result-A-1011oxAAA90000Result-AandB100ox00000001Result-AorB101oxFFFF0010Result-notB110oxAAAA0000Result-B111ox55550000第2组数据A=0xFFFFB=0x0000Result-A+B000oxFFFF0000Result-A+1001ox00000101Result-A-B010oxFFFF1010Result-A-1011oxFFFE0000Result-AandB100ox00000001Result-AorB101oxFFFF0010Result-notB110oxFFFF0000Result-B111ox00000000第3组数据A=0x0000B=0xFFFFResult-A+B000oxFFFF0000Result-A+1001ox00010000Result-A-B010ox00010100Result-A-1011oxFFFF1100Result-AandB100ox00001101Result-AorB101oxFFFF1110Result-notB110ox00001101Result-B111oxFFFF1111第4组数据A=0x8950B=0x9863Result-A+B000ox21B30100Result-A+1001ox89511000Result-A-B010oxF0ED0100Result-A-1011ox894F1000Result-AandB100ox88400000Result-AorB101ox99730000Result-notB110ox679C0000Result-B111ox98630000六、实验收获通过这次试验,掌握了运算器的工作原理,验证了运算器的功能。通过编写代码,增强了VHDL语言编程能力。