当前位置:   article > 正文

开发板实战篇2 6位数码管静态显示_quartus2数码管静态显示设计实验代码

quartus2数码管静态显示设计实验代码

        与"开发板实战篇1 LED点灯(开篇)" 的区别,增加模式切换

 总结:

        模块例化思想: 定时器模块 + 点灯模块

        根据自己思路编写代码,调试仿真代码,同时熟悉环境.加深细节理解 

        segled_static_driver.v 实现不够简洁,感觉还可以优化,后面有思路再搞

      

注意:

        若进行了QuartusII_13.0 和 Notepad++软件的关联,在modelsim中无法双击打开.v文件,只能通过工具栏的open文件夹图标打开, 我的电脑会打开altium designer软件 ,取消关联可恢复正常

        每次打开modelsim时需要切换工作空间,否则可能创建工程添加的源码会是上一个仿真工程的代码,导致出错 

一. 实现的功能

        6位数码管以静态方式依次显示000000、 111111、222222至FFFFFF,结束后继续从000000开始计数,每1s变化一次。
 

二. 功能框图

        定时器模块:加计数器,计数到了产生overflow信号

        segled控制模块:根据en使能信号,点亮数码管

        打开方法:  tools -> netlist viewers -> rtl viewer

三. RTL代码

        segled_static_top.v

        与led_top.v基本相同。

        COUNT_OVERFLOW = 26'd50_000_000,即闪烁周期为1S。

  1. module segled_static_top (
  2. input clk,
  3. input reset,
  4. output [5:0] sel,
  5. output [7:0] seg_led
  6. );
  7. parameter COUNT_OVERFLOW = 26'd50_000_000;
  8. wire overflow; // 定时时间到
  9. timer #(
  10. .COUNT_OVERFLOW (COUNT_OVERFLOW)
  11. )
  12. u_timer(
  13. .clk (clk),
  14. .reset (reset),
  15. .overflow (overflow)
  16. );
  17. segled_static_driver u_segled_static_driver(clk,reset,overflow,sel,seg_led);
  18. endmodule

        timer.v

        除将overflow <=修改为非阻塞赋值外,其它与led点灯工程的相同。

  1. /*
  2. ********************************************************************************
  3. *Copyright ©, 2018, CunXin_ All Rights Reserved
  4. *文 件 名: key_led.v
  5. *说 明:
  6. 程序功能无按键按下时, LED灯全灭;
  7. 按键1按下时, LED灯显示自右向左的流水效果;
  8. 按键2按下时, LED灯显示自左向右的流水效果;
  9. 按键3按下时,四个LED灯同时闪烁;
  10. 按键4按下时, LED灯全亮
  11. *版 本: V000B00D00
  12. *创建日期: 2018年4月3日 下午12:16:49
  13. *创 建 人: wansaiyon
  14. *修改信息:
  15. ================================================================================
  16. *修 改 人 修改日期 修改内容
  17. *<作者/修改者> <YYYY/MM/DD> <修改内容>
  18. ********************************************************************************
  19. */
  20. module timer #(
  21. parameter COUNT_OVERFLOW = 26'd10_000_000
  22. ) (
  23. input clk,
  24. input reset,
  25. output reg overflow
  26. );
  27. localparam period = COUNT_OVERFLOW;
  28. reg [25:0] cnt;
  29. always @(posedge clk,negedge reset) begin
  30. if(!reset) begin
  31. cnt <= 26'd0;
  32. overflow <= 1'b0;
  33. end
  34. else if(cnt < period) begin
  35. cnt <= cnt + 1'd1;
  36. overflow <= 1'b0;
  37. end
  38. else begin
  39. cnt <= 26'd0;
  40. overflow <= 1'b1;
  41. end
  42. end
  43. endmodule

        segled_static_driver.v

        主要功能:定义16个字符、显示字符状态切换、、seg_led显示输出。

  1. /*
  2. 6位数码管
  3. sel[0] output N16 第一个数码管位选信号
  4. sel[1] output N15 第二个数码管位选信号
  5. sel[2] output P16 第三个数码管位选信号
  6. sel[3] output P15 第四个数码管位选信号
  7. sel[4] output R16 第五个数码管位选信号
  8. sel[5] output T15 第六个数码管位选信号
  9. seg_led[0] output M11 数码管段选a
  10. seg_led[1] output N12 数码管段选b
  11. seg_led[2] output C9 数码管段选c
  12. seg_led[3] output N13 数码管段选d
  13. seg_led[4] output M10 数码管段选e
  14. seg_led[5] output N11 数码管段选f
  15. seg_led[6] output P11 数码管段选g
  16. seg_led[7] output D9 数码管段选h
  17. */
  18. module segled_static_driver (
  19. input clk,
  20. input reset,
  21. input en,
  22. output reg [5:0] sel,
  23. output reg [7:0] seg_led
  24. );
  25. // param define
  26. localparam CHAR_0 = 8'b0100_0000;
  27. localparam CHAR_1 = 8'b0111_1001;
  28. localparam CHAR_2 = 8'b0010_0100;
  29. localparam CHAR_3 = 8'b0011_0000;
  30. localparam CHAR_4 = 8'b0001_1001;
  31. localparam CHAR_5 = 8'b0001_0010;
  32. localparam CHAR_6 = 8'b0000_0010;
  33. localparam CHAR_7 = 8'b0111_1000;
  34. localparam CHAR_8 = 8'b0000_0000;
  35. localparam CHAR_9 = 8'b0001_0000;
  36. localparam CHAR_a = 8'b0000_1000;
  37. localparam CHAR_b = 8'b0000_0011;
  38. localparam CHAR_c = 8'b0100_0110;
  39. localparam CHAR_d = 8'b0010_0001;
  40. localparam CHAR_e = 8'b0000_0110;
  41. localparam CHAR_f = 8'b0000_1110;
  42. //reg define
  43. reg [3:0] segled_ctrl;
  44. // 显示状态切换
  45. always @(posedge clk,negedge reset ) begin
  46. if(!reset) begin
  47. segled_ctrl <= 4'b0000;
  48. end
  49. else if(en) begin
  50. segled_ctrl <= segled_ctrl + 1'b1;
  51. end
  52. else begin
  53. segled_ctrl <= segled_ctrl;
  54. end
  55. end
  56. // seg_led 输出显示
  57. always @(posedge clk ,negedge reset) begin
  58. if(!reset) begin
  59. sel <= 6'b00_0000;
  60. seg_led <= CHAR_8;
  61. end
  62. else if(en) begin
  63. sel <= 6'b00_0000;
  64. casex (segled_ctrl)
  65. 4'b0000: begin
  66. seg_led <= CHAR_0;
  67. end
  68. 4'b0001: begin
  69. seg_led <= CHAR_1;
  70. end
  71. 4'b0010: begin
  72. seg_led <= CHAR_2;
  73. end
  74. 4'b0011: begin
  75. seg_led <= CHAR_3;
  76. end
  77. 4'b0100: begin
  78. seg_led <= CHAR_4;
  79. end
  80. 4'b0101: begin
  81. seg_led <= CHAR_5;
  82. end
  83. 4'b0110: begin
  84. seg_led <= CHAR_6;
  85. end
  86. 4'b0111: begin
  87. seg_led <= CHAR_7;
  88. end
  89. 4'b1000: begin
  90. seg_led <= CHAR_8;
  91. end
  92. 4'b1001: begin
  93. seg_led <= CHAR_9;
  94. end
  95. 4'b1010: begin
  96. seg_led <= CHAR_a;
  97. end
  98. 4'b1011: begin
  99. seg_led <= CHAR_b;
  100. end
  101. 4'b1100: begin
  102. seg_led <= CHAR_c;
  103. end
  104. 4'b1101: begin
  105. seg_led <= CHAR_d;
  106. end
  107. 4'b1110: begin
  108. seg_led <= CHAR_e;
  109. end
  110. 4'b1111: begin
  111. seg_led <= CHAR_f;
  112. end
  113. default: begin
  114. seg_led <= CHAR_0;
  115. end
  116. endcase
  117. end
  118. else begin
  119. sel <= 6'b00_0000;
  120. seg_led <= seg_led;
  121. end
  122. end
  123. endmodule

