当前位置:   article > 正文

FPGA_数码管显示_数码管显示 csdn

数码管显示 csdn

1,数码管介绍

一位数码管:

数码管等效电路(共阴极 和 共阳极)

数码管显示的值:

假设我们需要b,c亮,我们只需要给b,c接高电平,其他接低电平就可。

seg[7:0]  = 8'b0000_0110

对于数码管显示的值,seg值如下图:

多位数码管----->如下图(以3位为例)

假设现在需要LED1亮,那么就让sel0为1,数码管0的LED0-LED7阳极都是高电平,然后再控制a为低电平,那么就实现了数码管0的LED0点亮。

如果是8个数码管呢

8个sel信号

2,位选输出

这个规律就是3-8译码器  我们要按顺序点亮每一位,就需要1个3位的计数器(控制位切换信号):

利用人眼视觉暂留效应,得到多个数码管同时点亮的效果

每个数码管20ms带点亮一次,我们有8个数码管,那么数码管的切换时间就是20/8=2.5ms,保险一点改为1ms切换一个数码管。

1ms计时就设计一个1ms的计数器(预留位宽大一点30位)

设计一个比较器,当技术达到指定要求就输出1,当作cnt_sel的时钟使能信号以及自己本身计数的清0信号。

现在就可以实现8位数码管位选输出了。

3,段选输出

使用查找表形式在实现所要显示的字符。

所谓查找表就是,我预先设定好一个表,在每个表项里面存放需要输出的具体值。把每个字符输出的段码存放在表里面,然后把每个字符的显示内容作为查找表的索引号,只要给出索引号,就能查出对应的值。

16个索引号 4位数据表示temp_data[3:0]

根据当前动态扫描,正在扫描在哪个数码管,就将这个数码管需要显示的内容送到查找表的输入端口去,将需要显示的字符内容作为查找表的索引号输入进去。

8个数码管用一个8选1的多路选择器,利用段选中的cnt_sel作为选通通道--就能实现在扫描对应数码管的时候让段选就是这个数码管。

如果要显示更多字符:

这里 是8个通道,每个通道4位,那么把这8个通道合成一个32位数据data[31:0]

4,代码编写

整体设计符号图:

根据以上描述,编写代码:

  1. module digitial_tube_0(
  2. Clk,
  3. Reset_n,
  4. Disp_Data,
  5. SEL,
  6. SEG
  7. );
  8. input Clk;
  9. input Reset_n;
  10. input [31:0]Disp_Data;
  11. output reg [7:0]SEL;
  12. output reg [7:0]SEG;
  13. parameter MCNT_1MS = 1000000/20 -1;
  14. parameter MCNT_SEL = 8-1;
  15. reg [15:0]cnt_1ms;
  16. reg [2:0]cnt_sel;
  17. reg [7:0]encode_sel;
  18. reg [7:0]LUT_seg;
  19. reg [3:0]data_temp;
  20. //1ms计数器
  21. always@(posedge Clk or negedge Reset_n)
  22. if(!Reset_n)
  23. cnt_1ms <= 0;
  24. else if(cnt_1ms == MCNT_1MS)
  25. cnt_1ms <= 0;
  26. else
  27. cnt_1ms <= cnt_1ms + 1'b1;
  28. //位选计数器
  29. always@(posedge Clk or Reset_n)
  30. if(!Reset_n)
  31. cnt_sel <= 0;
  32. else if(cnt_1ms == MCNT_1MS) begin
  33. if(cnt_sel == MCNT_SEL)
  34. cnt_sel <= 0;
  35. else
  36. cnt_sel <= cnt_sel + 1'b1;
  37. end
  38. else
  39. cnt_sel <= cnt_sel;
  40. //3_8译码器
  41. always@(*)
  42. case(cnt_sel)
  43. 3'b000:encode_sel = 8'b0000_0001;
  44. 3'b001:encode_sel = 8'b0000_0010;
  45. 3'b010:encode_sel = 8'b0000_0100;
  46. 3'b011:encode_sel = 8'b0000_1000;
  47. 3'b100:encode_sel = 8'b0001_0000;
  48. 3'b101:encode_sel = 8'b0010_0000;
  49. 3'b110:encode_sel = 8'b0100_0000;
  50. 3'b111:encode_sel = 8'b1000_0000;
  51. endcase
  52. always@(posedge Clk or negedge Reset_n)
  53. if(!Reset_n)
  54. SEL <= 0;
  55. else
  56. SEL <= encode_sel;
  57. //段选
  58. always@(*)
  59. case(cnt_sel)
  60. 3'b000:data_temp = Disp_Data[3:0];
  61. 3'b001:data_temp = Disp_Data[7:4];
  62. 3'b010:data_temp = Disp_Data[11:8];
  63. 3'b011:data_temp = Disp_Data[15:12];
  64. 3'b100:data_temp = Disp_Data[19:16];
  65. 3'b101:data_temp = Disp_Data[23:20];
  66. 3'b110:data_temp = Disp_Data[27:24];
  67. 3'b111:data_temp = Disp_Data[31:28];
  68. endcase
  69. always@(*)
  70. case(data_temp)
  71. 0 : LUT_seg = 8'hc0;
  72. 1 : LUT_seg = 8'hf9;
  73. 2 : LUT_seg = 8'ha4;
  74. 3 : LUT_seg = 8'hb0;
  75. 4 : LUT_seg = 8'h99;
  76. 5 : LUT_seg = 8'h92;
  77. 6 : LUT_seg = 8'h82;
  78. 7 : LUT_seg = 8'hf8;
  79. 8 : LUT_seg = 8'h80;
  80. 9 : LUT_seg = 8'h90;
  81. 4'ha :LUT_seg = 8'h88;
  82. 4'hb :LUT_seg = 8'h83;
  83. 4'hc :LUT_seg = 8'hc6;
  84. 4'hd :LUT_seg = 8'ha1;
  85. 4'he :LUT_seg = 8'h86;
  86. 4'hf :LUT_seg = 8'h8e;
  87. endcase
  88. always@(posedge Clk or negedge Reset_n)
  89. if(!Reset_n)
  90. SEG <= 0;
  91. else
  92. SEG <= LUT_seg;
  93. endmodule

编写testbench,测试代码:

  1. `timescale 1ns / 1ps
  2. module digitial_tubr_1_tb();
  3. reg Clk;
  4. reg Reset_n;
  5. reg [31:0]Disp_Data;
  6. wire [7:0]SEL;
  7. wire [7:0]SEG;
  8. digitial_tube_0 digitial_tube_0(
  9. .Clk(Clk),
  10. .Reset_n(Reset_n),
  11. .Disp_Data(Disp_Data),
  12. .SEL(SEL),
  13. .SEG(SEG)
  14. );
  15. initial Clk = 1;
  16. always #10 Clk = ~Clk;
  17. initial begin
  18. Reset_n = 0;
  19. Disp_Data = 32'h00000000;
  20. #201
  21. Reset_n = 1;
  22. #200;
  23. Disp_Data = 32'h12345678;
  24. #10000000
  25. Disp_Data = 32'h9abcdef0;
  26. #10000000
  27. $stop;
  28. end
  29. endmodule

仿真波形如下:

至此,数码管驱动逻辑编写完毕,但是在实际应用此输出占用的管脚过多,所以为了节省FPGA的管脚,需要将输出信号并转串后(FPGA只需要输出3个管脚),再利用串转并芯片(比如74HC595)连接数码管去显示需要输出的字符。

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

闽ICP备14008679号