码迷,mamicode.com
首页 > 其他好文 > 详细

我的 FPGA 学习历程(10)—— 实验数码管驱动

时间:2015-12-11 22:25:42      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:

        根据黑金 AX301 手册,数码管位选信号命名为 SEL[5:0],其中 SEL[5] 对应最左边的数码管,而SEL[0] 对应最右边数码管;作为约定,在下面的描述中我们对应的称之为数码管 5 和数码管 0。数码管的段选信号被命名为 DIG[7:0];DIG[7] 为小数点 DP,DIG[6] 为数码管 g 段,DIG[0] 为 a 段,其他类推即可。

       由于数码管的段选信号是共用的,理论上是不可能同时显示六个不同字符的,但由于人眼的视觉残留现象,只要我们很快的依次显示每一个数字,就可以欺骗人眼达到显示多位数字的目的,假设需要显示的数字为 123456,其二进制 BCD 码为 24‘b 0001_0010_0011_0100_0101_0110 可以简写成 24‘h123456,实现的流程如下:

  1. 首先使能数码管 0,关闭其他数码管:SEL = 6‘b111_110,显示的数值为 6,DIG = {1,DIG[6:0]}  = 7‘b1_000_0010;
  2. 第二步使能数码管 1,关闭其他:        SEL = 6‘b111_101,显示的数值为 5,DIG = 7‘b1001_0010;
  3. 同理                                                        SEL = 6‘b111_011,显示 4                   DIG = 7‘b1001_1001;
  4. 同理                                                        SEL = 6‘b110_111,显示 3                   DIG = 7‘b1011_0000;
  5. 同理                                                        SEL = 6‘b101_111,显示 2                   DIG = 7‘b1010_0100;
  6. 同理                                                        SEL = 6‘b011_111,显示 1                   DIG = 7‘b1111_1001;
  7. 回到步骤一。

SEL 的数值可以通过左移来实习,由于三极管有频率上限,扫描频率不宜太快,需要的频率可以通过前面所讲的分频器来实现,分频器代码如下:

下图中的 counter[16] 可以根据修改,我试过了 17、18、19 都太慢,数码管闪的厉害计算一下分得的频率:

f =50MHz/( 2^(16+1)) = 50_000_000 Hz/(2^17) = 381.469726 Hz ~~ 381.47 Hz

技术分享

下图为控制模块,这个模块功能比较复杂:

  1. 首先实现一个 0 ~ 5 不断循环的低速计数器 dig_num 作为参考值。
  2. 当 dig_num 为 0 时,点亮数码管 0,同时分离 num 中低三位 [3:0] 的值(本例中为 6)到 display。
  3. 当 dig_num 为 1 时,点亮数码管 1,分离 num[7:4] 到 display(这时分离的是 5)。
  4. 当 dig_num = 2 ~ 5 时,情况类似。
  5. 任何时候把 display 中的值转化为数码管所需的段选信号。

本例中用到的语法中:十进制 ‘d、十六进制 ‘h、八进制 ‘o、二进制 ‘b 一定要仔细,非常容易弄错

技术分享

最后是顶层模块,模块中指定了要显示的字符:

技术分享

如果觉得同时显示六个字符有些困难,可以选择先点亮两个,再依次增加。好了,本篇到此为止了。

我的 FPGA 学习历程(10)—— 实验数码管驱动

标签:

原文地址:http://www.cnblogs.com/sxyf/p/5040319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!