当前位置:   article > 正文

FPGA之静态数码管显示实验_微机静态数码管实验报告

微机静态数码管实验报告

一、背景介绍

  •       数码管是一种现代常用的数码显示器件,具有发光显示清晰,响应速度快,功耗低 、体积小、寿命长、易于控制等诸多优点,在数显仪器仪表、数字控制设备等方面得到广泛应用。
  •       按发光二极管单元连接方式可分为共阳极数码管共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。通常我们用的数码管都是段选公用的,位选独立的,例如四位一体数码管。

   

 

  • 数码管的内部原理图如下图所示:

二、实验过程

  • 实验任务:
    • 本节实验任务是使用FPGA开发板上的6位数码管以静态方式依次显示000000、111111、222222至FFFFFF,结束后继续从000000开始计数,每0.5s变化一次。
  • 硬件原理图
  • 硬件接口定义

  • 程序框图
  •  seg_led_static_top 

  • 主要分为两个模块
    • 计时模块 (time_count):实现0.5s的计时效果
    • 数码管静态显示模块(seg_led_static):通过状态机实现不同状态下的显示配置,数码管静态显示模块在数码管上以静态方式显示数值。
  • 代码如下:
  1. module seg_led_static_top(
  2. input sys_clk,
  3. input sys_rst_n,
  4. output [5:0] seg_wei,
  5. output [7:0] seg_duan
  6. );
  7. wire time_flag;
  8. //wire clk;
  9. time_count u_time_count(
  10. .sys_clk (sys_clk),
  11. .sys_rst_n (sys_rst_n),
  12. .time_flag (time_flag)
  13. );
  14. seg_led_static u_seg_led_static(
  15. .sys_clk (sys_clk),
  16. .sys_rst_n (sys_rst_n),
  17. .time_flag (time_flag),
  18. .seg_wei (seg_wei),
  19. .seg_duan (seg_duan)
  20. );
  21. endmodule

 

 

  1. module time_count(
  2. input sys_clk,
  3. input sys_rst_n,
  4. output reg time_flag
  5. );
  6. reg [24:0] time_num;
  7. always @(posedge sys_clk or negedge sys_rst_n)begin
  8. if(!sys_rst_n)
  9. begin
  10. time_num<=25'd0;
  11. time_flag<=1'b0;
  12. end
  13. else begin
  14. if(time_num<25'd25_000_000)begin
  15. time_num<=time_num+1'b1;
  16. time_flag<=1'b0;
  17. end
  18. else
  19. begin
  20. time_num<=25'd1;
  21. time_flag<=1'b1;
  22. end
  23. end
  24. end
  25. endmodule

 

 

  1. module seg_led_static(
  2. input sys_clk,
  3. input sys_rst_n,
  4. input time_flag,
  5. output reg [5:0] seg_wei,
  6. output reg [7:0] seg_duan
  7. );
  8. reg [3:0] seg_fsm;
  9. always @(posedge sys_clk or negedge sys_rst_n)begin
  10. if(!sys_rst_n)
  11. seg_fsm<=4'd0;
  12. else if(time_flag)
  13. begin
  14. seg_fsm<=seg_fsm+1'b1;
  15. end
  16. else
  17. seg_fsm<=seg_fsm;
  18. end
  19. always @(posedge sys_clk or negedge sys_rst_n)begin
  20. if(!sys_rst_n)
  21. begin
  22. seg_wei <=6'b000000; //低电平点亮数码管
  23. seg_duan <=8'b00000000;
  24. end
  25. else
  26. case(seg_fsm) //共阳数码管
  27. /* 4'b0000: seg_duan <=8'b1100_0000; //0
  28. 4'b0001: seg_duan <=8'b1111_1001; //1
  29. 4'b0010: seg_duan <=8'b0100_1111;
  30. 4'b0011: seg_duan <=8'b0000_0000;
  31. 4'b0100: seg_duan <=8'b0000_0000;
  32. 4'b0101: seg_duan <=8'b0000_0000;
  33. 4'b0110: seg_duan <=8'b0000_0000;
  34. 4'b0111: seg_duan <=8'b0000_0000;
  35. 4'b1000: seg_duan <=8'b0000_0000;
  36. 4'b1001: seg_duan <=8'b0000_0000;
  37. 4'b1010: seg_duan <=8'b0000_0000;
  38. 4'b1011: seg_duan <=8'b0000_0000;
  39. 4'b1100: seg_duan <=8'b0000_0000;
  40. 4'b1101: seg_duan <=8'b0000_0000;
  41. 4'b1110: seg_duan <=8'b0000_0000;
  42. 4'b1111: seg_duan <=8'b00000000;
  43. */
  44. 4'h0 : seg_duan <= 8'b1100_0000;
  45. 4'h1 : seg_duan <= 8'b1111_1001;
  46. 4'h2 : seg_duan <= 8'b1010_0100;
  47. 4'h3 : seg_duan <= 8'b1011_0000;
  48. 4'h4 : seg_duan <= 8'b1001_1001;
  49. 4'h5 : seg_duan <= 8'b1001_0010;
  50. 4'h6 : seg_duan <= 8'b1000_0010;
  51. 4'h7 : seg_duan <= 8'b1111_1000;
  52. 4'h8 : seg_duan <= 8'b1000_0000;
  53. 4'h9 : seg_duan <= 8'b1001_0000;
  54. 4'ha : seg_duan <= 8'b1000_1000;
  55. 4'hb : seg_duan <= 8'b1000_0011;
  56. 4'hc : seg_duan <= 8'b1100_0110;
  57. 4'hd : seg_duan <= 8'b1010_0001;
  58. 4'he : seg_duan <= 8'b1000_0110;
  59. 4'hf : seg_duan <= 8'b1000_1110;
  60. default : seg_duan <= 8'b1100_0000;
  61. endcase
  62. end
  63. endmodule

仿真结果如下图:

 

最终实现实验任务!

(PS:调试中 顶层时钟不要连接同一个模块的两个端口  sys_clk  造成实验问题)

 

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

闽ICP备14008679号