我的 FPGA 学习历程(10)—— 实验:数码管驱动
根据黑金 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,实现的流程如下:
- 首先使能数码管 0,关闭其他数码管:SEL = 6'b111_110,显示的数值为 6,DIG = {1,DIG[6:0]} = 7'b1_000_0010;
- 第二步使能数码管 1,关闭其他: SEL = 6'b111_101,显示的数值为 5,DIG = 7'b1001_0010;
- 同理 SEL = 6'b111_011,显示 4 DIG = 7'b1001_1001;
- 同理 SEL = 6'b110_111,显示 3 DIG = 7'b1011_0000;
- 同理 SEL = 6'b101_111,显示 2 DIG = 7'b1010_0100;
- 同理 SEL = 6'b011_111,显示 1 DIG = 7'b1111_1001;
- 回到步骤一。
晶振的频率显然超过了三极管的频率上限,我们通过设计一个分频器来产生一个不超过 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
下面是控制模块的代码,这个模块实现的功能比较复杂:
- 首先实现一个 0 ~ 5 不断循环的低速计数器 dig_num 作为参考值。
- 当 dig_num 为 0 时,点亮数码管 0,同时分离 num[3:0](6)到 display。
- 当 dig_num 为 1 时,点亮数码管 1,分离 num[7:4](5)到 display。
- 当 dig_num = 2 ~ 5 时,情况同上。
- 任何时候把 display 中的值转化为数码管显示所需的段选信号。
注意:Verilog 语法 十进制 'd、十六进制 'h、八进制 'o、二进制 'b 在本例中非常容易弄错

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

读者如果觉得同时显示六个字符有些困难,可以选择先点亮两个,再来依次增加即可。
我的 FPGA 学习历程(10)—— 实验:数码管驱动的更多相关文章
- 我的 FPGA 学习历程(08)—— 实验:点亮单个数码管
数码管是一种常见的用于显示的电子器件,根据数码管大致可以分为共阴极和共阳极两种,下图所示的是一个共阳极的数码管的电路图(摘自金沙滩工作室的 51 开发板电路图),我的 AX301 开发板与这张图的情况 ...
- 我的 FPGA 学习历程(02)—— 实验:点亮 LED 灯
关于 Quartus 的操作可以使用 Quartus 自带的帮助,帮助中带有全套的操作教程. 中文网络教程链接(链接至 altera中文官网,点击观看) Quartus II 软件设计系列:基础 Qu ...
- 我的 FPGA 学习历程(11)—— 实验:按键消抖
按键是一个输入设备,在理论上可以归为开关一类,理想的按键波形如下: 然而由于按键的机械特性,断开和闭合动作是不可能在一瞬间完成的,实际的波形如下: 抖动期间电平处于临界值,由于晶振的频率相当的高,数字 ...
- 我的 FPGA 学习历程(09)—— 时序逻辑入门
讲到这篇时,组合逻辑就告一段落了,下面是一些总结: 描述组合逻辑时,always 语句中的敏感信号列表中需要列出全部的可能影响输出的变量 描述组合逻辑时,always 语句中的赋值总是使用阻塞赋值符号 ...
- 我的 FPGA 学习历程(01)—— FPGA 基础知识和 Quartus 的安装
高级的嵌入式市场主要分为以下三类:ARM.DSP 和 FPGA. 其中 ARM 是行业内的佼佼者,目前几乎所有的安卓智能手机都使用 ARM 授权的 CPU架构:而 DSP(数字信号处理器) 早年就被大 ...
- 我的 FPGA 学习历程(12)—— 电子钟项目准备
初学 FPGA 的时候,我们总是存在很多疑问,比如:xilinx 和 altera 的 FPGA 那种比较好.verilog 语言被如何综合成具体硬件电路.RTL 级电路是什么意思等等.现在我们就不会 ...
- 我的 FPGA 学习历程(05)—— 使用 Modelsim 仿真工具
在第 3 篇中讲到了如何使用图形进行仿真激励输入,图形输入法尽管简单易学,但如若要求复杂的仿真输入激励.较长的仿真时间或是要求打印输出信息乃至输出文件日志则显得不够用了. 本篇以上一篇的 3-8 译码 ...
- 我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制
PWM 是一种调节输出功率的技术(俗称调压),其原理在于改变输出方波的占空比,具体输出见下图: 输出信号为电压值,当负载为恒阻时,上图中的输出功率分别为 25%.50%.75%. 实现方法如下: 设置 ...
- 我的 FPGA 学习历程(07)—— BCD 编码:移位加 3 算法
2-10 进制码,也称为 BCD 码,它的编码方式则是通过一个 4 位二进制来表示一个 10 进制数,部分十进制对应的 BCD 码如下 十进制数 | BCD 码 13 --> 0001_0011 ...
随机推荐
- cmd切换代码页,切换字体,cmd不能输入中文
cmd终端切换编码:437:美国英语.936:中文gbk编码.65001:UTF8 小知识: 如果cmd不能调用中文输入法,也就是不能输入中文,是因为目前激活的代码页不是936 使用 chcp 936 ...
- Java并发编程之美之并发编程线程基础
什么是线程 进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程至少有一个线程,进程的多个线程共享进程的资源. java启动main函数其实就 ...
- 2018-2019-2 网络对抗技术 20165337 Exp3 免杀原理与实践
基础问题回答 (1)杀软是如何检测出恶意代码的? 基于特征码的检测:特征码就是一段数据.如果一个可执行文件(或其他运行的库.脚本等)包含特定的数据则被认为是恶意代码.AV软件厂商要做的就是尽量搜集最全 ...
- pythonのdjango Form简单应用。
Form表单有两种应用场景: 1.生成HTML标签. 2.验证输入内容. 如果我们在django程序中使用form时,需要在views中导入form模块 from django import form ...
- Web项目容器集成ActiveMQ & SpringBoot整合ActiveMQ
集成tomcat就是随项目启动而启动tomcat,最简单的方法就是监听器监听容器创建之后以Broker的方式启动ActiveMQ. 1.web项目中Broker启动的方式进行集成 在这里采用Liste ...
- 微信小程序开发之自定义菜单tabbar
做这个 遇到问题比较多,特此记录以便查看,直接上代码: 一.app.js 控制原有菜单隐藏.启用新菜单.菜单列表,集中在这里控制 hideTabBar这个很关键,解决苹果6S导致的双导航栏:原文htt ...
- Timeline高级扩展
转载于http://forum.china.unity3d.com/thread-32200-1-1.html通过demo讲解了timeline更加复杂的使用方式 Timeline是创建过场动画和影片 ...
- Linux代理搭建TinyProxy
操作系统:阿里云CentOS 7.4 64位 安装方法: yum install tinyproxy 配置: vi /etc/tinyproxy/tinyproxy.conf Port 8888 // ...
- python学习第31天
# 操作系统的发展历程 # 主要的人机矛盾是什么 : CPU的使用率 # 输入\输出数据和CPU计算没有关系 # 操作系统是怎么进化的 # 传统的纸带输入 # 磁带的存储降低了输入输出数据占用的时间, ...
- Flask简介&入门
1 了解框架 Flask作为Web框架,它的作用主要是为了开发Web应用程序.那么我们首先来了解下Web应用程序.Web应用程序 (World Wide Web)诞生最初的目的,是为了利用互联网交流工 ...