如何用与非门设计全加器 、乘法器?
如何用与非门设计全加器?其实这些都是很基础的东西但是往往被大家忽略。
首先我们来看全加器的真值表:
需要明确的是:
input Xi ,Yi,Ci;//Ci表示来自低位的进位
output sum,Cout;//Cout表示向高位的进位
而通过真值表我们可以看出来:
Cout=Xi*Yi +Yi*Ci +Xi*Ci;
sum = X^Y^Ci;
那这就比较容易了,下面是门级描述。
module();
input x, y, ci;
output sum,Cout;
wire a, b, c,e,f,g;
xor u1(a, x, y);
xor u2(sum, a,ci);
and u3( c, x, y );
and u4( e, y ,ci );
and u5 ( f, x, ci);
or u6 ( g ,c, e );
or u7 ( Cout, g , f );
endmodule
ps:在程序模块中出现的 and or xor 都是verilog的保留字,由verilog的原语(primitive)规定了他们的接口顺序和用法
在数字信号处理的快速运算电路中常常用到多位数字量的加法运算,这时需要用到并行加法器。下图表示了一个4位二进制超前进位加法电路。
在实现算法时,如(卷积运算和快速傅里叶变换)常常会用到加法运算,多位并行加法器是由多层组合逻辑构成,加上超前进位形成逻辑减少了延迟,但还是有多级门和布线延迟,由于加法器的延迟使加法器的使用频率受到限制,如果设计的是32位或者64位,延迟会更大,为了加快计算的节拍,可以在运算电路的组合逻辑层中加入多个寄存器组来暂存中间结果,也就是采用数字电路中的流水线办法,来提高运算速度。
行为级描述就更加简单了,
来一个四位的:
- module adder_code(
- input [3:0] num_1,
- input [3:0] num_2,
- output [3:0] out_num,
- output C
- );
- assign {C,out_num} = num_1+ num_2;
- endmodule
这样设计的加法器在行为仿真时是没有延时的,借助综合器,可以根据代码综合成典型的加法器电路。
乘法器:
设两个n位二进制正数X和Y,即:
X:Xn-1.....X0;
Y:Yn-1.....Y0;
则X和Y的乘积有2n位,并且试中的YiXi称为部分积,记为Pi,显然,两个一位二进制数相乘遵循如下规律。
0*0=0 , 0*1=0 ,1*0=0 ,1*1=1;
因此YiXi可用一个与门实现,记为Pij=YiXi;
例如:两个4位二进制数X和Y相乘。
乘法器单元逻辑图:
则例子中的运算可以表示为:
即乘法器可以由与门和加法器组成。