算术逻辑运算单元
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运算器部件实验:加法器
一、实验目的
1、掌握运算器的工作原理。
2、验证运算器的功能。
二、实验原理
算术逻辑单元的主要功能是对二进制数据进行定点算术运算、逻辑运算和各种移位操作。算术运算包括定点加减乘除运算;逻辑运算主要有逻辑与、逻辑或、逻辑异或和逻辑非操作。ALU通常有两个数据输入端A和B,一个数据输出端Y以及标志位等。
74181是一种典型的4位ALU器件。下图是74181的逻辑电路图。
20世纪80年代计算机中的算术逻辑单元有许多是用现成的算术逻辑器件连接起来构成的,如上面提到的74181和Am2901等就是著名的算术逻辑器件。使用这些4位的算术逻辑器件,能够构成8位、16位等长度的算术逻辑单元。现在由于超大规模器件的广泛应用,使用这种方法构成算术逻辑单元已经不多见,代之以直接用硬件描述语言设计算术逻辑单元。
三、实验内容
设计一个16位算术逻辑单元,满足以下要求。
(1)16位算术逻辑单元能够进行下列运算:加法、减法、加1、减1、与、或、非和传送。用3位运算操作码OP[2…0]进行运算,控制方式如下表所示。
(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)算术逻辑单元用一个设计实体完成。
四、实验数据
五、心得体会
本次实验中,实现了算术逻辑运算单元,其主要功能是对二进制数据进行定点算术运算、逻辑运算和各种移位操作。通过本次实验,对算术逻辑运算单元的计算原理及过程有了进一步的理解,通过实验解决了课上发现而且没有解决的问题。
六、源代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity alu is
port
(
clk,reset,wt,sel:in std_l ogic;
dinput:in std_logic_vector(15 d ownto 0);
OP:in std_l ogic_vector(2 d ownto 0);
result:out std_l ogic_vector(15 d ownto 0);
Z,C:out std_logic
);
end entity;
architecture rtl of alu is
component regis is
port
(
clr,clk,wt,sel:in std_l ogic;
D :in std_l ogic_vector(15 d ownto 0);
Q :out std_logic_vector(15 d ownto 0)
);
end component regis;
signal A:std_logic_vector(15 d ownto 0);
signal B:std_logic_vector(15 d ownto 0);
signal res:std_l ogic_vector(16 d ownto 0);
begin
result<=res(15 d ownto 0);
process(clk)is
begin
if(clk'event and clk='1')then
if(wt='1' and sel='0')then
A<=dinput;
elsif(wt='1' and sel='1')then
B<=dinput;
end if;
end if;
end process;
process(A,B,OP)is
begin
case OP is
when "000"=>res<=('0'&A)+('0'&B);
when "001"=>res<=('0'&A)+'1';
when "010"=>res<=('0'&A)+('0'&(not B))+'1';
when "011"=>res<=('0'&A)-'1';
when "100"=>res<='0'&(A and B);
when "101"=>res<='0'&(A or B);
when "110"=>res<='0'&(not B);
when "111"=>res<='0'&B;
end case;
end process;
process(reset,clk,res)is
begin
if(reset='0')then
C<='0';
elsif(clk'event and clk='1')then
if(res(16)='1')then
C<='1';
else
C<='0';
end if;
end if;