四位全加器的VHDL与VerilogHDL实现

更新时间:2024-01-18 04:25:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

四位全加器的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

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

本文来源:https://www.bwwdw.com/article/fhto.html

Top