10-8位7段数码管驱动实验——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线——普利斯队长精心奉献
实验目的: 1.实现FPGA驱动数码管动态显示;
2.使用In system sources and probes editor工具,输入需要显示在数码管上的的数据,数码管显示对应数值。
实验平台:芯航线FPGA核心板、数码管_VGA_PS2模块

实验原理:
电子设计系统中常用的显示设备有数码管、LCD液晶以及VGA显示器等。其中数码管又可分为段式显示(7段、米字型等)以及点阵显示(8*8、16*16等),LCD液晶的应用可以分为字符式液晶(1602、12864等)以及真彩液晶屏,VGA显示器是现在一般的电脑显示器。芯航线开发板对以上三种设备均提供了硬件接口上。
其中8段数码管的原理图如图10-1所示,

图10-1 8段数码管原理图
由上图可以看出数码管有两种结构:共阴与共阳。这两者的区别在于,公共端是连接到地还是高电平,对于共阴数码管需要给对应段以高电平才会使其点亮,对于共阳反之。芯航线数码管_VGA_PS2模块上板载的是共阳数码管。同时为了显示数字或字符,必须对数字或字符进行编码译码。这里先不考虑小数点也就是简化为7段数码管,其编码译码格式如表10-1所示:
|
待显示内容 Data_disp |
段码(二进制格式) |
段码(十六进制格式) |
|||||||
|
a |
b |
c |
d |
e |
f |
g |
h |
||
|
0 |
1 |
1 |
8'hc0 |
||||||
|
1 |
1 |
1 |
1 |
1 |
1 |
1 |
8'hf9 |
||
|
2 |
1 |
1 |
1 |
8'ha4 |
|||||
|
3 |
1 |
1 |
1 |
8'hb0 |
|||||
|
4 |
1 |
1 |
1 |
1 |
8'h99 |
||||
|
5 |
1 |
1 |
1 |
8'h92 |
|||||
|
6 |
1 |
1 |
8'h82 |
||||||
|
7 |
1 |
1 |
1 |
1 |
1 |
8'hf8 |
|||
|
8 |
1 |
8'h80 |
|||||||
|
9 |
1 |
1 |
8'h90 |
||||||
|
a |
1 |
1 |
8'h88 |
||||||
|
b |
1 |
1 |
1 |
8'h83 |
|||||
|
c |
1 |
1 |
1 |
1 |
8'hc6 |
||||
|
d |
1 |
1 |
1 |
8'ha1 |
|||||
|
e |
1 |
1 |
1 |
8'h86 |
|||||
|
f |
1 |
1 |
1 |
1 |
8'h8e |
||||

表10-1 数码管编码译码表
段式数码管工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法由于每一个数码管均需要独立的数据线因此硬件电路比较复杂,成本较高,很少使用。
为了节约IO以及成本一般采用如图2所示的电路结构,这样3个数码管接在一起就比静态的少了7*2个I/O。

图10-2三位数码管等效电路图
这样就实现了另一种显示模式,动态显示。动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
现在举例假设将扫描时间定为1S,这三个数码管分成3s,第1秒时sel数据线上为100,这时数码管0被选中,这时a=0,数码管0的LED0就可以点亮;第2秒时sel数据线上为010,这时数码管1被选中,这时b=0,数码管1的LED1就可以点亮;第3秒时sel数据线上为001,这时数码管2被选中,这时c=0,数码管2的LED2就可以点亮。这时的效果就会是数码管0的LED0亮一秒后数码管1的LED1亮一秒最后是数码管2的LED2亮一秒,这样再次循环。
这样如果使用1ms刷新时间的话由于数码管的余辉效应以及人的视觉暂留这样就会出现数码管0的LED0、数码管1的LED1以及数码管2的LED2 "同时"亮,并不会有闪烁感。
实验步骤:
由上面的分析可以得出应该有图3的框图,其接口列表如表2所示:

