首页->【FPGA/CPLD助学小组】

671 1

研究了半天特权同学的16位乘法器的移位累加部分的代码,始终没有搞清楚其中的原理。希望特权同学能对该段代码给出一个详细的分析,举例说明每一步具体是怎样移位并累加的。

本人个人认为:两个二进制数之间相乘,就是用乘数从最低位开始,每一位依次去和被乘数相乘,最终再将每一次所得的乘积相加,这样就得到了最终的乘积。但要注意的是,和十进制数的乘法类似,用乘数的某一位去和被乘数相乘时所得到的结果的最低位必须与该乘数所在位对齐,即每一步所得到的乘积应该依次左移移位,呈阶梯状排列。

基于以上分析,本人对特权同学的移位累加部分的代码作了相应的改进:

if(i==0)
     begin //锁存乘数、被乘数
         areg <= ain;
         breg <= bin;
     end

else if(i > 5'd0 && i < 5'd17)
         if(areg[i-1])
         yout_r <= yout_r+({16'h0000,breg}<<(i-1));

关键语句为红色标示那句,当乘数a的某一位为1(为0可以忽略,因为0和b相乘得到的结果也为0)时,与b相乘的结果为b(16位),在前面补上16个0后,结果即为32位,再左移i-1位,即将该结果前面的i-1个0移到最后补齐。现举例分析(由于16位相对繁琐一点,所以以两个4位数相乘为例,原理都是一样的):

                                                      (b)1 0 1 0
                                            x (a)1 1 0 1           
                                          ------------------
                                      0 0 0 0 1 0 1 0(i=1)
                                   0 0 0 0 0 0 0 0   (i=2)  
                                0 0 0 0 1 0 1 0      (i=3)
                           +0 0 0 0 1 0 1 0         (i=4)
                          -------------------------------

左移(i-1)位后:

                                                (b)1 0 1 0
                                            x (a)1 1 0 1           
                                          ------------------
                                      0 0 0 0 1 0 1 0 (i=1)
                                      0 0 0 0 0 0 0 0 (i=2)  
                                      0 0 1 0 1 0 0 0 (i=3)
                           +         0 1 0 1 0 0 0 0 (i=4)
                          -------------------------------

                           =         1 0 0 0 0 0 1 0

楼主可见

  1. CrazyBingo 1#

    还是研究 cnt * (1/11)吧!!!

    1/11= 3/33 = (1+2)/(32+1)≈(1+2)/32.

    所以原式= (cnt+cnt<<2)>>5