原创 三十而立学FPGA之数码管

2022-6-12 16:47 2332 15 4 分类: FPGA/CPLD 文集: FPGA
简介

数码管,一种把多个发光二极管通过简单阵列的方式组合而成的显示器件。多个二极管阴极连在一起,通过控制阳极的高低电平来控制数码管相应LED亮灭的叫做共阴,反之共阳。每个发光二极管称之为数码管的段,连在一起的阴极或阳极称之为位。

实现框图

 

模块实现 1. 十进制转BCD模块

十进制(二进制)转BCD通常使用方式是移位加三的算法。具体方式如下表示(以123即8‘b01111011为例):

说明:

1. count为0,将需要转换的数值赋值给设置的移位寄存器shift_reg的后八位

2. count每计数一次,将移位寄存器向左移1位,再判断个位十位的值是否大于等于5,如果十位或个位大于等于5,则十位或个位都加3。

3. 移位的次数(即count的计数值),由需要转化的数的二进制位数相同。

4. 需要避免0,因为复位count值为0,会打乱后面的逻辑。

程序实现

  1. //移位计数
  2. always @(posedge clk or negedge rst_n)
  3. begin
  4. if(rst_n == 1'b0)
  5. count <= 4'd0;
  6. else if(count == 4'd9)
  7. count <= 4'd0;
  8. else
  9. count <= count + 4'd1;
  10. end
  11. //移位加三算法
  12. always @(posedge clk or negedge rst_n)
  13. begin
  14. if(rst_n == 1'b0)
  15. shift_reg = {shift_reg[19:8],data_in};
  16. else if(count == 4'd0)
  17. shift_reg = {shift_reg[19:8],data_in};
  18. else if(count <= 4'd9)
  19. if(shift_reg[11:8]>=5)
  20. if(shift_reg[15:12]>=5)
  21. begin
  22. shift_reg[11:8] = shift_reg[11:8] + 4'd3;
  23. shift_reg[15:12]= shift_reg[15:12]+ 4'd3;
  24. end
  25. else
  26. begin
  27. shift_reg[11:8] = shift_reg[11:8] + 4'd3;
  28. shift_reg[15:12]= shift_reg[15:12];
  29. end
  30. else
  31. if(shift_reg[15:12]>=5)
  32. begin
  33. shift_reg[11:8] = shift_reg[11:8];
  34. shift_reg[15:12]= shift_reg[15:12]+ 4'd3;
  35. end
  36. else
  37. begin
  38. shift_reg[11:8] = shift_reg[11:8];
  39. shift_reg[15:12]= shift_reg[15:12];
  40. end
  41. else
  42. shift_reg = shift_reg;
  43. end

2. 译码模块

以下代码以共阳极数码管为例

  1. always @(posedge clk or negedge rst_n)
  2. begin
  3. if(rst_n == 1'b0)
  4. dp_val_r <= 8'b1100_0000;
  5. else
  6. case (dp_index) //dp,g,f,e,d,c,b,a
  7. 0:dp_val_r <= 8'b1100_0000;
  8. 1:dp_val_r <= 8'b1111_1001;
  9. 2:dp_val_r <= 8'b1010_0100;
  10. 3:dp_val_r <= 8'b1011_0000;
  11. 4:dp_val_r <= 8'b1001_1001;
  12. 5:dp_val_r <= 8'b1001_0010;
  13. 6:dp_val_r <= 8'b1000_0010;
  14. 7:dp_val_r <= 8'b1111_1000;
  15. 8:dp_val_r <= 8'b1000_0000;
  16. 9:dp_val_r <= 8'b1001_0000;
  17. 10:dp_val_r <= 8'b1000_1000;
  18. 11:dp_val_r <= 8'b1000_0011;
  19. 12:dp_val_r <= 8'b1100_0110;
  20. 13:dp_val_r <= 8'b1010_0001;
  21. 14:dp_val_r <= 8'b1000_0110;
  22. 15:dp_val_r <= 8'b1000_1110;
  23. default:dp_val_r <= 8'b1100_0000;
  24. endcase
  25. end

3. 数码管扫描模块 扫描计时

  1. always @(posedge clk or negedge rst_n)
  2. begin
  3. if(rst_n == 1'b0)
  4. cnt <= 20'd0;
  5. else if(start_cnt == 1'b1)
  6. if(cnt == 20'd99999)
  7. cnt <= 20'd0;
  8. else
  9. cnt <= cnt + 20'd1;
  10. else
  11. cnt <= 20'd0;
  12. end

扫描实现

本实验为六位数码管

  1. //SEL_W由数码管位数决定
  2. always @(posedge clk or negedge rst_n)
  3. begin
  4. if(rst_n == 1'b0)
  5. dp_sel_o_r <= {{(SEL_W-1){1'b0}},1'b1};
  6. else if(cnt == 20'd99999)
  7. dp_sel_o_r <= dp_sel_o_r << 1;
  8. else if(dp_sel_o_r == {1'b0,{(SEL_W-1){1'b0}}})
  9. dp_sel_o_r <= {{(SEL_W-1){1'b0}},1'b1};
  10. else
  11. dp_sel_o_r <= dp_sel_o_r;
  12. end
  13. always @(posedge clk or negedge rst_n)
  14. if(rst_n == 1'b0)
  15. dp_index = 4'd0;
  16. else
  17. begin
  18. case (dp_sel_o_r)
  19. 6'b000000:dp_index = 4'd0;
  20. 6'b000001:dp_index = dp_data_r[3:0];
  21. 6'b000010:dp_index = dp_data_r[7:4];
  22. 6'b000100:dp_index = dp_data_r[11:8];
  23. 6'b001000:dp_index = dp_data_r[15:12];
  24. 6'b010000:dp_index = dp_data_r[19:16];
  25. 6'b100000:dp_index = dp_data_r[23:20];
  26. default: dp_index = 4'd0;
  27. endcase
  28. end

 


作者: 二月半, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1862109.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论1条评论)

登录后参与讨论

yzw92 2022-6-13 06:25

感谢楼主分享
相关推荐阅读
二月半 2024-05-09 11:10
ADS软件分享与安装
ADS软件的简介ADS软件(Advanced Design System)主要用于射频(RF)、微波(Microwave)和毫米波(Millimeter-wave)电路的设计、仿真和分析。它提供了一套...
二月半 2024-03-31 09:22
从零开始摄像头驱动设计(一)_I2C框架及设备树插件应用
前言像我这样很多学习驱动的同学都会想一个问题:学了这个能干嘛?学了那个能干嘛?姑且找找网络上开源的项目,找找,看看,还是一脸懵。因为开源只提供源码和大致介绍下做什么和有什么。而面对于基础开发者的博客还...
二月半 2024-03-28 09:10
高速电路设计、完整性设计推荐书籍
信号传输如今是越来越高速,伴随着的将是更多的信号完整性的问题。然而电源的完整性也影响着信号的完整性。这样的高速传输,以前不用太多考虑的EMI问题,也越来越被关注。 针对于这些问题,对于layout工...
二月半 2024-03-15 07:01
Cadence之创建自己的titleblock
在刚接触PCB原理图设计的时候,很多人是不会关注图纸Tile Block的。原因是觉得用不上。然而工作的时候这个反而很重要。原因呢,一是形成一个统一标准,便于归档,整洁清楚,二是其中包含重要信息,比如...
二月半 2024-03-12 09:38
allegro之坚固的半孔制作
随着芯片不断的更新迭代,一浪拍死一浪。做硬件的特别头疼,核心电路或者可复用电路因为某一个板卡需要重新设计整板。很多都是做的无用功,为了更加高效的完成工作,然后摸鱼。硬件界的人才们,找到了很多方法。最多...
二月半 2024-03-07 11:03
ALLegro之单独设置PIN脚与覆铜连接方式
 设计PCB时,有很多时候在总电源输入处需要将一部分pin脚设置为全连接,给大电流拓宽通道。然而如果往常针对同一覆铜下的同属性pin脚只能全部设置为全连接或者其他。所以,在初学者手上也出现了...
我要评论
1
15
关闭 站长推荐上一条 /2 下一条