HDLBits 系列(18) BCD码计数器的设计

举报
李锐博恩 发表于 2021/07/15 01:58:17 2021/07/15
【摘要】 目录 原题复现 审题 我的设计 原题复现 先给出原题: Build a 4-digit BCD (binary-coded decimal) counter. Each decimal digit is encoded using 4 bits: q[3:0] is the ones digit, q[7:4] is the tens digit, etc. F...

目录

原题复现

审题

我的设计


原题复现

先给出原题:

Build a 4-digit BCD (binary-coded decimal) counter. Each decimal digit is encoded using 4 bits: q[3:0] is the ones digit, q[7:4] is the tens digit, etc. For digits [3:1], also output an enable signal indicating when each of the upper three digits should be incremented.

建立一个4位数的BCD(二进制编码的十进制)计数器。 每个十进制数字使用4位编码:q [3:0]是个位,q [7:4]是十位,依此类推。对于数字[3:1],还输出一个使能信号,指示每个高三位应递增。

也就是:

设计一个4位BCD(二进制编码十进制)计数器。每个十进制数字使用4-bit来表示:q[3:0]是个位,q[7:4]是十位等。对于ena[3:1],该信号用来表示个位、十位和百位的进位。

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);

时序图如下:


审题

我来解释下这个题目的意思,就是设计一个4位的十进制计数器,分别为个位,十位,百位,千位;

然后个位进位,十位进位,百位进位时,都输出一个使能信号。

通过例化一个4bit的BCD码计数器实现。

我的设计

既然如此,我们先设计一个4bit的BCD码计数器,一定要带有使能:


  
  1. module count4
  2. (
  3. input clk,
  4. input reset,
  5. input ena,
  6. output reg[3:0] q
  7. );
  8. always @ (posedge clk)
  9. begin
  10. if(reset)
  11. q <= 4'b0;
  12. else if (ena)
  13. begin
  14. if(q == 4'd9)
  15. q <= 4'd0;
  16. else
  17. q <= q + 1'b1;
  18. end
  19. end
  20. endmodule

之后通过例化这个4bit的BCD码计数器得到一个16bit的BCD码计数器:

个位永远使能,十位要等到个位计数到9之后使能,百位要等到个位和十位都等于9的时候使能,同理,千位要等到个位、十位、百位都等于9的时候使能。

于是得到如下设计:


  
  1. module top_module (
  2. input clk,
  3. input reset, // Synchronous active-high reset
  4. output [3:1] ena,
  5. output [15:0] q);
  6. wire en1, en2, en3, en4;
  7. assign en1 = 1;
  8. assign en2 = (q[3:0] == 4'd9);
  9. assign en3 = (q[7:4] == 4'd9 && q[3:0] == 4'd9);
  10. assign en4 = (q[11:8] == 4'd9 && q[7:4] == 4'd9 && q[3:0] == 4'd9);
  11. //one
  12. count4 inst1_count4
  13. (
  14. .clk(clk),
  15. .reset(reset),
  16. .ena(en1),
  17. .q(q[3:0])
  18. );
  19. //ten
  20. count4 inst2_count4
  21. (
  22. .clk(clk),
  23. .reset(reset),
  24. .ena(en2),
  25. .q(q[7:4])
  26. );
  27. //hundred
  28. count4 inst3_count4
  29. (
  30. .clk(clk),
  31. .reset(reset),
  32. .ena(en3),
  33. .q(q[11:8])
  34. );
  35. //thousand
  36. count4 inst4_count4
  37. (
  38. .clk(clk),
  39. .reset(reset),
  40. .ena(en4),
  41. .q(q[15:12])
  42. );
  43. //用来表示进位
  44. assign ena = {q[11:8] == 4'd9 && q[7:4] == 4'd9 && q[3:0] == 4'd9, q[7:4] == 4'd9 && q[3:0] == 4'd9, q[3:0] == 4'd9};
  45. endmodule

参考链接:Problem 104 4-digit decimal counter

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/103240708

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。