1 设计分析
全加器是能进行加数、被加数和低位来的进位信号相加,并根据求和结果给出该位的进位信号的加法电路。其真值表如表1所示:
表1 全加器真值表 输入 a 0 0 1 1 0 0 1 1 b 0 1 0 1 0 1 0 1 cin 0 0 0 0 1 1 1 1 s 0 1 1 0 1 0 0 1 输出 cout 0 0 0 1 0 1 1 1
根据真值表可得出下列表达式:
sabcinabcinabcinabcinababcinababcinabcinabcinabcincoutabcinabcinabcinabcinabababcinababcin根据以上表达式,可以用数据流方式设计出1位全加器。要设计的是4位全加器,这里采用串行进位来设计。先设计4个1位的全加器,然后将低位的进位输出与高位的进位输入相连,将要进行加法运算的两个4位数的每一位分别作为每一个1位全加器的输入,进行加法运算,所有的1位全加器的输出组成一个4位数,即输入的两个4位数之和,最高位的全加器产生的进位输出即两个4位数求和的进位输出。
4位全加器的原理图如图1所示:
s(0) cin 0 a(0) cin cout b(0) a(1) s(1) cin cout b(1) a(2) s(2) cin cout b(2) a(3) s(3) cout b(3) 图1 4位全加器原理图
根据图1所示,可以采用结构化描述方式设计4位全加器。
2 程序设计
设计的程序如下: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY adder1 IS --1位全加器设计 PORT(a,b,cin:IN STD_LOGIC; s,cout:OUT STD_LOGIC); END adder1;
ARCHITECTURE dataflow OF adder1 IS --用数据流方式设计1位全加器 SIGNAL tmp:STD_LOGIC; --用tmp表示a⊕b BEGIN
tmp<=a XOR b AFTER 10 ns; s<=tmp XOR cin AFTER 10 ns;
cout<=(a AND b)OR(tmp AND cin) AFTER 20 ns; END dataflow;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY adder4 IS --4位全加器设计 PORT(a,b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); cin:IN STD_LOGIC;
s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); cout:OUT STD_LOGIC); END adder4;
ARCHITECTURE structural OF adder4 IS --用结构化描述风格设计4位全加器 COMPONENT adder1
PORT(a,b,cin:IN STD_LOGIC; s,cout:OUT STD_LOGIC);
END COMPONENT;
SIGNAL x,y,z:STD_LOGIC;
FOR u1,u2,u3,u4:adder1 USE ENTITY WORK.adder1(dataflow); BEGIN
u1:adder1 PORT MAP(a(0),b(0),cin,s(0),x); u2:adder1 PORT MAP(a(1),b(1),x,s(1),y); u3:adder1 PORT MAP(a(2),b(2),y,s(2),z); u4:adder1 PORT MAP(a(3),b(3),z,s(3),cout); END structural;
3 仿真结果
对上面的程序进行仿真,先对1位全加器仿真,结果如图2所示:
图2 1位全加器仿真图
由图2可以看出,1位全加器的仿真结果与表1相符,说明1位全加器设计成功。
再对4位全加器仿真,结果如图3所示:
图3 4位全加器仿真图
由图3可以看出,对设计的全加器进行了2组数据的仿真,由于4位全加器最低位的进位为0,因此将cin置0,仿真的结果与实际的运算结果是相同的。
4 结果分析
由仿真结果可知,设计的程序完成了全加器的功能,因此该程序正确。
因篇幅问题不能全部显示,请点此查看更多更全内容