Verilog -- 任意整数除以三求商和余数

Verilog -- 任意整数除以三求商和余数

@(verilog)

1. 问题简介

问题:输入一个16bit的数,现在要求它除以3得到的商和余数,如何优化?

来源:@笑着刻印在那一张泛黄 提供,面试真题。

2. 思路

一开始联想到之前写过的另一篇博文序列模三检测器,但是这只能解决余数的问题,没法得到

后面的想法是直接使用任意整数除法器来实现,由于除数是3,比较特殊,实际上除3只需要考虑三个序列,也就是11,100,101。因为在手算除三的过程中,如果用二进制算,从高位依次往低位计算,就可以发现这一规律,例如:

     0 0 1 1 0 0 1 1 0  (7d'102)
    ------------------
11 | 1 0 0 1 1 0 1 0 0  (8d'308)
       1 1
     --------
         1 1
         1 1
    ----------------
           0 1 0 1
               1 1
          -----------
               1 0 0
                 1 1
           ----------
                   1 0  (余数)
 

整理一下,就是说把被除数从高位到低位排列,从前到后依次找11,100,101这三个序列,遇到这三中序列商就写1,否则商就写0,并且写完后左移一位。做完之后移除这个序列。不同的是遇到11,不做其他操作,遇到100,将3'b100-2'b11=1'b1 插入原序列最高位;遇到101则插入2'b10。

如果写成状态机,则可列出状态转移表:

State\Input 0 1
0 0/+0 1/+0
1 10/+0 0/+1
10 1/+1 10/+1

表中的值表示next_state/商操作,其中商操作+1就表示商序列加入一个1,+0就表示加入一个0.
此外,需要一个计数器来控制状态转移次数,即为被除数的位宽-1.最后得到商和余数,余数就是计数器结束时的状态表示的二进制数

猜你喜欢

转载自www.cnblogs.com/lyc-seu/p/12917765.html