在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 15714|回复: 12

[原创] 判断一个数能否被3整除的电路(附Verilog代码)

[复制链接]
发表于 2010-9-30 09:41:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 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:
div3.rar (1.29 KB, 下载次数: 30 )
发表于 2010-9-30 11:23:46 | 显示全部楼层
有没有时序输入每比特判断的例子。
 楼主| 发表于 2010-9-30 11:31:41 | 显示全部楼层
回复 2# wushiqiang


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


    Just work hard on it. You will find it is very useful.
 楼主| 发表于 2010-10-1 11:27:43 | 显示全部楼层
增加了Testbench.
发表于 2010-10-1 21:00:58 | 显示全部楼层
给你改进一下,每两个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得出结果,再按同样算法来一遍



四位组合应该能比两位组合要优化一些
发表于 2011-5-18 21:55:50 | 显示全部楼层
很好 下来学习一下
发表于 2011-6-2 00:55:52 | 显示全部楼层
学习一下.....
发表于 2011-6-10 19:55:19 | 显示全部楼层
好东西,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-28 21:52 , Processed in 0.027985 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表