@(verilog)
问题:输入一个16bit的数,现在要求它除以3得到的商和余数,如何优化?
来源:@笑着刻印在那一张泛黄 提供,面试真题。
一开始联想到之前写过的另一篇博文序列模三检测器,但是这只能解决余数的问题,没法得到
后面的想法是直接使用任意整数除法器来实现,由于除数是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.最后得到商和余数,余数就是计数器结束时的状态表示的二进制数。
原文:https://www.cnblogs.com/lyc-seu/p/12917765.html