FPGA----乘法器的设计

乘法算是基本运算之一,广泛应用在数字信号处理中,滤波器中乘法运算必不可少,实现乘法器的方法很多,各有各的优缺点,常见的有移位相加法,加法树法,查表法,混合法……

在我们用语言设计电路时,初学时在实现乘法运算时通常很简单的用*号操作,但是这种方法谈不上设计乘法器,其最终的硬件实现要根据综合器综合的结果,好的综合器可以综合出想要的结果,但是实际上这种粗放的设计通常得到的都是劣等的乘法运算,无法满足对乘法速率的要求,在滤波电路中要求数据串行进入接着进行大量的乘法运算,当所设计的乘法器其的速度小于数据进入的速度的时候就会导致结果错……


1,以为相加乘法器其,对两个二进制数进行相乘运算,运用列式求法我们可以得知,乘法最终就是由加法和移位运算构成的,由此可以用高速度的加法和移位实现乘法操作,具体代码如下:


begin
dout=0;
for(i=0;i dout=dout+((din_a_buf[i]==1)?(din_b_buf<

end


2,上面的设计中,由于产生了大量的组合逻辑,这就带来了大量的延迟从而使乘法器的速率受到限制,为了提高速度,可以采用流水线的方法,将组合逻辑分割成一个一个小的组合逻辑,中间加上触发器用来锁存数据,这样就可以大大提高频率,引入触发器仅仅是带来了延迟而已,具体代码实现如下


begin//流水线实现
din_a_buf<=din_a;
din_b_buf<=din_b;
buf0<=din_b_buf[0]?din_a_buf:0;
buf1<=din_b_buf[1]?din_a_buf<<1:0;
buf2<=din_b_buf[2]?din_a_buf<<2:0;
buf3<=din_b_buf[3]?din_a_buf<<3:0;
buf4<=din_b_buf[4]?din_a_buf<<4:0;
buf5<=din_b_buf[5]?din_a_buf<<5:0;
buf6<=din_b_buf[6]?din_a_buf<<6:0;
buf7<=din_b_buf[7]?din_a_buf<<7:0;

buf01<=buf0+buf1;
buf23<=buf2+buf3;
buf45<=buf4+buf5;
buf67<=buf6+buf7;

buf02<=buf01+buf23;
buf46<=buf45+buf67;

dout<=buf02+buf46;

end


此种乘法器叫做加法树式乘法器,此方法被广泛使用……


3,查表法,就是建一个表,里面存放了所有的乘法结果,乘数和被乘数用来作为地址去里面的乘积,此种方法可以大大提高乘法的速率,但是当乘法位数很大时会要求产生很大的表格,所以此种方法适合位数较小的乘法,特别适合有一个乘数为固定的乘法,如滤波器中的乘法就可以采用此种方法设计……
4,混合,顾名思义就是结合以上各种方法的乘法器……

你可能感兴趣的:(FPGA)