当前位置:   article > 正文

FPGA开发——数码管的使用(二)

FPGA开发——数码管的使用(二)

一、概述

     在上一篇文章中我们针对单个数码管的静态显示和动态显示进行了一个设计和实现,这篇文章中我们针对多个数码管同时显示进行一个设计。这里和上一篇文章唯一不同的是就是数码管位选进行了一个改变,原来是单个数码管的显示,所以位选就直接赋值就可以了,但在本篇文章中一次性使用了多个数码管,所以在位选信号中我们就需要进行一个更改。

实验的重难点

在进行多位数码管的显示时,最大的难点就是怎样选择每个数码管的位选,以及每个数码管之间显示的时间间隔,这时本次设计中所设计的两个重难点,只要掌握着两个点,设计也就变得非常简单。

二、工程实现

1、设计文件的编写

       在针对上面的两个难点,我们在编写代码时拼接语法的方式实现位选的循环移动,将不同数码管显示的值使用位选变量作为条件写在一个case语句中,以实现我们预设的012345的字符显示。这里在对8段发光二极管显示字符进行设计时,我们和前一篇文章一样需要先确认时共阴极还是共阳极(这里使用的是共阳极),如果时共阴极就是高电平驱动,反之,就是低电平驱动。通过给8段对应的二极管进行0或者1的赋值,共同组成不同的字符。

  1. module seg0(
  2. input clk,
  3. input rst_n,
  4. output reg [5:0] seg_sel,//位选
  5. output reg [7:0] seg_dual//段选
  6. );
  7. localparam ZERO = 8'b1100_0000, //共阳极段码
  8. ONE = 8'b1111_1001,
  9. TWO = 8'b1010_0100,
  10. THREE = 8'b1011_0000,
  11. FOUR = 8'b1001_1001,
  12. FIVE = 8'b1001_0010;
  13. reg [15:0] cnt;//ms计数器
  14. wire add_cnt;
  15. wire end_cnt;
  16. reg [4:0] flag;
  17. wire add_flag;
  18. wire end_flag;
  19. always @(posedge clk or negedge rst_n)begin
  20. if(!rst_n)
  21. cnt<=0;
  22. else if(add_cnt)begin
  23. if(end_cnt)
  24. cnt<=0;
  25. else
  26. cnt<=cnt+1'b1;
  27. end
  28. end
  29. assign add_cnt=1'b1;
  30. assign end_cnt=add_cnt && (cnt==50_000-1);
  31. always @(posedge clk or negedge rst_n)begin
  32. if(!rst_n)
  33. seg_sel<=6'b111_110;
  34. else if(end_cnt)
  35. seg_sel<={seg_sel[4:0],seg_sel[5]};
  36. end
  37. always @(posedge clk or negedge rst_n)begin
  38. if(!rst_n)
  39. seg_dual<=8'b1111_1111;
  40. else begin
  41. case (seg_sel)
  42. 6'b111_110:seg_dual<=ZERO ;
  43. 6'b111_101:seg_dual<=ONE ;
  44. 6'b111_011:seg_dual<=TWO ;
  45. 6'b110_111:seg_dual<=THREE;
  46. 6'b101_111:seg_dual<=FOUR ;
  47. 6'b011_111:seg_dual<=FIVE ;
  48. default: ;
  49. endcase
  50. end
  51. end
  52. endmodule

2、测试文件编写

这里很简单,我就不进行波形仿真了,下面是测试文件,感兴趣的可以去仿真一下,我就直接在后面给出下板验证的结果。

  1. //定义时间尺度
  2. `timescale 1ns/1ns
  3. module seg0_tb ;
  4. //输入信号定义
  5. reg clk;
  6. reg rst_n;
  7. wire [7:0] seg_dual;
  8. wire [5:0] seg_sel;
  9. //模块例化
  10. seg0 seg_inst(
  11. /*input */.clk (clk ),
  12. /*input */.rst_n (rst_n ),
  13. /*output*/.seg_sel (seg_sel ),
  14. /*output*/.seg_dual (seg_dual)
  15. );
  16. //激励信号产生
  17. parameter CLK_CLY = 20;
  18. //时钟
  19. initial clk=1;
  20. always #(CLK_CLY/2)clk=~clk;
  21. //复位
  22. initial begin
  23. rst_n= 1'b0;
  24. #(CLK_CLY*3);
  25. #5;//复位结束避开时钟上升沿
  26. rst_n= 1'b1;
  27. end
  28. endmodule

3、下板验证

图片中我们可以看到6个数码管从0显示到5,成功设计成多个数码管同时显示。

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

闽ICP备14008679号