位二进制全加器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`)逻辑操作符的组合来实现。