当前位置:   article > 正文

通过verilog实现模可变计数器的设计_数码管显示bcd码六十进制计数器verilog

数码管显示bcd码六十进制计数器verilog

实验要求:

        

(一)实验目的

(1)掌握组合逻辑电路和时序电路的 FPGA实现方法;

(2)熟悉EDA开发板和开发软件的使用方法;

(3)学习静态数码管的使用和7段数码显示译码器设计;

(4)掌握时钟在时序电路中的作用;

(5)掌握分频电路的实现方法。

(二)实验要求

设计BCD计数器,可任选模的大小(最大模值至少3位),实验要求:

(1)计数结果用3位数码管显示,显示BCD码;

(2)给出此项设计的仿真波形;

(3)选择实验电路验证此计数器的功能。

(4)设计模值可变的输入端口,通过输入模值和设置信号改变计数器模值

(5)设置涉及1个开关和一个按键,开关作为使能控制,按键作为异步清0。(6)带有进位输出,并进位输出用LED灯显示

        波形仿真应能观察到复位、使能、模值进位输出、设置模值。

        在实验室用开发板下载测试,下载测试现象与仿真相吻合。

        按键能复位,使能无效时计数暂停,能切换模值。

        为缩短仿真时间,仿真和下载测试时对50MHz系统时钟的分频系数可不同。

使用vivado软件

可实现0-1024任意模