四.modelsim前仿真(功能仿真)

        每次打开modelsim时需要切换工作空间,否则可能创建工程添加的源码会是上一个仿真工程的代码,导致出错 。

        使用vscode打开segled_static_top.v, ctrl+shift+p,输入testbench,在terminal生成了segled_static_top_tb.v代码,需要安装插件verilog_testbench, 初始生成时可能提示失败,需要安装 python 库(根据错误提示自行百度)。

        生成的代码有点错误,需要自己再做点修改。

        segled_static_top_tb.v,

        为了方便减小了计数器周期为26'd10。

  1. `timescale 1ns / 1ns
  2. module tb_segled_static_top;
  3. // segled_static_top Parameters
  4. parameter PERIOD = 10 ;
  5. parameter COUNT_OVERFLOW = 26'd10;
  6. // segled_static_top Inputs
  7. reg clk = 0 ;
  8. reg reset = 0 ;
  9. // segled_static_top Outputs
  10. wire [5:0] sel ;
  11. wire [7:0] seg_led ;
  12. initial
  13. begin
  14. forever #(PERIOD/2) clk=~clk;
  15. end
  16. initial
  17. begin
  18. #(PERIOD*2) reset = 1;
  19. end
  20. segled_static_top #(
  21. .COUNT_OVERFLOW ( COUNT_OVERFLOW ))
  22. u_segled_static_top (
  23. .clk ( clk ),
  24. .reset ( reset ),
  25. .sel ( sel [5:0] ),
  26. .seg_led ( seg_led [7:0] )
  27. );
  28. endmodule

        仿真波形

五.下载验证

        6位数码管以静态方式依次显示000000、 111111、222222至FFFFFF,结束后继续从000000开始计数,每1s变化一次。

        但是发现4个LED有微弱的亮度,需要配置好未使用管脚的状态为高阻输入,同时将nCEO管脚修改为Use as regular I/0,修改后LED变为熄灭状态了。

        在 Quartus 软件中默认未使用管脚的状态为弱上拉输入,所以未使用到的管脚上也是有电压的,只是驱动能力很弱,这往往会导致一些不安全的隐患,所以我们需要将未使用管脚的状态设置为三态输入。        

        在左侧Category一栏中选择Dual-Purpose Pin。对于需要使用EPCS器件的引脚时,需要将下图页面中所有的引脚都改成Use as regular IO,如果大家不确定工程中是否用到EPCS器件时,可以全部修改。本次实验只修改了nCEO一栏中, 将Use as programming pin修改为Use as regular I/0。

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

闽ICP备14008679号