根据黑金 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. 回到步骤一。

晶振的频率显然超过了三极管的频率上限,我们通过设计一个分频器来产生一个不超过 1KHz 的扫描信号;这个分频器的原理在于设计一个每个时钟周期加 1 的计数器,如果累计器是 3 位的,那么它的数值变化就如下表所示:

counter[2:0]:000,001,010,011,100,101,110,111,

counter[0]:           0,    1,    0,     1,    0,     1,     0,    1,------------- 50MHz

counter[1]:         0,    0,     1,     1,    0,    0,    1,     1,  ------------- 25MHz

counter[2]:     0,      0,     0,     0,    1,    1,     1,   1,     ------------- 11.5MHz

分频器的具体的代码如下:

通过实验发现设置为 19、18、17 时数码管都会出现严重的闪烁现象,而 16 这个值正常,计算便可以得出这时的频率大约为 400Hz

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](5)到 display。
  4. 当 dig_num = 2 ~ 5 时,情况同上。
  5. 任何时候把 display 中的值转化为数码管显示所需的段选信号。

注意:Verilog 语法 十进制 'd、十六进制 'h、八进制 'o、二进制 'b 在本例中非常容易弄错

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

读者如果觉得同时显示六个字符有些困难,可以选择先点亮两个,再来依次增加即可。

我的 FPGA 学习历程(10)—— 实验:数码管驱动的更多相关文章

  1. 我的 FPGA 学习历程(08)—— 实验:点亮单个数码管

    数码管是一种常见的用于显示的电子器件,根据数码管大致可以分为共阴极和共阳极两种,下图所示的是一个共阳极的数码管的电路图(摘自金沙滩工作室的 51 开发板电路图),我的 AX301 开发板与这张图的情况 ...

  2. 我的 FPGA 学习历程(02)—— 实验:点亮 LED 灯

    关于 Quartus 的操作可以使用 Quartus 自带的帮助,帮助中带有全套的操作教程. 中文网络教程链接(链接至 altera中文官网,点击观看) Quartus II 软件设计系列:基础 Qu ...

  3. 我的 FPGA 学习历程(11)—— 实验:按键消抖

    按键是一个输入设备,在理论上可以归为开关一类,理想的按键波形如下: 然而由于按键的机械特性,断开和闭合动作是不可能在一瞬间完成的,实际的波形如下: 抖动期间电平处于临界值,由于晶振的频率相当的高,数字 ...

  4. 我的 FPGA 学习历程(09)—— 时序逻辑入门

    讲到这篇时,组合逻辑就告一段落了,下面是一些总结: 描述组合逻辑时,always 语句中的敏感信号列表中需要列出全部的可能影响输出的变量 描述组合逻辑时,always 语句中的赋值总是使用阻塞赋值符号 ...

  5. 我的 FPGA 学习历程(01)—— FPGA 基础知识和 Quartus 的安装

    高级的嵌入式市场主要分为以下三类:ARM.DSP 和 FPGA. 其中 ARM 是行业内的佼佼者,目前几乎所有的安卓智能手机都使用 ARM 授权的 CPU架构:而 DSP(数字信号处理器) 早年就被大 ...

  6. 我的 FPGA 学习历程(12)—— 电子钟项目准备

    初学 FPGA 的时候,我们总是存在很多疑问,比如:xilinx 和 altera 的 FPGA 那种比较好.verilog 语言被如何综合成具体硬件电路.RTL 级电路是什么意思等等.现在我们就不会 ...

  7. 我的 FPGA 学习历程(05)—— 使用 Modelsim 仿真工具

    在第 3 篇中讲到了如何使用图形进行仿真激励输入,图形输入法尽管简单易学,但如若要求复杂的仿真输入激励.较长的仿真时间或是要求打印输出信息乃至输出文件日志则显得不够用了. 本篇以上一篇的 3-8 译码 ...

  8. 我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制

    PWM 是一种调节输出功率的技术(俗称调压),其原理在于改变输出方波的占空比,具体输出见下图: 输出信号为电压值,当负载为恒阻时,上图中的输出功率分别为 25%.50%.75%. 实现方法如下: 设置 ...

  9. 我的 FPGA 学习历程(07)—— BCD 编码:移位加 3 算法

    2-10 进制码,也称为 BCD 码,它的编码方式则是通过一个 4 位二进制来表示一个 10 进制数,部分十进制对应的 BCD 码如下 十进制数 | BCD 码 13 --> 0001_0011 ...

随机推荐

  1. Contest2178 - 2019-4-18 高一noip基础知识点 测试7 题解版

    刚刚改完题,才有时间发题解 传送门 T1 exgcd裸题 对a,b跑exgcd,答案就是x*c/gcd(a,b),y*c/gcd(a,b) 不合法的情况:当且仅当c%gcd(a,b)!=0 代码 T2 ...

  2. data_summarize.pl data目录文本时长汇总脚本

    #!/usr/bin/env perl # Copyright 2018 Jarvan Wang if (@ARGV != 1) { #print STDERR "Usage: keywor ...

  3. 获取spring的IOC核心容器,并根据id获取对象

    public class Client { /** * 获取spring的IOC核心容器,并根据id获取对象 * ApplicationContext的三个常用实现类 * classPathXmlAp ...

  4. Eclipse使用Git检出项目

    1.打开Eclipse——File——Import...: 2.在弹出的Import框中选择Git——Projects from Git——NEXT: 3.选择Clone URI——Next: 4.输 ...

  5. element-UI使用中:el-input type为textarea时@change无法触发?

    自己瞎尝试解决了的.官方文档上居然没写@input事件,醉了.

  6. 记事本:js简介

    引用js和css很类似,大致有三种方式: 第一种: 在行内引用js, <div onclick="alert(111);"> </div> 第二种: 在行外 ...

  7. 阿里云服务器ftp连接后21端口无法使用的问题

    今天在阿里云Centos上搭了一个ftp 服务,开启了20和21端口的权限.但是用工具和ftp命令登录,均超时. ftp命令登录成功后不能使用ls 命令,直接超时. 工具登录成功后 获取根目录失败,也 ...

  8. Oracle SQL性能优化总结

    1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执 ...

  9. React(17)异步组件

    26.异步组件当在React里使用异步组件时,核心知识是两个: webpack 如何异步加载其他模块:通过 require(['xxx'], function(module){})来实现:React ...

  10. CentOS6.5 下在Nginx中添加SSL证书

    原文:https://www.cnblogs.com/wuling129/p/5039978.html 证书过期 ,更新证书,记录下 一.安装相关支持库:(未实践) yum -y install gc ...