加法器相关
半加器和全加器的区别在于,是否有进位输入端,可以直观地理解为,半加器是两个一比特相加,而全加器是三个一比特相加,输出结果和进位信号。
半加器
半加器的真值表如下图
输入 | 输出 | ||
A | B | C | S |
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
其逻辑表达式为
根据逻辑表达式,可以使用如下门电路实现
全加器
全加器真值表如下
输入 | 输出 | |||
A | B | Ci | C | S |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
其逻辑表达式为:
使用门电路搭建
使用加法器计算 7bit 中 1 的数量,最少用几个?
有 7 个 1bit 的数,为他们编号,从 b0 到 b6,一共七个。
使用 1bit 全加器可以将 3 个 bit 相加,得到 2bit 的结果,那么 b0,b1,b2 使用一个加法器,b3,b4,b5 使用一个加法器。
现在 7 个 1bit 变成了 2 个 2bit 和一个 1bit(b6)。
然后使用一个 2bit 全加器将两个 2bit 数进行相加,1bit 的 b6 作为进位输入。相加后结果为 3 位,最大可以表示到 7 个 1bit。
而 2bit 全加器可以有 2 个 1bit 全加器组成,所以一共使用 4 个 1bit 全加器可以完成 1 的数量的统计。
行波进位加法器
以 4bit 的行波进位加法器为例,需要使用 4 个 1bit 加法器实现,如下图所示。在进行加法运算时,首先准备好的是 1 号全加器的 3 个 input。而 2、3、4 号全加器的 Cin 全部来自前一个全加器的 Cout,只有等到 1 号全加器运算完毕,2、3、4 号全加器才能依次进行进位运算,最终得到结果。这样进位输出,像波浪一样,依次从低位到高位传递, 最终产生结果的加法器,也因此得名为行波进位加法器(Ripple-Carry Adder,RCA)。
如果将全加器内部打开,我们可以看到,关键路上有 9 个门,门延迟非常高
超前进位加法器
为了改进行波仅为加法器的延迟问题,可以将全加器的进位信号转化为 G 和 P 以及本级进位输入组成的逻辑。如下图
将四个加法器串联,迭代可以得到
可以看到,每一级的进位都不依赖于上一级的进位,因此不需要等待上一个加法器完成计算,超前得到进位结果。同时,显然如果要实现大位宽加法器,逻辑将会变得更加复杂。
通过超强进位的方法,实现四位全加器的原理图如下
单 bit 全加器的输出改为输出 P、G 和 S,而每一级的进位可以有下方的逻辑得到。因此最终延迟为 4 个门。
对比行波进位加法器(RCA)和超前进位加法器(CLA)
- | RCA | CLA |
结构特点 | 低位全加器的 Cout 连接到高一位全加器 Cin | 每个全加器的进位输入并不来自于前一级的全加器,而是来自超前进位的逻辑 |
优点 | 电路布局简单,设计方便 | 计算 Ci+1 的延迟时间固定为三级门延迟,与加法器的位数无关 |
缺点 | 高位的运算必须等待低位的运算完成,延迟时间长 | 如果进一步拓宽加法器的位数,则电路变得非常复杂 |
分频电路相关
偶数分频
偶数分频器的实现简单,用计数器在上升沿或者下降沿计数,当计数器的值等于分频系数的一半或等于分频系数时,信号翻转。偶数分频器分频原理如下图所示:
上图的的分频系数是 4,就是 4 分频。电路原理是用一个上升沿计数的计数器,每次计数到 2 时输出信号 clkout 翻转一次,每次计数到 4 时 clkout 再翻转一次,一直周期重复下去。其他的偶数分频器原理也是一样。
如果偶数分频系数是 2 的幂,就可以用 2 分频器级联得到;例如 4 分频就是两个 2 分频级联,下图就是用两个 2 分频器级联得到 4 分频器。
奇数分频
如果不要求占空比为 50%的话,也比较容易实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到 1 时,输出时钟进行翻转,计数到 2 时再次进行翻转。即在计数值在邻近的 1 和 2 进行了两次翻转。这样实现的三分频占空比为 1/3 或者 2/3。
对于实现占空比为 50%的 N 倍奇数分频,可以分解为两个通道:
•上升沿触发进行模 N 计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2 再次进行翻转得到一个占空比为非 50%奇数 N 分频时钟;•下降沿触发进行模 N 计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2 时,输出时钟再次翻转生成占空比非 50%的奇数 N 分频时钟。
将这两个占空比非 50%的 N 分频时钟或运算,得到占空比为 50%的奇数 n 分频时钟。
具体例子:5 分频等占空比,可以通过待分频时钟下降沿和上升沿触发 0~4 计数,
•对于待分频时钟的上升沿,当计数器 cnt1 计数到 1 时,clk_p 翻转;当计数器计数到 3(1 + (5 - 1) / 2 = 3)时,clk_p 再次反转;•对于待分频时钟的下降沿,当计数器 cnt2 计数到 1 时,clk_n 翻转;当计数器计数到 3(1 + (5 - 1) / 2 = 3)时,clk_n 再次反转;•然后下降沿产生的 5 分频时钟和上升沿产生的 5 分频时钟进行或运算,即可得到占空比为 50%的 N 分频时钟。
这种方法可以实现任意的奇数分频。
下面给出 5 分频的具体代码:
`timescale 1ns/1ps
module CLK_DIV5(
input clk_i,
input rst_n,
output clk_o
);
reg [2:0] cnt1,cnt2;
reg clk_p,clk_n;
//*********************
//MAIN CORE
//*********************
always @(posedge clk_i,negedge rst_n)
if(!rst_n) begin
cnt1 <= 3'b0;
clk_p <= 1'b0;
end
else begin
if(cnt1 == 3'b100) begin
cnt1 <= 3'b0;
clk_p <= clk_p;
end
else begin
cnt1 <= cnt1 + 1'b1;
if(cnt1 == 3'b1 || cnt1 == 3'b11)
clk_p <= ~clk_p;
end
end
always @(negedge clk_i,negedge rst_n)
if(!rst_n) begin
cnt2 <= 3'b0;
clk_n <= 1'b0;
end
else begin
if(cnt2 == 3'b100) begin
cnt2 <= 3'b0;
clk_n <= clk_n;
end
else begin
cnt2 <= cnt2 + 1'b1;
if(cnt2 == 3'b1 || cnt2 == 3'b11)
clk_n <= ~clk_n;
end
end
assign clk_o = clk_p | clk_n;
endmodule
分数分频
对于要求相位以及占空比严格的分数分频(小数分频),建议采用模拟电路实现。而使用数字电路实现只能保证尽量均匀,在长时间内进行分频。
对于一个分数,把他它分为整数部分和小数部分的形式。例如 N=M.D>1 分频,分为整数 M 和小数 D,我们使用 M 分频和 M+1 分频来构成 M.D 分频。
设 M 分频的次数为 N1,M+1 分频的次数为 N2。
将 M 分频进行 N1 次和 M+1 分频进行 N2 次,那么在 M*N1+(M+1)*N2 个周期内,整体可以看作(M*N1+(M+1)*N2)/(N1+N2)=N 分频。
可以通过均匀分布 M 分频和 M+1 分频,使得相位较为均匀。
结构图可以参考下图