Ci = Xi Y i Ci-1+X i Y i C i-1+X i Y i C i-1+X i Y i C i-1 = (X i ○+Y i)C i-1+X i Y i Fi = XiYiC i-1 + XiYiC i-1 +XiYiC i-1 + XiYiC i-1 = Xi○+Yi○+C i-1
(3)由上面可得。Xi和Yi为两个输入的一位二进制书,Ci-1为低位二进制数相加的进位输出到本位的输入,则Fi为本位二进制数Xi、Yi和低位进位输入Ci-1的相加之和,Ci为Xi、Yi和低位进位输入Ci-1相加向高位的进位输出。因此,该电路可以完成一位二进制数全加的功能,称为全加器。此电路的真值表如表2所示。
表2 一位全加器真值表
Xi 0 0 1 1 0 0 1 1
Yi 0 1 0 1 0 1 0 1
Ci-1 0 0 0 0 1 1 1 1
Fi 0 1 1 0 1 0 0 1
Ci 0 0 0 1 0 1 1 1
1.4 十六位全加器的设计
设计16位的全加器思路非常简单且清晰,第一种方法就是先设计一个半加器和一个或门,然后两个半加器合并成一个一位的全加器,最后用16个一位的全加器组合成为一个16位的全加器;第二种方法就是先设计一个一位的全加器,然后在用16个串联或并联就组成了一个16位的全加器,而本次设计采用采用的是第一种方法。
图3 一位全加器的级联原理图
十六位全加器有十六个一位全加器的级联组成的,最低位的借位信号时整个全加器的借位信号Cin,最高位的进位信号是十六位全加器的进位信号,每位之间通过进位信号链接,两个十六位加数的每一位并联输入,和数SUM的每一位并联输出,完成两个十六位的数的加法。 1.5用VHDL编写代码实现16位全加器
本次实验使用 Altera FPGA/CPLD 的开发工具 Quartus Ⅱ,利用编写VHDL代码设计方法设计一个16位加法器,并用Quartus的综合仿真工具实现电路的综合,电路功能的验证,并最后查看综合后的RLT电路框图来验证设计与原逻辑设计符不符合要求,我们还可以借用powerplay功率分析工具对设计后的电路进行功耗分析。
本次设计有一个顶层模块(16位全加器)和三个底层模块,它们分别为一位全加器和组成一位全加器的半加器模块和或门模块。因此我们要用从底层到
顶层的设计思路,以半加器+或门 ——>一位全加器——>16位全加器的为设计顺序。
以下为半加器和活门的VHDL程序代码 (1) 半加器的VHDL代码 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity h_adder is port(a,b:in std_logic; co:out std_logic; so:out std_logic ); end h_adder;
architecture one of h_adder is begin
so<=a xor b; co<=a and b; end one;
(2) 或门的VHDL代码 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity or2a is
port(a,b:in std_logic;
c:out std_logic ); end or2a;
architecture one of or2a is begin c<=a or b; end one;
由全加器的逻辑图可以看出,全加器由两个半加器和一个或门组成。在VHDL语言中我们可以在一个模块的代码中用component语句调用低层的模块。这样可以避免写更多的繁琐的代码,也可以提高程序的可读性,也有利于实际电路在延时等关键技术性问题上的优越性。 (3) 一位全加器的VHDL代码 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity f_adder is port(ain:in std_logic; bin:in std_logic; cin:in std_logic; coutf:out std_logic; sumf:out std_logic ); end f_adder;
architecture one of f_adder is component h_adder
相关推荐: