当前位置:   article > 正文

Verilog实现的数字钟_使用verilog hdl设计一个简易数字钟,能显示小时、分钟、秒,并将结果在6个数码管上

使用verilog hdl设计一个简易数字钟,能显示小时、分钟、秒,并将结果在6个数码管上

一、总体方案      

          给出一个基本内容的实现方案,大家具体分析一下。留下不完善的地方待大家发现修改。

        该方案选择动态扫描方式,扫描频率100hz,由系统提供的10MHz分频得到。同时系统时钟分频得到计数器需要的1hz的时钟。秒、分钟使用十进制的60进制和小时的24进制。显示部分有6个LED数码管,由于采用动态扫描方式显示,每一个时刻只有一组数据送到一个LED上显示,其他的数码管时不显示的,只要扫描频率大于人眼余晖时间(24HZ以上),我们看到的就是六个稳定显示的数据。Seltime模块实现六组数据的分时输出。Deled实现七段码译码功能,74138实现六个数码管的分时显示控制(留给大家任务,改成Verilog代码实现相同的功能)。

其他功能,如整点报警,调节时间等,自己扩展。

仿真过程大家自行进行。

二、部分参考程序如下:

秒模块参考程序:

  1. module SECOND(
  2. input clk, clr,
  3. output [7:0] second,
  4. output reg co
  5. );
  6. reg [7:0] cnt;
  7. always @(posedge clk)
  8. begin
  9. if (clr)
  10. begin
  11. cnt<= 8'b00000000;
  12. co <= 1;
  13. end
  14. else if (cnt[7:4] == 4'b0101 && cnt[3:0] == 4'b1001) //计数达到59时,输出清零
  15. begin
  16. co <= 0;
  17. cnt<= 8'b00000000;
  18. end
  19. else if(cnt[3:0] == 4'b1001) //低位达到9时,低位清零,高位加1
  20. begin
  21. cnt[3:0] <= 4'b0000;
  22. cnt[7:4] <= cnt[7:4] + 1'b1;
  23. end
  24. else
  25. begin
  26. cnt[3:0] <= cnt[3:0] + 1'b1;
  27. co <= 1;
  28. end
  29. end
  30. assign second = cnt;
  31. endmodule

小时模块参考程序:

  1. //8421BCD码计数器,模24
  2. module hour(clk,rst,dout);
  3. input clk, rst;
  4. output[7:0] dout;
  5. reg[7:0] dout;
  6. always@(posedge clk)
  7. begin
  8. if(rst) //复位信号有效时,置位
  9. dout <= 8'b00000000;
  10. else if( (dout[7:4] == 4'b0010)&&(dout[3:0] == 4'b0011) ) //计数达到23时,输出清零
  11. dout <= 8'b00000000;
  12. else if(dout[3:0] == 4'b1001) //低位达到9时,低位清零,高位加1
  13. begin
  14. dout[3:0] <= 4'b0000;
  15. dout[7:4] <= dout[7:4] + 1'b1;
  16. end
  17. else
  18. dout[3:0] <= dout[3:0] + 1'b1;
  19. end
  20. endmodule

分频模块:

  1. module dfre(clk10MHz,clk1hz);
  2. input clk10MHz;
  3. output reg clk1hz;
  4. reg[23:0] q;
  5. always@(posedge clk10MHz)
  6. begin
  7. if (q==5000000)
  8. begin
  9. q<=0;
  10. clk1hz=~clk1hz;
  11. end
  12. else q<=q+1;
  13. end
  14. endmodule

动态扫描数据分时输出模块:

  1. // 动态扫描控制电路
  2. module seltime(
  3. input ckdsp,
  4. input reset,
  5. input [7:0] second,
  6. input [7:0] minute,
  7. input [7:0] hour,
  8. output reg [3:0] daout,
  9. output [2:0] sel
  10. );
  11. reg [2:0] sec;
  12. always @(posedge ckdsp)
  13. begin
  14. if (reset == 1'b0)
  15. sec <= 3'b000;
  16. else if (sec == 3'b101)
  17. sec <= 3'b000;
  18. else
  19. sec <= sec + 1;
  20. end
  21. always @(sec or second or minute or hour)
  22. begin
  23. case (sec)
  24. 3'b000: daout <= second[3:0];
  25. 3'b001: daout <= second[7:4];
  26. 3'b010: daout <= minute[3:0];
  27. 3'b011: daout <= minute[7:4];
  28. 3'b100: daout <= hour[3:0];
  29. 3'b101: daout <= hour[7:4];
  30. default: daout <= 4'bXXXX;
  31. endcase
  32. end
  33. assign sel = sec;
  34. endmodule

七段码译码器模块:

  1. //七段码译码器
  2. module DELED(
  3. input [3:0] S,
  4. output A, B, C, D, E, F, G, H
  5. );
  6. reg [3:0] DATA;
  7. reg [7:0] DOUT;
  8. always @(S) begin
  9. case (S)
  10. ///以下是驱动共阳极数码管 hgfedcba
  11. 4'b0000: DOUT <= 8'b11000000; //显示0
  12. 4'b0000: DOUT <= 8'b11111001; //显示1
  13. 4'b0000: DOUT <= 8'b10100100; //显示2
  14. 4'b0000: DOUT <= 8'b10110000; //显示3
  15. 4'b0000: DOUT <= 8'b10011001; //显示4
  16. 4'b0000: DOUT <= 8'b10010010; //显示5
  17. 4'b0000: DOUT <= 8'b10000010; //显示6
  18. 4'b0000: DOUT <= 8'b11111000; //显示7
  19. 4'b0000: DOUT <= 8'b10000000; //显示8
  20. 4'b0000: DOUT <= 8'b10010000; //显示9
  21. 4'b0000: DOUT <= 8'b10001000; //显示a
  22. 4'b0000: DOUT <= 8'b10000011; //显示b
  23. 4'b0000: DOUT <= 8'b11000110; //显示c
  24. 4'b0000: DOUT <= 8'b10100001; //显示d
  25. 4'b0000: DOUT <= 8'b10000110; //显示e
  26. 4'b0000: DOUT <= 8'b10001110; //显示f
  27. default: DOUT <= 8'b11111111;
  28. ///以下是驱动共阴极数码管
  29. /// 4'b0000: DOUT <= 8'b00111111;
  30. /// 4'b0001: DOUT <= 8'b00000110;
  31. /// 4'b0010: DOUT <= 8'b01011011;
  32. /// 4'b0011: DOUT <= 8'b01001111;
  33. /// 4'b0100: DOUT <= 8'b01100110;
  34. /// 4'b0101: DOUT <= 8'b01101101;
  35. /// 4'b0110: DOUT <= 8'b01111101;
  36. /// 4'b0111: DOUT <= 8'b00000111;
  37. /// 4'b1000: DOUT <= 8'b01111111;
  38. /// 4'b1001: DOUT <= 8'b01101111;
  39. /// 4'b1010: DOUT <= 8'b01110111;
  40. /// 4'b1011: DOUT <= 8'b01111100;
  41. /// 4'b1100: DOUT <= 8'b00111001;
  42. /// 4'b1101: DOUT <= 8'b01011110;
  43. /// 4'b1110: DOUT <= 8'b01111001;
  44. /// 4'b1111: DOUT <= 8'b01110001;
  45. /// default: DOUT <= 8'b00000000;
  46. endcase
  47. end
  48. assign H = DOUT[7];
  49. assign G = DOUT[6];
  50. assign F = DOUT[5];
  51. assign E = DOUT[4];
  52. assign D = DOUT[3];
  53. assign C = DOUT[2];
  54. assign B = DOUT[1];
  55. assign A = DOUT[0];
  56. endmodule

七段码显示器的基本资料:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/562091
推荐阅读
相关标签
  

闽ICP备14008679号