代码如下

  1. //源文件
  2. module CNT(
  3. input CLK, // 时钟输入
  4. input SW1, // 开关输入,用于计数器使能控制
  5. input KEY1, // 按键输入,用于计数器异步清零
  6. input [9:0] M_SET, // 模数设置输入
  7. output reg [9:0] cnt_count,
  8. output reg [10:0] display_segout,
  9. output reg LED_OUT //输出,用于显示进位状态
  10. );
  11. reg [6:0] BCD_OUT0; // BCD计数结果输出
  12. reg [6:0] BCD_OUT1; // BCD计数结果输出
  13. reg [6:0] BCD_OUT2; // BCD计数结果输出
  14. wire [9:0] M; // 计数器模数
  15. wire [3:0] bw;
  16. wire [3:0] sw;
  17. wire [3:0] gw;
  18. assign M[0]=M_SET[0];
  19. assign M[1]=M_SET[1];
  20. assign M[2]=M_SET[2];
  21. assign M[3]=M_SET[3];
  22. assign M[4]=M_SET[4];
  23. assign M[5]=M_SET[5];
  24. assign M[6]=M_SET[6];
  25. assign M[7]=M_SET[7];
  26. assign M[8]=M_SET[8];
  27. assign M[9]=M_SET[9];
  28. reg [19:0]count=0;
  29. reg [30:0]count2=0;
  30. reg [2:0] sel=0;
  31. parameter T1MS=50000;
  32. //多位数码管显示
  33. always@(posedge CLK)
  34. begin
  35. count<=count+1;
  36. if(count==T1MS)
  37. begin
  38. count<=0;
  39. sel<=sel+1;
  40. if(sel==3)
  41. sel<=0;
  42. end
  43. end
  44. 仿真
  45. //wire clk1;
  46. //assign clk1=CLK;
  47. //板子计数频率
  48. reg clk1;
  49. always @(posedge CLK)
  50. begin count2=count2+1;
  51. if(count2/10000000%2==1) begin clk1=1'b1; count2=0;end
  52. else clk1=1'b0;
  53. end
  54. 板子数码管显示
  55. always@(posedge CLK)
  56. begin
  57. case(sel)
  58. 0:display_segout<={4'b0111,BCD_OUT0};
  59. 1:display_segout<={4'b1011,BCD_OUT1};
  60. 2:display_segout<={4'b1101,BCD_OUT2};
  61. default:display_segout<=11'b1111_1111111;
  62. endcase
  63. end
  64. //计数器逻辑
  65. always @(negedge clk1 or posedge KEY1)
  66. begin
  67. if(KEY1 == 1'b0) // 异步清零
  68. cnt_count <= 10'd0;
  69. else if(SW1 == 1'b1) // 使能控制
  70. begin
  71. if(cnt_count<M)
  72. begin
  73. cnt_count<=cnt_count+10'd1;
  74. LED_OUT<=1'b0;
  75. end
  76. else
  77. begin
  78. cnt_count<=10'd0;
  79. LED_OUT<=1'b1;
  80. end
  81. end
  82. end
  83. assign bw =cnt_count/100;
  84. assign sw =cnt_count%100/10;
  85. assign gw =cnt_count%10;
  86. always @(posedge clk1 or negedge KEY1)
  87. begin
  88. if(!KEY1)
  89. begin
  90. BCD_OUT0<=7'b0000001;
  91. BCD_OUT1<=7'b0000001;
  92. BCD_OUT2<=7'b0000001;
  93. end
  94. else
  95. begin
  96. case (gw)
  97. 0:BCD_OUT0<=7'b0000001; 1:BCD_OUT0<=7'b1001111;
  98. 2:BCD_OUT0<=7'b0010010; 3:BCD_OUT0<=7'b0000110;
  99. 4:BCD_OUT0<=7'b1001100; 5:BCD_OUT0<=7'b0100100;
  100. 6:BCD_OUT0<=7'b0100000; 7:BCD_OUT0<=7'b0001111;
  101. 8:BCD_OUT0<=7'b0000000; 9:BCD_OUT0<=7'b0000100;
  102. default: BCD_OUT0<=7'b0000001;
  103. endcase
  104. case (sw)
  105. 0:BCD_OUT1<=7'b0000001; 1:BCD_OUT1<=7'b1001111;
  106. 2:BCD_OUT1<=7'b0010010; 3:BCD_OUT1<=7'b0000110;
  107. 4:BCD_OUT1<=7'b1001100; 5:BCD_OUT1<=7'b0100100;
  108. 6:BCD_OUT1<=7'b0100000; 7:BCD_OUT1<=7'b0001111;
  109. 8:BCD_OUT1<=7'b0000000; 9:BCD_OUT1<=7'b0000100;
  110. default: BCD_OUT1<=7'b0000001;
  111. endcase
  112. case (bw)
  113. 0:BCD_OUT2<=7'b0000001; 1:BCD_OUT2<=7'b1001111;
  114. 2:BCD_OUT2<=7'b0010010; 3:BCD_OUT2<=7'b0000110;
  115. 4:BCD_OUT2<=7'b1001100; 5:BCD_OUT2<=7'b0100100;
  116. 6:BCD_OUT2<=7'b0100000; 7:BCD_OUT2<=7'b0001111;
  117. 8:BCD_OUT2<=7'b0000000; 9:BCD_OUT2<=7'b0000100;
  118. default : BCD_OUT2<=7'b0000001;
  119. endcase
  120. end
  121. end
  122. endmodule

  1. //仿真文件
  2. `timescale 1ns / 1ps
  3. //
  4. // Company:
  5. // Engineer:
  6. //
  7. // Create Date: 2023/03/16 21:54:56
  8. // Design Name:
  9. // Module Name: sim_CNT
  10. // Project Name:
  11. // Target Devices:
  12. // Tool Versions:
  13. // Description:
  14. //
  15. // Dependencies:
  16. //
  17. // Revision:
  18. // Revision 0.01 - File Created
  19. // Additional Comments:
  20. //
  21. //
  22. `timescale 1ns/1ps
  23. module sim_CNT();
  24. reg SW1,KEY1;
  25. reg [9:0]M_SET;
  26. wire [9:0] cnt_count;
  27. wire [10:0] display_segout;
  28. wire LED_OUT;
  29. reg clk1;
  30. initial
  31. begin
  32. clk1= 1'b0;
  33. SW1 = 1'b0;
  34. #2 KEY1 = 1'b1;
  35. M_SET =10'b0000001111;
  36. #2 KEY1 = 1'b0;
  37. #2 KEY1 = 1'b1; SW1 = 1'b1; //计数使能信号有效,且不复位
  38. end
  39. always
  40. begin
  41. #10 clk1 = ~clk1;
  42. end
  43. CNT uu1(clk1,SW1,KEY1,M_SET,cnt_count,display_segout,LED_OUT);
  44. endmodule

前任栽树,后人乘凉,希望你们不要简单的cv喔大家有什么问题可以私聊我哦。

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

闽ICP备14008679号