位二进制全加器VHDL的设计
- 格式:ppt
- 大小:295.00 KB
- 文档页数:55
1位二进制加法器设计一、实验目的1.熟悉Quartus II 集成环境的图形输入方法;2.学会把设计项目成为可调用元件符号和调用元件的方法;3.掌握仿真方法。
二、实验内容本实验首先使用图形输入的方法由逻辑门电路设计一个半加器,然后使用。
分别进行仿真、引脚分配并下载到电路板进行功能验证。
三、实验步骤1.创建个人实验文件夹(最好使用英文字母命名不要用中文名称)。
2.运行Quartus II 软件,选择File -> New,在Device Design Files 中选择Block Diagram/Schematic File,如图1-1所示,点击OK打开原理图编辑窗口。
图1-1 图1-23.在图形编辑窗中双击鼠标左键,将弹出元件输入对话框,在对话框右栏打开元件库找到需要的元件,如图1-2所示,点击OK即可将元件调入原理图编辑窗。
将所有需要的元件都调入编辑窗。
4.将各个元件采用单击鼠标并拖动的方法连接号电路图,然后分别在input和output的pin_name上双击使变为黑色,再分别输入各引脚名,如图1-3所示。
图1-35.选择File—>Save As命令,选择为此工程已建好目录,将设计好的原理图文件取名为h_adder.bdf同时使下方小框内出现“√”,点击保存会弹出“是否创建新工程”提示信息如图1-4所示。
图1-4图1-56.创建一个新工程:点击图1-4中“是”可进入创建工程向导(也可以File -> New project Wizard进入向导),此时看到的默认工程名、顶层实体名都为h_adder,此时将工程名换为f_adder顶层实体名不变,如图1-5所示。
点击NEXT,再在弹出窗中点击NEXT,选择目标器件:MAXII 系列EPMT1005C芯片。
按照下列的方法完成半加器的编译、仿真。
7.7. 创建一个仿真波形文件:File -> New,在Other Files 中选择Vector Waveform File,如图1-6,进入波形编辑窗口。
RTL基本知识:全加器设计(VHDL)
【设计要求】
使⽤层次化设计⽅法,⽤VHDL语⾔设计四位⼆进制全加器,并进⾏仿真。
【设计⽬的】
考查对于VHDL元件例化语法的熟悉程度;
考查对于数字电路中全加器⼯作原理的理解;
【设计思路】
⽤门实现两个⼆进制数相加并求出和的组合线路,称为⼀位全加器。
⼀位全加器可以处理低位进位,并输出本位加法进位。
多个⼀位全加器进⾏级联可以得到多位全加器。
第⼀步:⼀位全加器;
第⼆步:多位全加器,在其中例化⼀位全加器实现;
1 ⼀位全加器
a和b为两位⼆进制数据,cin为前级进位位,cout为当前计算后的进位位,sum为加法结果,电路结构和真值表如下:
2 四位全加器
四位全加器是在⼀位全加器的基础上利⽤进位进⾏串⾏级联实现,实现后的电路结构⽰意图如下:
【源代码】
1 ⼀位全加器源代码
2 四位全加器源代码
【实验结果】
【思考】
在仿真时,输⼊可能会存在⽑刺,采⽤什么⽅法可以消除⽑刺?
在设计多位全加器时,如果位数很多,⽤元件例化的⽅式程序会很长,可以采⽤什么⽅法可以改进实现?。
VHDL加法器和减法器的原理加法器3.2.1 加法器的原理在将两个多位二进制数相加时,除了最低位以外,每一位都应该考虑来自低位的进位,即将两个对应位的加数和来自低位的进位3个数相加。
这种运算称为全加,所用的电路称为全加器。
多位加法器的构成有两种方式:并行进位和串行进位。
并行进位加法器设有进位产生逻辑,预算速度较快;串行进位方式是将全加器级联构成多位加法器。
并行进位加法器通常比串行级联加法器占用更多的资源。
随着为数的增加,相同位数的并行加法器与串行加法器的资源占用差距也越来越大,因此,在工程中使用加法器时,要在速度和容量之间寻找平衡点。
本次设计采用的是并行加法器方式。
3.2.2 加法器要求实现的功能实现两个二进制数字的相加运算。
当到达时钟上升沿时,将两数输入,运算,输出结果。
3.2.3 加法器的VHDL语言实现(以下以12位数加16位数生成16位数的加法器为例)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_arith.ALL;ENTITY add121616 isPORT(clk : in STD_LOGIC;Din1 :in signed (11 downto 0);Din2 :in signed (15 downto 0);Dout:out signed (15 downto 0));END add121616;ARCHITECTURE a of add121616 isSIGNAL s1: signed(15 downto 0);BEGINs1<=(Din1(11)&Din1(11)&Din1(11)&Din1(11)&Din1);PROCESS(Din1,Din2,clk)BEGINif clk'event and clk='1' thenDout<=s1+Din2;end if;end process;end a;3.2.4 加法器的模块图3.2.5 加法器的波形仿真完全符合设计要求。
1用VHDL设计的一位二进制全加器的示例程序library ieee;use ieee.std_logic_1164.all;entity adder is port(a, b,ci : in bit;sum : out bit);end adder;architecture a of adder isbeginsum<=a xor b xor ci;co<=((a or b) and ci) or ( a and b);end a;2用vhdl语言实现一个脉冲信号的十分频ibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity div isgeneric (duty : integer := 5);port (clk : in std_logic;Q : out std_logic);end div ;architecture divlo of div isconstart period : integer := 10;signal count : integer range 0 to period-1;beginprocess (clk)beginif rising_edge ( clk ) thenif count < duty thenQ <= …0‟ ;count <= count+1;else if count < period-1 thenQ <= …1‟ ;count <= count+1 ;else count <= …0‟ ;end if ;end if ;end process ;end divlo ;3用vhdl 语言if 语句来实现2选1数据选择器ibrary ieee;use ieee.std_logic_1164.all;entity choose isport (d0;d1,sel : in std_logic;y : out std_logic );end choose ;architecture arc of choose isbegin process(d0,d1,sel)beginif (sel <= …1‟) theny <= d1;else y <= d0 ;end if ;end process ;end arc;4用VHDL实现3-8译码器ibrary ieee;use ieee.std_logic_1164.all;entity encoder isport ( a : in std_logic_vector ( 2 downto 0 );b : out std_logic_vector ( 7 downto 0));end encoder ;architecture behav of encoder issignal indata : std_logic_vector ( 2 downto 0 ); beginprocess (a)beginindata <= a(2)&a(1)&a(0);case indata iswhen “000”=>b<=”00000001”;when “001”=>b<=”00000010”;when “010”=>b<=”00000100”;when “011”=>b<=”00001000”;when “100”=>b<=”00010000”;when “101”=>b<=”00100000”;when “110”=>b<=”01000000”;when “111”=>b<=”10000000”;when others =>b<=”XXXXXXXX”;end case ;end process ;end behav ;。
VHDL 加法器设计设计要求:采用QuartusII 集成开发环境利用VHDL 硬件描述语言设计传播进位加法器,直接进位加法器,线形进位加法器,平方根进位加法器,并比较这四种加法器的性能。
为了便于比较性能,将四种加法器都设定为28位。
一、全加器设计全加器是上述四种加法器的基础部件,首先应当设计一位全加器。
设计原理:i i i iS ABC ABC ABC ABC A B C=+++=⊕⊕0i i C AB BC AC =++VHDL 程序:仿真结果:--一位全加器设计library ieee;use ieee.std_logic_1164.all; entity fulladd isport ( A: in std_logic;B: in std_logic; cin:in std_logic; sumbit:out std_logic; cout:out std_logic );end fulladd;architecture behav of fulladd is beginsumbit<=(A xor B) xor cin;cout<=(a and b) or (cin and a) or (cin and b); end behav;二、传播进位加法器设计实际上加法器就是是全加器的级联,其中的每个FA网络为一个全加器(采用上文所述的全加器)VHDL代码:--传播进位加法器library ieee;use ieee.std_logic_1164.all;use work.all;entity carry_propogate_adder isport (A: in std_logic_vector(27 downto 0);B: in std_logic_vector(27 downto 0);cin:in std_logic;sum:out std_logic_vector(27 downto 0);cout:out std_logic);end carry_propogate_adder;architecture behav of carry_propogate_adder issignal ct:std_logic_vector(28 downto 0);component fulladd isport (A: in std_logic;B: in std_logic;cin:in std_logic;sumbit:out std_logic;cout:out std_logic);end component;beginct(0)<=cin;cout<=ct(28);G1: for i in 0 to 27 generatel1:fulladd port map (A(i),B(i),ct(i),sum(i),ct(i+1));end generate G1;end behav;功能仿真:延时测定:由图中的两个时间bar 的差值可看出,sum 值和cout 值几乎同时计算出,其Tdelay=28.332ns (cin 无关)三、直接进位加法器设计 设计原理:首先将AB 输入转换为PG 输入,若每级的P 输入都是‘1’则直接将Ci 传给Co ,否则像传播进位加法器一样计算其AB-PG 转换网络原理:Fa 全加器原理:P A B G AB=⊕=o i iC G PC S P C =+=⊕VHDL 代码:-- FA 子单元 library ieee;use ieee.std_logic_1164.all;entity Fa isport (Pi,Gi,Ci:in std_logic; Coi,Si:out std_logic); end Fa;architecture Fabehav of Fa is beginCoi<=Gi or (Pi and Ci);Si<=Pi xor Ci; end Fabehav; --ABtoPG 转换网络 library ieee;use ieee.std_logic_1164.all;entity PGNet isport(Ai,Bi:in std_logic; Pi,Gi:out std_logic); end PGNet;architecture PGbehav of PGNet is beginPi<=Ai xor Bi;Gi<=Ai and Bi; end PGbehav; --传播进位加法器 library ieee;use ieee.std_logic_1164.all; entity bypass_adder is port(A,B:in std_logic_vector(27 downto 0); Ci:in std_logic; Sum:out std_logic_vector(27 downto 0); Co:out std_logic );end bypass_adder;architecture adderbehav of bypass_adder is component Fa is port (Pi,Gi,Ci:in std_logic; Coi,Si:out std_logic ); end component; component PGNet is port(Ai,Bi:in std_logic; Pi,Gi:out std_logic ); end component;signal P,G:std_logic_vector(27 downto 0); signal C:std_logic_vector(28 downto 0); signal BP:std_logic; begin C(0)<=Ci; G1: for i in 0 to 27 generate l1: PGNet port map(A(i),B(i),P(i),G(i)); end generate G1; G2: for i in 0 to 27 generate l2:Fa port map (P(i),G(i),C(i),C(i+1),Sum(i)); end generate G2; BP<='1' when P="11111111111111111111111111111111" else '0'; Co<=Ci when BP='1' else C(8); end adderbehav;功能仿真:延时仿真:当通过直接进位网络(图中testp值全部为1时),进位信号有一定提前,但由于计算所有的P值本身也需要一定时间,所以改善并不明显。
1用VHDL设计的一位二进制全加器的示例程序VHDL(Very High-Speed Integrated Circuit Hardware Description Language)是一种硬件编程语言,它使用结构化的方法来描述数字系统中的电路。
在设计一位二进制全加器之前,我们需要了解一下什么是二进制全加器。
二进制全加器是一种逻辑电路,用于将两个二进制位以及一个进位输入相加,并生成一个和输出以及一个进位输出。
以下是一个使用VHDL编写的一位二进制全加器的示例程序:```vhdl-- Entity声明entity full_adder isportA, B, Cin : in std_logic; -- 输入端口,分别对应两个二进制位和进位Sum, Cout : out std_logic -- 输出端口,分别对应和和进位end full_adder;-- Architecture实现architecture behavior of full_adder isbeginprocess(A, B, Cin)variable temp_sum : std_logic;begintemp_sum := (A xor B) xor Cin; -- 计算和值Sum <= temp_sum; -- 输出和值Cout <= (A and B) or (Cin and (A xor B)); -- 计算进位end process;end behavior;```该程序定义了一个名为`full_adder`的实体,它有3个输入端口(A,B和Cin)和2个输出端口(Sum和Cout)。
`std_logic`是VHDL中的一种数据类型,用于表示逻辑电平。
在架构部分,程序使用一个过程来计算和值(temp_sum)和进位(Cout)。
和值的计算通过使用异或(`xor`)操作符来实现,进位的计算则使用与(`and`)和或(`or`)逻辑操作符的组合来实现。
vhdl全加器实验报告VHDL全加器实验报告引言:在数字电路设计领域,全加器是一种基本的逻辑电路。
它用于将两个二进制数相加,并产生相应的和与进位输出。
在本次实验中,我们将使用VHDL语言设计和模拟一个全加器电路,并通过实验验证其功能和正确性。
一、实验目的本实验的目的是通过设计和模拟一个VHDL全加器电路,加深对数字电路和VHDL语言的理解。
具体目标如下:1. 学习并掌握全加器的原理和电路结构;2. 掌握VHDL语言的基本语法和使用方法;3. 设计和模拟一个全加器电路,并验证其正确性;4. 分析和评估全加器电路的性能和优化方法。
二、全加器的原理和电路结构全加器是一种用于二进制加法的逻辑电路。
它接受两个输入位和一个进位输入位,并产生一个和输出位和一个进位输出位。
全加器的电路结构通常由两个半加器和一个或门组成。
半加器用于计算两个输入位的和,而或门用于计算进位输出位。
三、VHDL语言的基本语法和使用方法VHDL是一种硬件描述语言,用于描述和模拟数字电路。
它具有丰富的语法和功能,可以方便地进行电路设计和仿真。
VHDL语言的基本语法包括实体声明、端口声明、信号声明、过程声明等。
在本次实验中,我们将使用VHDL语言来描述和模拟全加器电路。
四、全加器电路的设计和模拟在本次实验中,我们将使用VHDL语言设计和模拟一个4位全加器电路。
首先,我们需要定义输入和输出信号,并声明全加器的实体和端口。
接下来,我们可以使用VHDL语言描述全加器的逻辑电路,包括半加器和或门的连接关系。
最后,我们可以使用仿真工具对全加器电路进行模拟,并观察输出结果。
五、全加器电路的验证和性能评估在模拟过程中,我们可以通过输入不同的二进制数来验证全加器电路的正确性。
我们可以逐个比较输入和输出的二进制数,并检查和进位输出是否与预期结果一致。
如果全加器电路能够正确地计算和输出结果,则说明设计和模拟过程是正确的。
此外,我们还可以评估全加器电路的性能和优化方法。
vhdl加法器二位BCD码加法器的VHDL源程序如下导读:就爱阅读网友为您分享以下“二位BCD码加法器的VHDL源程序如下”资讯,希望对您有所帮助,感谢您对的支持!二位BCD码加法器的VHDL源程序如下:ibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity bcdadd is ---------------------实体部分port(key:in std_logic;---------------定义key输入口a0,a1,b0,b1:in integer range 0 to 9; -----定义两个加数的输入口a0l,a1l,b0l,b1l,s0l,s1l,s2l:out std_logic_vector(6 downto 0);----定义七个输出数码管s:out std_logic);----定义Key指示灯输出口end;architecture one of bcdadd is ----------结构体部分signal one:integer range 0 to 18; ----定义两个数的个位相加之后的信号signal ten:integer range 0 to 19; -----定义两个数的十位相加之后的信号signal co1,co2:integer range 0 to 1; ----定义个位和十位的进位信号signal s0,s1:integer range 0 to 15;beginp1:process(one,ten,a0,b0,a1,b1,co1)----第一个进程,进行加运算beginone<=a0+b0; --------------------个位相加之和if one>9 then --------------------和大于9,进位为1 co1<=1;s0<=one-10; -----------------------个位的值else -----------------------和小于9,进位为0co1<=0;s0<=one; -------------------------个位的值end if;ten<=a1+b1+co1;----------------------十位相加值和,加数包括个位来的进位if ten>9 then -------------------和大于9,进位为1co2<=1;s1<=ten-10;-------------------十位的值else ----------------------------------和小于9,进位为0co2<=0;s1<=ten;-----------------------十位的值end if;end process p1;p2:process(a0,a1,b0,b1) ----------第二个进程,两个加数的输出数码管显示译码begincase a0 is ----------------------被加数的个位显示译码when 0=>a0l<=“1000000”;when 1=>a0l<=“1111001”;when 2=>a0l<=“0100100”;when 3=>a0l<=“0110000”;when 4=>a0l<=“0011001”;第1页共4页when 5=>a0l<=“0010010”; when 6=>a0l<=“0000010”; when 7=>a0l<=“1111000”; when 8=>a0l<=“0000000”; whenothers=>a0l<=“ZZZZZZZ”; end case; case a1 is ------------------------------被加数的十位显示译码when 0=>a1l<=“1000000”; when 1=>a1l<=“1111001”; when 2=>a1l<=“0100100”; when 3=>a1l<=“0110000”; when 4=>a1l<=“0011001”; when 5=>a1l<=“0010010”; when 6=>a1l<=“0000010”; when 7=>a1l<=“1111000”; when 8=>a1l<=“0000000”; when 9=>a1l<=“0010000”; when others=>a1l<=“ZZZZZZZ”; end case; case b0 is-----------------------------加数的个位显示译码when 0=>b0l<=“1000000”; when 1=>b0l<=“1111001”; when 2=>b0l<=“0100100”; when 3=>b0l<=“0110000”; when 4=>b0l<=“0011001”; when 5=>b0l<=“0010010”; when 6=>b0l<=“0000010”; when8=>b0l<=“0000000”; when 9=>b0l<=“0010000”; when others=>b0l<=“ZZZZZZZ”; end case; case b1 is ----------------------------加数的十位显示译码when 0=>b1l<=“1000000”; when 1=>b1l<=“1111001”; when 2=>b1l<=“0100100”; when 3=>b1l<=“0110000”; when 4=>b1l<=“0011001”; when 5=>b1l<=“0010010”; when 6=>b1l<=“0000010”; when 7=>b1l<=“1111000”; when 8=>b1l<=“0000000”; when 9=>b1l<=“0010000”; when others=>b1l<=“ZZZZZZZ”;第2页共4页end case;end process p2;p3:process(key,s0,s1,co2,a0,a1,b0,b1) --------第三个进程,和的显示译码以及输入大于9是的出beginif key=…0‟ or a0>9 or b0>9 o r a1>9 or b1>9 then --当key等于0或者两个输入中的任何一个位大于9,和的数码显示均为“Z”状态s0l<=“ZZZZZZZ”;s1l<=“ZZZZZZZ”;s2l<=“ZZZZZZZ”;elsecase s0 is-------------------------------和的个位显示译码when 0=>s0l<=“1000000”;when 1=>s0l<=“1111001”;when 2=>s0l<=“0100100”;when 3=>s0l<=“0110000”;when 4=>s0l<=“0011001”;when 5=>s0l<=“0010010”;when 6=>s0l<=“0000010”;when 7=>s0l<=“1111000”;when 8=>s0l<=“0000000”;when 9=>s0l<=“0010000”;wh en others=>s0l<=“ZZZZZZZ”; end case;case s1 is--------------------------------和的十位显示译码when 0=>s1l<=“1000000”;when 1=>s1l<=“1111001”;when 2=>s1l<=“0100100”;when 3=>s1l<=“0110000”;when 4=>s1l<=“0011001”;when 5=>s1l<=“0010010”;when 6=>s1l<=“0000010”;when 7=>s1l<=“1111000”;when 8=>s1l<=“0000000”;when 9=>s1l<=“0010000”;when others=>s1l<=“ZZZZZZZ”; end case;case co2 is --------------------------和的百位显示译码when 0=>s2l<=“1000000”;when 1=>s2l<=“1111001”;end case;end if;end process p3;第3页共4页p4:process(key) -------------第四个进程,设置key的指示灯beginif key=…1‟ then s<=…1‟ ; else s<=…0‟;end if;end process p4;end;第4页共4页百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网,您的在线图书馆。
实验五四位二进制加法计数器VHDL设计一、实验目的:进一步掌握引脚锁定、硬件下载及芯片测试方法。
掌握开发板的使用。
二、实验仪器:PC机,FPGA开发板,万用表,接线若干。
三、实验内容:1、设计内容如下两张图所示:2、注意开关如处在常态,输出值为‘1’;按下开关的输出值为‘0’。
完成上面的设计,并下载观察实验现象。
开关有抖动吗?3、将20MHz 的输入频率,分频后作为计数器的时钟。
设计电路,并下载观察实验现象。
4、管脚锁定及下载的方法如5~9。
5、选定器件。
点击QuartusII菜单Assignments下的“Device”,出现选择器件系列及器件型号选择窗口。
按照实验中所给的器件型号选择器件系列及器件型号。
(请按照开发板上实际的芯片选择芯片系列,以及芯片型号)选好器件后,重新全程编译。
6、查找管脚号。
观察开发板和外围电路。
确认电路的连接方法。
观察CLK 的管脚号,并记录。
确定数码管所接的端口,记录管脚号。
7、锁定管脚。
选择菜单Assignments下的Pins出现下图。
在Location下选择对应管脚的管脚号。
将CLK锁定在开发板规定的管脚号上。
将输出端锁定在所选定的管脚号上。
所有的引脚锁定后,再次全程编译。
8、在菜单菜单Tools下选择programmer打开编程窗口,观察箭头所指的信息。
如果显示“No Hardware”,点击左边的“Hardware Setup”,双击USB-Blaster。
如下图所示。
点击“Close”,关闭上面的窗口。
此时QUARTUSII的窗口应该为:选中Program/Configure下方的框(出现勾)。
点击左边的“Start”,开始下载。
当显示100%时,下载成功。
9、硬件测试。
观察实验现象。
适当进行操作,实验现象又是什么?四、实验报告要求:1.写出你实验时的芯片系列及芯片型号2.实验箱连接在PC机的什么口上?3.简要说明实验过程中遇到的问题,及解决方法。
vhdl全加器实验报告VHDL全加器实验报告引言:在现代计算机科学中,加法运算是基本而重要的运算之一。
全加器是一种用于实现二进制加法的电路。
本次实验旨在使用VHDL语言设计和实现一个全加器电路,并通过仿真和测试验证其正确性和可行性。
一、全加器的原理和设计思路全加器是由两个半加器和一个额外的输入信号组成的电路。
它的输入包括两个二进制数位的输入信号A和B,以及一个来自上一位的进位信号Cin。
输出包括一个和位输出信号S和一个进位输出信号Cout。
全加器的真值表如下:A B Cin S Cout0 0 0 0 00 0 1 1 00 1 0 1 00 1 1 0 11 0 0 1 01 0 1 0 11 1 0 0 11 1 1 1 1根据全加器的真值表,我们可以得到以下逻辑表达式:S = A ⊕ B ⊕ CinCout = (A ∧ B) ∨ (Cin ∧ (A ⊕ B))基于以上原理和逻辑表达式,我们可以使用VHDL语言来实现全加器电路。
二、VHDL全加器电路的设计和实现1. 实体声明:首先,我们需要在VHDL代码中声明全加器的输入和输出信号。
代码如下:entity FullAdder isport (A, B, Cin: in std_logic;S, Cout: out std_logic);end FullAdder;2. 架构实现:接下来,我们需要在VHDL代码中实现全加器的逻辑功能。
代码如下:architecture behavior of FullAdder isbeginS <= A xor B xor Cin;Cout <= (A and B) or (Cin and (A xor B));end behavior;三、VHDL全加器电路的仿真和测试1. 仿真环境的搭建:为了验证全加器电路的正确性,我们需要使用VHDL仿真工具进行电路的仿真。
这里我们使用ModelSim进行仿真。
大学实验报告学生: 学 号: 专业班级: 中兴101实验类型:■ 验证 □ 综合 □设计 □ 创新 实验日期: 2012 9 28 实验成绩:实验一 一位二进制全加器设计实验一.实验目的(1)掌握Quartus II 的VHDL 文本设计和原理图输入方法设计全过程; (2)熟悉简单组合电路的设计,掌握系统仿真,学会分析硬件测试结果; (3) 熟悉设备和软件,掌握实验操作。
二.实验容与要求(1)在利用VHDL 编辑程序实现半加器和或门,再利用原理图连接半加器和或门完成全加器的设计,熟悉层次设计概念;(2)给出此项设计的仿真波形;(3)参照实验板1K100的引脚号,选定和锁定引脚,编程下载,进行硬件测试。
三.设计思路一个1位全加器可以用两个1位半加器及一个或门连接而成。
而一个1位半加器可由基本门电路组成。
(1) 半加器设计原理能对两个1位二进制数进行相加而求得和及进位的逻辑电路称为半加器。
或:只考虑两个一位二进制数的相加,而不考虑来自低位进位数的运算电路,称为半加器。
图1为半加器原理图。
其中:a 、b 分别为被加数与加数,作为电路的输入端;so 为两数相加产生的本位和,它和两数相加产生的向高位的进位co 一起作为电路的输出。
半加器的真值表为表1 半加器真值表absoco0 0 0 0 0 1 1 0 1 0 1 0 111由真值表可分别写出和数so ,进位数co 的逻辑函数表达式为:b a b a b a so ⊕=+=--(1)ab co = (2)图1半加器原理图(2) 全加器设计原理除本位两个数相加外,还要加上从低位来的进位数,称为全加器。
图2全加器原理图。
全加器的真值表如下:表2全加器真值表c a b co so0 0 0 0 00 0 1 0 10 1 0 0 10 1 1 1 01 0 0 0 11 0 1 1 01 1 0 1 01 1 1 1 1其中a为加数,b为加数,c为低位向本位的进位,co为本位向高位的进位,so为本位和。
采用VHDL层次化文件设计一个四位全加器一、实训目的1.巩固VHDL层次化文件设计方法。
2.培养应用VHDL层次化文件设计法的技能。
二、实训器材计算机与Quartus Ⅱ工具软件。
三、实训指导(一)实训原理4位二进制加法器由4个全加器构成,而全加器又由一个半加器和一个或门构成,半加器的真值表如表5-1所示:表5-1 半加器的真值表半加器的逻辑表达式为:so=NOT(a XOR(NOT b))co=a AND b一位全加器的真值表如表5-2所示:表5-2 一位全加器的真值表(二)实训步骤1.电路模块划分根据算法分析,4位二进制加法器可由4个全加器构成,画出其原理方框图。
全加器原理方框图如图5-1所示。
而每个全加器又可划分为一个半加器和一个或门这两个更小的模块,画出其原理方框图。
4位二进制加法器原理方框图如图5-2所示。
图5-1 一位全加器原理方框图图5-2 4位二进制加法器原理框图2.设计底层设计文件(1)设计半减器文件halfadd.vhd。
(2)设计或门电路文件orgate.vhd。
(3)设计全加器电路文件fulladd.vhd,其中把半加器和或门电路文件作为元件调用。
3.设计顶层设计文件设计顶层设计文件add4.vhd,其中把全加器文件作为元件调用。
VHDL代码如下:halfadd.vhd文件代码如下:ENTITY halfadd ISPORT(a,b:IN BIT;so,co:OUT BIT);END halfadd;ARCHITECTURE a OF halfadd ISBEGINPROCESS(a,b)BEGINso<=NOT(a XOR(NOT b)) AFTER 10ns; co<=a AND b AFTER 10 ns;END PROCESS;END a;orgate.vhd文件代码如下:ENTITY orgate ISPORT(a1,b1:IN BIT;o:OUT BIT);END orgate;ARCHITECTURE a OF orgate ISBEGINo<=a1 OR b1;END a;fulladd.vhd文件代码如下:ENTITY fulladd ISPORT(i1,i2,c_in:IN BIT;fs,c_out:OUT BIT);END fulladd;ARCHITECTURE a OF fulladd ISSIGNAL temp_s,temp_c1,temp_c2:BIT; COMPONENT halfaddPORT(a,b:IN BIT;so,co:OUT BIT);END COMPONENT;COMPONENT orgatePORT(a1,b1:IN BIT;o:OUT BIT);END COMPONENT;BEGINU0:halfadd PORT MAP(i1,i2,temp_s,temp_c1);U1:halfadd PORT MAP(temp_s,c_in,fs,temp_c2);U2:orgate PORT MAP(temp_c1,temp_c2,c_out);END a;add4.vhd文件代码如下:ENTITY add4 ISPORT(a,b:IN BIT_VECTOR(3 DOWNTO 0);cin:IN BIT;so:OUT BIT_VECTOR(3 DOWNTO 0);co:OUT BIT);END add4;ARCHITECTURE a OF add4 ISSIGNAL temp_co0,temp_co1,temp_co2:BIT;COMPONENT fulladd ISPORT(i1,i2,c_in:IN BIT;fs,c_out:OUT BIT);END COMPONENT;BEGINU0:fulladd PORT MAP(a(0),b(0),cin,so(0),temp_co0);U1:fulladd PORT MAP(a(1),b(1),temp_co0,so(1),temp_co1); U2:fulladd PORT MAP(a(2),b(2),temp_co1,so(2),temp_co2); U3:fulladd PORT MAP(a(3),b(3),temp_co2,so(3),co);END a;1.编译顶层设计文件把以上各个模块的VHDL设计文件放入同一个文件夹中,以顶层文件建立工程,直接编译顶层文件同时也就编译各个底层模块文件。