VHDL语言与数字集成电路设计
指导老师:
张鹰
全加器的延迟分析
引言:
全加器是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。
本次设计首先介绍一位全加器的功能,电路原理图,接着主要对全加器电路进行延迟分析,包括传输延迟和惯性延迟的分析。通过对全加器电路延迟的分析,以达到对信号运算中时间延迟的深入理解。
1. 全加器电路的功能
在介绍全加器电路功能之前,首先介绍下半加器电路,其逻辑真值表如表1:
输 入
和
进 位
a b
s
co
0 0
0 1
1 0
1 1
0
1
1
0
0
0
0
1
表1 半加器逻辑真值表
根据以上真值表得到半加器逻辑表达式为:
s = a⊕b=[a*b+(a+b)’]’
co = a*b
全加器在半加器基础上可以实现带低位进位的功能,其电路逻辑真值表如表2:
输 入
输 出
cinb a
s co
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
0 0
1 0
1 0
0 1
1 0
0 1
0 1
1 1
表2全加器逻辑真值表
根据以上真值表可知全加器逻辑表达式:
s=a⊕b⊕cin
co=a*b+cin*(a⊕b)
2. 全加器电路原理图
根据以上可知,全加器可以由两个半加器组成,结构图如图1所示:
图1两个半加器组成全加器结构图
从半加器逻辑表达式得全加器整体电路原理图如图2所示:
图2全加器电路原理图
3. 全加器电路延迟分析
在以上全加器电路原理图中,只涉及到三个基本逻辑门,分别是非门,与非门,或非门,假设三个门的延迟如表3所示:
表3三个基本逻辑门的延迟模型
门
延迟
非门
与非门
或非门
输入惯性延迟
1ns
2ns
2ns
输出传输延迟
1ns
2ns
2ns
根据表3的延迟值以及图2的全加器原理图,可以对全加器的各个输入输出端口进行延迟时间分析。
对输出端口co进行分析:
输入端口a到输出端口co:
a到co的最长路径为:a→ab0→ab1→ab2→ab3→ab4→a2→co,总共延迟时间为22ns;
路径中存在的最大输入电容为节点ab2的电容,此电容构成a到co的惯性延迟为8ns。
从而根据最长路径延迟22ns和惯性延迟8ns,得到a到co的输出传输延迟为22ns-8ns=14ns延迟。
输入端口b到输出端口co:
b到co的最长路径为:b→ab0→ab1→ab2→ab3→ab4→a2→co,总共延迟时间也为22ns;
路径中存在的最大输入电容也为节点ab2的电容,此电容构成b到co的惯性延迟为8ns。
从而根据最长路径延迟22ns和惯性延迟8ns,得到b到co的输出传输延迟也为22ns-8ns=14ns延迟。
输入端口cin到输出端口co:
cin到co的最长路径为:cin→ab3→ab4→a2→co,总共延迟时间为12ns;
路径中存在的最大输入电容为节点cin的电容,此电容构成cin到co的惯性延迟为6ns。
从而根据最长路径延迟12ns和惯性延迟6ns,得到cin到co的输出传输延迟为12ns-6ns=6ns延迟。
对输出端口s进行分析:
输入端口a到输出端口s:
a到s的最长路径为:a→ab0→ab1→ab2→cin0→cin1→s,总共延迟时间为20ns;
路径中存在的最大输入电容为节点ab2的电容,此电容构成a到s的惯性延迟为8ns。
从而根据最长路径延迟20ns和惯性延迟8ns,得到a到co的输出传输延迟为20ns-8ns=12ns延迟。
输入端口b到输出端口s:
b到s的最长路径为:b→ab0→ab1→ab2→cin0→cin1→s,总共延迟时间也为20ns;
路径中存在的最大输入电容也为节点ab2的电容,此电容构成b到s的惯性延迟为8ns。
从而根据最长路径延迟20ns和惯性延迟8ns,得到b到s的输出传输延迟也为20ns-8ns=12ns延迟。
输入端口cin到输出端口s:
cin到s的最长路径为:cin→cin0→cin1→s,总共延迟时间为10ns;
路径中存在的最大输入电容为节点cin的电容,此电容构成cin到s的惯性延迟为6ns。
从而根据最长路径延迟10ns和惯性延迟6ns,得到cin到s的输出传输延迟为10ns-6ns=4ns延迟。
4. 全加器电路VHDL代码及modelsim仿真图:
对于全加器电路的输入惯性延迟和输出传输延迟模型可由图3表示:
图3 全加器惯性延迟和传输延迟等效模型
跟据上图延迟模型,可以写出相应VHDL代码。
对于co端口,其延迟部分的VHDL代码如下:
a_buffer <=a_in after 8ns;
b_buffer<=b_in after 8ns;
cin_buffer<=cin_in after 6ns;
a<=transport a_buffer after 14ns;
b<=transport b_buffer after 14ns;
cin<=transport cin_buffer after 6ns;
即可以得到输入端口a,b,cin到输出端口co的延迟描述。
对于s端口,其延迟部分的VHDL代码如下:
a_buffer <=a_in after 8ns;
b_buffer<=b_in after 8ns;
cin_buffer<=cin_in after 6ns;
a<=transport a_buffer after 12ns;
b<=transport b_buffer after 12ns;
cin<=transport cin_buffer after 4ns;
即可以得到输入端口a,b,cin到输出端口s的延迟描述。
不考虑延迟时的全加器VHDL代码如下:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY work;
ENTITY full_adder IS
PORT
(
a : IN STD_LOGIC;
b : IN STD_LOGIC;
cin: IN STD_LOGIC;
co : OUT STD_LOGIC;
s : OUT STD_LOGIC
);
END full_adder;
ARCHITECTURE adder OF full_adder IS
SIGNAL a0 : STD_LOGIC;
SIGNAL a1 : STD_LOGIC;
SIGNAL a2 : STD_LOGIC;
SIGNAL ab0 : STD_LOGIC;
SIGNAL ab1 : STD_LOGIC;
SIGNAL ab2 : STD_LOGIC;
SIGNAL ab3 : STD_LOGIC;
SIGNAL ab4 : STD_LOGIC;
SIGNAL b0 : STD_LOGIC;
SIGNAL cin0 : STD_LOGIC;
SIGNAL cin1 : STD_LOGIC;
SIGNAL cin2 : STD_LOGIC;
BEGIN
a2 <= NOT(ab4 OR a1);
b0 <= NOT(b OR a);
ab2 <= NOT(b0 OR ab1);
cin2 <= NOT(cin OR ab2);
s <= NOT(cin2 OR cin1);
a1 <= NOT(a0);
ab1 <= NOT(ab0);
cin1 <= NOT(cin0);
ab4 <= NOT(ab3);
co <= NOT(a2);
a0 <= NOT(b AND a);
ab0 <= NOT(b AND a);
cin0 <= NOT(cin AND ab2);
ab3 <= NOT(cin AND ab2);
END adder;
相应的testbench代码:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY full_adder_vhd_tst IS
END full_adder_vhd_tst;
ARCHITECTURE full_adder_arch OF full_adder_vhd_tst IS
SIGNAL a : STD_LOGIC;
SIGNAL b: STD_LOGIC;
SIGNAL cin : STD_LOGIC;
SIGNAL co : STD_LOGIC;
SIGNAL s : STD_LOGIC;
COMPONENT full_adder
PORT (
a: IN STD_LOGIC;
b: IN STD_LOGIC;
cin : IN STD_LOGIC;
co : OUT STD_LOGIC;
s : OUT STD_LOGIC
);
END COMPONENT;
BEGIN
i1 : full_adder
PORT MAP (
a => a,
b=>b,
cin =>cin ,
co => co,
s => s
);
init : PROCESS
BEGIN
a<='0';
b<='1';
cin <='1';
wait for 10ns;
a<='1';
b<='1';
cin <='1';
wait for 7ns;
a<='1';
b<='0';
继续阅读