四位全加器的VHDL/VerilogHDL实现
加法器的分类 (一)半加器 能对两个1位二进制数进行相加而求得和及进位的逻辑电路称为半加器。或:只考虑两个一位二进制数的相加,而不考虑来自低位进位数的运算电路,称为半加器。图1为半加器的方框图。图2为半加器原理图。其中:A、B分别为被加数与加数,作为电路的输入端;S为两数相加产生的本位和,它和两数相加产生的向高位的进位C一起作为电路的输出。 根据二进制数相加的原则,得到半加器的真值表如表1所列。 信号输入 A 0 0 1 1 B 0 1 0 1 信号输出 S 0 1 1 0 C 0 0 0 1 表1 半加器的真值表 由真值表可分别写出和数S,进位数C的逻辑函数表达式为: (1) C=AB (2) 由此可见,式(1)是一个异或逻辑关系,可用一个异或门来实现;式(2)可用一个与门实现。仿真结果如图3所示: 图3 半加器仿真图 (二)全加器 除本位两个数相加外,还要加上从低位来的进位数,称为全加器。图4为全加器的方框图。图5全加器原理图。被加数Ai、加数Bi从低位向本位进位Ci-1作为电路的输入,全加和Si与向高位的进位Ci作为电路的输出。能实现全加运算功能的电路称为全加电路。全加器的逻辑功能真值表如表2中所列。 信号输入端 Ai 0 0 0 0 1 1 1 1 Bi 0 0 1 1 0 0 1 1 Ci 0 1 0 1 0 1 0 1 信号输出端 Si 0 1 1 0 1 0 0 1 Ci 0 0 0 1 0 1 1 1 表2 全加器逻辑功能真值表 多位全加器连接可以是逐位进位,也可以是超前进位。逐位进位也称串行进位,其逻辑电路简单,但速度也较低。 五、加法器的VHDL实现 (一) 半加器
VHDL语言描述语句为:
1
so<=a xor b; co<=a and b
程序设计: library ieee;
use ieee.std_logic_1164.all; entity h_adder is
port (a,b:in std_logic;
so,co:out std_logic); ――定义输入、输出端口 end h_adder;
architecture bh of h_adder is begin
so<=a xor b; ――“异或”运算 co<=a and b; ――“与”运算 end bh;
(二) 全加器
1位全加器可由两个半加器组成,在半加器的基础上,采用元件调用和例化语句,将件连接起来,而实现全加器的VHDL编程和整体功能。全加器包含了两个半加器和一个或门。在此基础上可设计出四位全加器。
六、四位全加器
四位全加器VHDL程序代码如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity add is
port(cin:in std_logic;
a,b:in std_logic_vector(3 downto 0); s:out std_logic_vector(3 downto 0); cout:out std_logic); end add4;
architecture beh of add4 is
signal sint:std_logic_vector(4 downto 0); signal aa,bb:std_logic_vector(4 downto 0); begin
aa<='0' & a(3 downto 0); --4位加数矢量扩为5位,提供进位空间 bb<='0' & b(3 downto 0); sint<=aa+bb+cin;
s(3 downto 0)<=sint(3 downto 0); cout<=sint(4); end beh;
四位全加器VerilogHDL程序代码如下:
module add(A,B,CI,CO,S); parameter N=4;
2
input [N:1] A,B; input CI; output CO;
output [N:1] S;
assign {CO,S}=A+B+CI; endmodule
四位全加器常用三种编程方法:
/*module add(s,co,a,b,ci);//行为描述法 output[3:0] s; output co;
input[3:0] a,b; input ci; reg co;
reg[3:0] s; always@(*) begin
{co,s}=a+b+ci; end
endmodule*/
module add(s,co,a,b,ci);//结构描述法 output[3:0] s; output co;
input[3:0] a,b; input ci;
full_add1 f0(a[0],b[0],ci,s[0],ci1); full_add1 f1(a[1],b[1],ci1,s[1],ci2); full_add1 f2(a[2],b[2],ci2,s[2],ci3); full_add1 f3(a[3],b[3],ci3,s[3],co); endmodule
module full_add1(a,b,cin,sum,cout); input a,b,cin; output sum,cout; wire s1,m1,m2,m3; and(m1,a,b), (m2,b,cin), (m3,a,cin); xor(s1,a,b), (sum,s1,cin);
or(cout,m1,m2,m3); endmodule
/*module add(co,s,a,b,ci);//数据流法
3
output[3:0] s; output co;
input[3:0] a,b; input ci;
assign {co,s}=a+b+ci; endmodule*/
library IEEE;
use IEEE.Std_logic_1164.ALL; entity pro1 is
port(A1,B1,G1BAR,A0,B0,G0BAR:in std_logic; Y20,Y21,Y22,Y23,Y10,Y11,Y12,Y13:out std_logic); end pro1;
architecture pro1_arch of pro1 is begin
Y10<='0' when(B0='0') and ((A0='0') and (G0BAR='0')) else '1';
Y11<='0' when(B0='0') and ((A0='1') and (G0BAR='0')) else '1';
Y12<='0' when(B0='1') and ((A0='0') and (G0BAR='0')) else '1';
Y13<='0' when(B0='1') and ((A0='1') and (G0BAR='0')) else '1';
Y20<='0' when(B1='0') and ((A1='0') and (G1BAR='0')) else '1';
Y21<='0' when(B1='0') and ((A1='1') and (G1BAR='0')) else '1';
Y22<='0' when(B1='1') and ((A1='0') and (G1BAR='0')) else '1';
Y23<='0' when(B1='1') and ((A1='1') and (G1BAR='0')) else '1';
end pro1_arch;
4
一、1位全加器
ENTITY full_add IS PORT( a,b,cin : IN BIT; cout,sum: OUT BIT ); END full_add;
ARCHITECTURE adder OF full_add IS --逻辑表达式实现 BEGIN
cout <= ( (a xor b) and cin ) or ( a and b ); sum <= ( a xor b ) xor cin; END adder;
ARCHITECTURE adder2 OF full_add IS --真值表实现 SIGNAL abcin :BIT_VECTOR( 0 to 2 ); SIGNAL yout : BIT_VECTOR( 0 to 1 ); BEGIN
abcin <= a & b & cin;
WITH abcin SELECT
yout <= \ \ \ \ \ \ \ \ cout <= yout( 0 ); sum <= yout( 1 ); END adder2;
二、4位加法器
之前已生成了full_add.vhd
ENTITY add4par IS PORT( c0: IN BIT;
a,b: IN BIT_VECTOR( 4 downto 1 ); c4: OUT BIT;
sum: OUT BIT_VECTOR( 4 downto 1 ) ); END add4par;
ARCHITECTURE adder of add4par IS COMPONENT full_add
5
PORT( a,b,cin: IN BIT; cout,sum: OUT BIT); END COMPONENT;
SIGNAL c: BIT_VECTOR( 3 downto 1 ); BEGIN
adder1:full_add PORT MAP( a => a(1),b=>b(1),cin=>c0,cout=>c(1),sum=>sum(1) ); --上面的书写方式中,参数顺序可任意调整。
adder2: full_add PORTMAP( a(2),b(2),c(1),c(2),sum(2) ); adder3: full_add PORTMAP( a(3),b(3),c(2),c(3),sum(3) ); adder4: full_add PORTMAP( a(4),b(4),c(3),c(4),sum(4) ); END adder;
--利用生成语句,可进一下简化语句的书写 ENTITY add4gen IS PORT( c0: IN BIT;
a,b: IN BIT_VECTOR( 4 downto 1 ); -- 4改为8 c4: OUT BIT;
sum: OUT BIT_VECTOR( 4 downto 1 ) ); -- 4改为8 END add4gen;
ARCHITECTURE adder OF add4gen IS COMPONENT full_add
PORT( a,b,cin:IN BIT; cout,sum: OUT BIT ); END COMPONENT;
SIGNAL c: BIT_VECTOR( 4 downto 0 ); -- 4改为8 BEGIN
c(0) <=c0;
adders:
FOR i IN 1 to 4 GENERATE --FOR i IN 1 to 8 GENERATE adder: full_add PORTMAP(a(i),b(i),c(i-1),c(i),sum(i) ); END GENERATE;
c4 <= c(4); --c8<=c(8) END adder;
若要扩展为8位加法器,则很容易修改,将上面的4改为8即可
6