EETOP 创芯网论坛 (原名:电子顶级开发网)

标题: 判断一个数能否被3整除的电路(附Verilog代码) [打印本页]

作者: guoyu    时间: 2010-9-30 09:41
标题: 判断一个数能否被3整除的电路(附Verilog代码)
本帖最后由 guoyu 于 2010-10-1 11:27 编辑

Well, it generates a circuit detecting if the input (unsigned 8bit number range [0,255])
can be divided by 3 (can be easily modified to 5,7,etc.) evenly.
If yes, a flag (1 clk cycle) will appear.
   
Of course one can use modulo ('%' in verilog) to implement the function,
but the cost may be higher.
   
Consider A = 4'b1011, which is 11 in decimal, let's do this:
X[0] == 2^0 = 1; 1%3 = 1; so there is a 1.
X[1] == 2^1 = 2; 2%3 = 2; so there is a 2.
X[2] == 2^2 = 4; 4%3 = 1; so there is a 1.
X[3] == 2^3 = 8; 8%3 = 2; so there is a 2.
   
Let's add the due remainders up, which is
A[0]*X[0] + A[1]*X[1] + A[2]*X[2] + A[3]*X[3] = 5,
and 5 is not a multiple of 3.
   
Try 4'b0011 or 4'b1111, you will see it.
   
If you have a better solution (in terms of RTL implementation), do tell me!
I hereby thank you in advance.
   
Guo Yu





  1. module div3
  2. ( input clk,
  3. input rst_n,
  4. input [7:0] data,
  5. output reg flag
  6. );

  7. reg [3:0] sum;

  8. integer i;

  9. always @ *
  10. begin
  11. sum = 0;
  12. for (i=0;i<8;i=i+1)
  13. begin
  14. if (i==0 || i==2 || i==4 || i==6 )
  15. sum = (data[i]) ? sum + 1 : sum;
  16. else
  17. sum = (data[i]) ? sum + 2 : sum;
  18. end
  19. end

  20. always @ (posedge clk, negedge rst_n)
  21. begin
  22. if (!rst_n)
  23. flag <= 1'b0;
  24. else if (sum ==0 || sum ==3 || sum==6 || sum==9 || sum==12)
  25. flag <= 1'b1;
  26. else
  27. flag <= 1'b0;
  28. end

  29. endmodule;


复制代码

源码和Testbench:
(, 下载次数: 30 )
作者: wushiqiang    时间: 2010-9-30 11:23
有没有时序输入每比特判断的例子。
作者: guoyu    时间: 2010-9-30 11:31
回复 2# wushiqiang


    加个移位寄存器吧。把串行的数据转换成并行再比较。可以参考网上的一片不错的帖子:http://www.cnblogs.com/oomusou/archive/2009/10/24/p2s_s2p.html
作者: wjdz    时间: 2010-9-30 11:33
My stduy is just at the beginning, and study hard to know the Verilog language
作者: guoyu    时间: 2010-9-30 11:35
回复 4# wjdz


    Just work hard on it. You will find it is very useful.
作者: guoyu    时间: 2010-10-1 11:27
增加了Testbench.
作者: zhang2000    时间: 2010-10-1 21:00
给你改进一下,每两个bit  进行组合译码
X[7] X[6] 分成一组
X[5] X[4] 分成一组
X[3] X[2] 分成一组
X[1] X[0] 分成一组


如下  真值表  
X[2*n+1]    X[2*n]         OUTn(两bit)
    0              0               0
      0              1               1
      1              0               2
      1              1               0

然后  OUT0 + OUT1 + OUT2 + OUT3得出结果,再按同样算法来一遍



四位组合应该能比两位组合要优化一些
作者: wushiqiang    时间: 2011-5-18 21:55
很好 下来学习一下
作者: 北极鸟    时间: 2011-6-2 00:55
学习一下.....
作者: haonan    时间: 2011-6-10 19:55
好东西,谢谢
作者: daboboxiao    时间: 2012-3-6 12:01
感谢楼主的分享~~~
作者: rocsman    时间: 2012-3-6 21:25
dfsgf
作者: chen470698    时间: 2014-12-10 17:20
看看学习




欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/) Powered by Discuz! X3.4