【FPGA实验】数码管静态显示

功能描述

控制六位数码管以0.5秒的频率同时显示0-F 16个数字。

分频模块

开发板本身的时钟频率为50kHz,对应时钟周期为20ns,而本实验需要0.5s让数字变化一次,因此需要对时钟进行分频,使其0.5s输出一个脉冲信号flag。

  1. module time_count(
  2. input clk , // 时钟信号
  3. input rst_n , // 复位信号
  4.  
  5. output reg flag // 一个时钟周期的脉冲信号
  6. );
  7.  
  8. //parameter define
  9. parameter MAX_NUM = 25000_000; // 计数器最大计数值
  10.  
  11. //reg define
  12. reg [24:0] cnt; // 时钟分频计数器
  13.  
  14. //*****************************************************
  15. //** main code
  16. //*****************************************************
  17.  
  18. //计数器对时钟计数,每计时到0.5s,输出一个时钟周期的脉冲信号
  19. always @ (posedge clk or negedge rst_n) begin
  20. if (!rst_n) begin
  21. flag <= 1'b0;
  22. cnt <= 24'b0;
  23. end
  24. else if(cnt < MAX_NUM - 1'b1) begin
  25. cnt <= cnt +1'b1;
  26. flag <= 1'b0;
  27. end
  28. else begin
  29. cnt <= 24'b0;
  30. flag <= 1'b1;

数码管静态显示模块

首先需清楚两个概念:
位选信号(sel)——控制哪个数码管显示
段选信号(seg_led)–控制数码管显示内容

数码管显示具体数值可参考真值表:

【FPGA实验】数码管静态显示 - 第1张

共阳极二极管,常理来说应当0才是点亮,而这里是相反的。

原因可以看下面的原理图,输入信号并不是给到二极管的负级,而是给到了三级管的基极,三极管在这里起到开关的作用,因此相反。

【FPGA实验】数码管静态显示 - 第2张

模块代码:

  1. module seg_led_static (
  2. input clk , // 时钟信号
  3. input rst_n , // 复位信号(低有效)
  4.  
  5. input add_flag, // 数码管变化的通知信号
  6. output reg [5:0] sel , // 数码管位选
  7. output reg [7:0] seg_led // 数码管段选
  8. );
  9.  
  10. //reg define
  11. reg [3:0] num; // 数码管显示的十六进制数
  12.  
  13. //*****************************************************
  14. //** main code
  15. //*****************************************************
  16.  
  17. //控制数码管位选信号(低电平有效),选中所有的数码管
  18. always @ (posedge clk or negedge rst_n) begin
  19. if (!rst_n)
  20. sel <= 6'b111111;
  21. else
  22. sel <= 6'b000000;
  23. end
  24.  
  25. //每次通知信号到达时,数码管显示的十六进制数值加1
  26. always @ (posedge clk or negedge rst_n) begin
  27. if (!rst_n)
  28. num <= 4'h0;
  29. else if(add_flag) begin
  30. if (num < 4'hf)
  31. num <= num + 1'b1;
  32. else
  33. num <= 4'h0;
  34. end
  35. else
  36. num <= num;
  37. end
  38.  
  39. //根据数码管显示的数值,控制段选信号
  40. always @ (posedge clk or negedge rst_n) begin
  41. if (!rst_n)
  42. seg_led <= 8'b0;
  43. else begin
  44. case (num)
  45. 4'h0 : seg_led <= 8'b1100_0000;
  46. 4'h1 : seg_led <= 8'b1111_1001;
  47. 4'h2 : seg_led <= 8'b1010_0100;
  48. 4'h3 : seg_led <= 8'b1011_0000;
  49. 4'h4 : seg_led <= 8'b1001_1001;
  50. 4'h5 : seg_led <= 8'b1001_0010;
  51. 4'h6 : seg_led <= 8'b1000_0010;
  52. 4'h7 : seg_led <= 8'b1111_1000;
  53. 4'h8 : seg_led <= 8'b1000_0000;
  54. 4'h9 : seg_led <= 8'b1001_0000;
  55. 4'ha : seg_led <= 8'b1000_1000;
  56. 4'hb : seg_led <= 8'b1000_0011;
  57. 4'hc : seg_led <= 8'b1100_0110;
  58. 4'hd : seg_led <= 8'b1010_0001;
  59. 4'he : seg_led <= 8'b1000_0110;
  60. 4'hf : seg_led <= 8'b1000_1110;
  61. default : seg_led <= 8'b1100_0000;

顶层模块

  1. module seg_led_static_top (
  2. input sys_clk , // 系统时钟
  3. input sys_rst_n, // 系统复位信号(低有效)
  4.  
  5. output [5:0] sel , // 数码管位选
  6. output [7:0] seg_led // 数码管段选
  7.  
  8. );
  9.  
  10. //parameter define
  11. parameter TIME_SHOW = 25'd25000_000; // 数码管变化的时间间隔0.5s
  12.  
  13. //wire define
  14. wire add_flag; // 数码管变化的通知信号
  15.  
  16. //*****************************************************
  17. //** main code
  18. //*****************************************************
  19.  
  20. //每隔0.5s产生一个时钟周期的脉冲信号
  21. time_count #(
  22. .MAX_NUM (TIME_SHOW)
  23. ) u_time_count(
  24. .clk (sys_clk ),
  25. .rst_n (sys_rst_n),
  26. .flag (add_flag )
  27. );
  28.  
  29. //每当脉冲信号到达时,使数码管显示的数值加1
  30. seg_led_static u_seg_led_static (
  31. .clk (sys_clk ),
  32. .rst_n (sys_rst_n),
  33.  
  34. .add_flag (add_flag ),
  35. .sel (sel ),
  36. .seg_led (seg_led )
  37. );

注:两个分模块之间通过add_flag进行连接。

管脚分配

【FPGA实验】数码管静态显示 - 第3张

本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/9555.html

"愿我的文字能带给您一丝美好"

还没有人赞赏,支持一下

评论

A 为本文作者,G 为游客总数:0
加载中…

提交评论

游客,您好,欢迎参与讨论。

我的购物车

购物车为空

优惠券

没有优惠券