verilog全加器和乘法器设计

如何用与非门设计全加器?其实这些都是很基础的东西但是往往被大家忽略。

首先我们来看全加器的真值表:

verilog全加器和乘法器设计_第1张图片

需要明确的是:

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位二进制超前进位加法电路。

verilog全加器和乘法器设计_第2张图片

在实现算法时,如(卷积运算和快速傅里叶变换)常常会用到加法运算,多位并行加法器是由多层组合逻辑构成,加上超前进位形成逻辑减少了延迟,但还是有多级门和布线延迟,由于加法器的延迟使加法器的使用频率受到限制,如果设计的是32位或者64位,延迟会更大,为了加快计算的节拍,可以在运算电路的组合逻辑层中加入多个寄存器组来暂存中间结果,也就是采用数字电路中的流水线办法,来提高运算速度。

行为级描述就更加简单了,

来一个四位的:

  1. module adder_code(  
  2.     input [3:0] num_1,  
  3.     input [3:0] num_2,  
  4.     output [3:0] out_num,  
  5.     output C 
  6.     );  
  7.        
  8. assign {C,out_num} = num_1+ num_2;  
  9.   
  10. 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相乘。

verilog全加器和乘法器设计_第3张图片

乘法器单元逻辑图:

verilog全加器和乘法器设计_第4张图片

则例子中的运算可以表示为:

verilog全加器和乘法器设计_第5张图片

即乘法器可以由与门和加法器组成。

 

你可能感兴趣的:(FPGA)