芯航线——普利斯队长精心奉献
实验目的: 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段数码管的驱动( ...
-
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版本官方文档的第一部分,如时间充裕,争取一直翻译下去,经验不足,或有错漏,敬请指正. 另外对于公开文档进行翻译的版权问题不是很清楚,如有侵权请联系我! 另外,要转载 ...
-
Django 1.10文档中文版Part1
目录 第一章.Django1.10文档组成结构1.1 获取帮助1.2 文档的组织形式1.3 第一步1.4 模型层1.5 视图层1.6 模板层1.7 表单1.8 开发流程1.9 admin站点1.10 ...
随机推荐
-
[HTML/HTML5]1 HTML文档设置
1.1 创建HTML文件 本质上,HTML文件就是具有下列两个特征的简单文本文件: HTML文件的扩展名为.html或者.htm.文件扩展名是一个缩写,它可将文件正确地关联到需要访问它的程序或工具. ...
-
oracle中用户删除不了,ORA-01940提示 “无法删除当前已连接用户”
Oracle删除用户的提示无法删除当前已连接用户两种解决方法如下: 1.先锁定用户.然后查询进程号,最后删除对应的进程.在删除对应的用户 SQL>alter user XXX account l ...
-
kali linux 一些工具及命令集1(搜集DNS信息)
DNS信息收集 1.dnsdict6 用于查看ipv6的dns信息,国内很少ipv6,基本无用 2.dnsmap 收集dns信息,同类别还有dnsenum,dnswalk 使用dnsmap需先找到 ...
-
爬虫遇到取到网页为reload的问题
有的网站防采集,会在页面加上this.window.location.reload(),这时候你就会得到如下代码: <html> <head> <meta ...
-
【HDU2122】Ice_cream’s world III(MST基础题)
2坑,3次WA. 1.判断重边取小.2.自边舍去. (个人因为vis数组忘记初始化,WA了3次,晕死!!) #include <iostream> #include <cstring ...
-
黑洞有毛 or 黑洞无毛:4星|《环球科学》2019年03月号
<环球科学>2019年03月号 高水平的科普杂志.本期我感兴趣的话题有: 1:65岁以上老年人是转发假新闻的主力: 2:人的面孔特征可以通过50个维度来定义: 3:华裔科学家发现人脑颞叶中 ...
-
mac中更改xampp的根目录
方法一: 1 打开 应用程序->XAMPP->xamppfiles->etc->httpd.conf 文档 2 commond+f搜索htdocs,搜到如下结果 # Docum ...
-
Android基础知识学习
IPC (Inter-Process Communication) 意思是: 进程间的通信,是指两个进程之间进行数据交换的过程. Android中如何开启多进程呢? 只需要给四大组件(Activit ...
-
MVC+EF CODE FIRST的使用
1创建标准MVC项目 2通过NuGet安装EF 3在Models文件夹中编写实体类 4创建EFDB上下文类 5在webconfig中创建连接字符串,其中name=EFDB上下文类名 6通过管理控制台执 ...
-
[Android]Android数据的四种存储方式
存储方式 Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/d ...