图10-3 模块框图
|
信号名称 |
功能描述 |
|
Clk |
50M时钟 |
|
Rst_n |
复位信号 |
|
En |
数码管使能信号1使能,0关闭 |
|
disp_data[31:0] |
8个数码管待显示数据,每四位组成一个BCD码 |
|
sel[7:0] |
数码管位选,选择当前要显示的数码管 |
|
seg[6:0] |
数码管段选,当前要显示的内容 |
表10-2 模块接口列表
经过以上的分析,数码管驱动模块逻辑电路图可以简化成如图10-4所示的,其中每一部分的作用如表10-3所示。

图10-4 数码管驱动模块逻辑电路图
|
名称 |
功能描述 |
|
divder |
分频产生1KHz的扫描时钟 |
|
Shift8 |
8位循环移位寄存器 |
|
MUX8 |
数据输入选择 |
|
MUX2 |
使能选择 |
|
LUT |
数据译码器 |
表10-3 子功能块功能描述
建立工程子文件夹后,新建一个以名为HEX8的工程保存在prj下,并在本工程目录的rtl文件夹下新建verilog file文件并以HEX8.v保存。由图10-3可以得出如下的信号列表
|
input Clk; input Rst_n; input En;
input
output output |
这里先编写分频模块,从系统时钟50M分频得到1KHz的扫描时钟,计数器值即为'd25000,这样计数器的位宽定义为15位即可。
|
reg reg clk_1K; always@(posedge Clk or if(!Rst_n) divider_cnt <= else divider_cnt <= else divider_cnt <= else divider_cnt <= divider_cnt +
always@(posedge Clk or if(!Rst_n) clk_1K <= else clk_1K <= else clk_1K <= clk_1K; |
再编写8位循环移位寄存器,这里利用循环移位寄存器实现0000_0001 ->1000_0000的变化,进而实现数码管的位选,即实现每个扫描时钟周期选择一个数码管。移位寄存器输出值与数码管选通的对应关系如表10-4所示,其中sel7为高位。
|
sel0 |
sel1 |
sel2 |
sel3 |
sel4 |
sel5 |
sel6 |
sel7 |
|
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
数码管0 |
|
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
数码管1 |
|
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
数码管2 |
|
…… |
||||||||
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
数码管7 |
表10-4 移位寄存器与数码管对应关系
|
reg always@(posedge clk_1K or if(!Rst_n) sel_r <= else sel_r <= else sel_r <= sel_r << |
利用8选1多路器,选择端为当前扫描到的数码管,利用多路器将待显示数据输送到对应到数码管上。
|
reg always@(*) case(sel_r) 8'b0000_0001:data_tmp = disp_data[3:0]; 8'b0000_0010:data_tmp = disp_data[7:4]; 8'b0000_0100:data_tmp = disp_data[11:8]; 8'b0000_1000:data_tmp = disp_data[15:12]; 8'b0001_0000:data_tmp = disp_data[19:16]; 8'b0010_0000:data_tmp = disp_data[23:20]; 8'b0100_0000:data_tmp = disp_data[27:24]; 8'b1000_0000:data_tmp = disp_data[31:28]; default:data_tmp = endcase |
前面所说如果要使数码管显示数字或字符,须对数字或字符进行编码译码。这里利用一个4输入查找表,来实现7位输出用做显示译码。
|
always@(*) case(data_tmp) 4'h0:seg = 4'h1:seg = 4'h2:seg = 4'h3:seg = 4'h4:seg = 4'h5:seg = 4'h6:seg = 4'h7:seg = 4'h8:seg = 4'h9:seg = 4'ha:seg = 4'hb:seg = 4'hc:seg = 4'hd:seg = 4'he:seg = 4'hf:seg = endcase |
模块化的设计理念是每个模块以后调用以及控制方便,基于这种理念,这里需要加入使能信号。关于使能子模块,直接利用一个二选一多路器即可实现。
|
assign sel = |
进行分析和综合直至没有错误以及警告。
为了测试仿真编写测试激励文件,新建HEX8_tb.v文件保存到testbench文件夹下,除编写正常的时钟外,输入以下内容再次进行分析和综合直至没有错误以及警告。以下生成了复位信号以及使能信号、待显示数据的初始化以及切换,分别在数码管上显示87654321以及89abcdef。
|
initial Rst_n = En = disp_data = #(`clk_period*20); Rst_n = #(`clk_period*20); #20000000; disp_data = #20000000; disp_data = #20000000; $stop; end |
设置好仿真脚本后进行功能仿真,可以看到如图10-5所示的局部波形文件,可以看出在复位信号置高之前数码管均显示0,在复位结束后数码管才开始正常显示,且当待显示数据为32'h89abcdef(MSB)后,数码管从1到8依次被选通且分别显示为FEDCBA98(LSB)。即仿真通过。

图10-5 数码管功能仿真波形图
为了更便捷的进行板级调试,这里介绍Qusrtus II自带的的In system sources and probes editor(ISSP)调试工具,测试数码管可以只用其提供的源,探针等到后面的RAM中再做详细介绍。这样测试整体模块框图就可以简化为如图10-6所示。

图10-6 测试激励整体框图
这里ISSP是以IP核的形式提供的,因此第一步单击Tools—Mega Wizard Plug-In Manager来启动Mega Wizard插件管理器,并新建一个定制IP核;

图10-7 启动Mega Wizard插件管理器
在弹出的图10-8 Mega Wizard插件管理器的参数设置界面中,找到JTAG-accessible Extensions下选择In-System Source and Probes,并将输出目录确定为工程文件夹下的ip文件夹,并以hex_data保存,单击Next。
在弹出的图10-9配置界面中将源位宽定义为32,探针位宽定义为0,然后单击Next即可。

图10-8 Mega Wizard插件管理器参数设置

图10-9-1 ISSP配置界面

图10-9-2 ISSP配置界面

图10-9-3 ISSP配置界面
在本工程目录的rtl文件夹下新建verilog file文件在此文件下输入以下内容并以HEX_top.v保存,并设置为顶层文件。
|
module HXE_top(Clk,Rst_n,sel,seg);
input Clk; input Rst_n;
output output
wire[31:0]disp_data;
hex_data hex_data( .probe(), .source(disp_data) );
HXE8 HXE8( .Clk(Clk), .Rst_n(Rst_n), .En(1'b1), .disp_data(disp_data), .sel(sel), .seg(seg) ); endmodule |
分配引脚后全编译无误后下载工程到开发板中。这时可以看到数码管全显示0,与设计一致。在Quartus II中点击Tools—In-System Source and Probes Editor启动ISSP,启动后的界面如图10-11所示。这里需手动选择下载器,并将数据格式改为设计中的hex格式。

图10-10 启动ISSP

图10-11 ISSP操作界面

图10-12 切换数据格式
这样ISSP界面的Data中输入相应的数据即可在数码管上看到与之对应的显示,如图10-13所示。



图10-13 数码管显示数据
至此完成了数码管的动态显示。本节主要介绍了数码管显示数字原理、数码管动态扫描显示原理以及In system sources and probes editor(ISSP)调试工具的基本使用。
10-8位7段数码管驱动实验——小梅哥FPGA设计思想与验证方法视频教程配套文档的更多相关文章
- AC620教程 第十五节 8位7段数码管驱动设计与验证
本章导读 电子系统中常用的显示设备有数码管.LCD液晶以及VGA显示器等.其中数码管又可分为段式显示(7段.米字型等)以及点阵显示(8*8.16*16等),LCD液晶的应用可以分为字符式液晶(1602 ...
- 小梅哥FPGA数字逻辑设计教程——基于线性序列机的TLC5620型DAC驱动设计
基于线性序列机的TLC5620型DAC驱动设计 目录 TLC5620型DAC芯片概述: 2 TLC5620型DAC芯片引脚说明: 2 TLC5620型DAC芯片详细介绍: 3 TLC ...
- [51单片机] 以从0开始做4位8段共阴数码管3461AS驱动谈细节决定高质量DIY
目录 1)问题产生 2)失败尝试 3)最终方案 4)使用方法 5)知识共享 1)问题产生 在上一篇“以PWM控制直流电机为例建一个简单的51工程框架”中已向大家介绍了一个封装好的8位8段数码管的驱动( ...
- 音响音箱/恒温壶/电量显示/电子数字时钟等LED数码管显示驱动IC-VK1640B 8段12位/12段8位显示
市面上最常用的数码管为七段/八段显示,八段数码管比七段数码管多一个发光二极管单元(比七段数码管多一个点),又按能显示多少个"8"可分为1位.2位.4位等等.数码管又分为共阳极驱动/ ...
- C# 打印PDF文档的10种方法
操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些 ...
- 在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入
MongoDB,被归类为NoSQL数据库,是一个以类JSON格式存储数据的面向文档的数据库系统.MongoDB在底层以名为bson的二进制编码格式表示JSON文档,MongoDB bson实现是轻量级 ...
- 求助下 Ubuntu 15.10(64 位)下安装 pyspider 下的问题 - V2EX
https://www.v2ex.com/t/279405 求助下 Ubuntu 15.10(64 位)下安装 pyspider 下的问题 - V2EX pip 更新到最新 sudo apt inst ...
- 在debian下安装QT 5.10 32位
准备工作: 在开始之前最好把GCC升级到5.0以上. 如果升级后出现“libstdc++.so.6: version `CXXABI_1.3.9' not found”错误,可以参考https://b ...
- “全能”选手—Django 1.10文档中文版Part1
本文是博主翻译的Django1.10版本官方文档的第一部分,如时间充裕,争取一直翻译下去,经验不足,或有错漏,敬请指正. 另外对于公开文档进行翻译的版权问题不是很清楚,如有侵权请联系我! 另外,要转载 ...
随机推荐
- C语言
HTML的学习早已落下帷幕,我们已经进入了C语言的学习,这段时间时间主要学了运算符.表达式.循环语句以及数组和字符串,感觉到了一种朦朦胧胧懂得尴尬. 运算符主要包括:算术运算符.赋值运算符.关系运算符 ...
- MyBatis学习总结(一)——MyBatis快速入门(转载)
本文转载自http://www.cnblogs.com/jpf-java/p/6013537.html MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了 ...
- SQL Server 2014 Backup Encryption
转载自: Microsoft MVP Award Program Blog 来源:Microsoft MVP Award Program Blog 的博客:https://blogs.msdn.mic ...
- sublime 配置jade高亮显示
1.下载 Package Control.sublime-package 文件放入Packages文件目录下 2.control + shift + p 输入install package 3. ...
- js保留两位小数
js保留两位小数四舍五入: (Math.floor(until_price*100)/100).toFixed(2);//会四舍五入 保留两位小数 且不四舍五入(三种方式,请用最后一种): var ...
- ng-selected ng-change
<!DOCTYPE HTML><html ng-app="myApp"><head><meta http-equiv="Cont ...
- haproxy学习之https配置
haproxy学习之https配置 原文 http://www.cnblogs.com/ilanni/p/4941056.html 如何配置https,以及https在实际生产环境中的应用. ...
- js瀑布流(定位法)
1.首先,自己写好图片路径,引入jquery <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...
- duilib各种布局的作用,相对布局与绝对布局的的意义与用法
大多数刚使用duilib的朋友时候非常依赖duilib自带的设计器,用他可以拖拉控件,可视化的做出自己想要的界面.可是用一段时间就会发现原带的设计器有很多bug,时不时会崩溃,支持的控件数量有限,属性 ...
- CSS实现单行、多行文本溢出显示省略号(…)
如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来,当然还需要加宽度width属来兼容部分浏览. 实现方法: overflow: hidden; te ...