芯航线——普利斯队长精心奉献

 

实验目的: 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
[31:0]disp_data;

 

output
[7:0] sel;

output
reg
[6:0] seg;

 

这里先编写分频模块,从系统时钟50M分频得到1KHz的扫描时钟,计数器值即为'd25000,这样计数器的位宽定义为15位即可。

reg
[14:0]divider_cnt;

reg clk_1K;

always@(posedge Clk or
negedge Rst_n)

if(!Rst_n)

divider_cnt <=
15'd0;

else
if(!En)

divider_cnt <=
15'd0;

else
if(divider_cnt ==
24999)

divider_cnt <=
15'd0;

else

divider_cnt <= divider_cnt +
1'b1;

 

always@(posedge Clk or
negedge Rst_n)

if(!Rst_n)

clk_1K <=
1'b0;

else
if(divider_cnt ==
24999)

clk_1K <=
~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
[7:0]sel_r;

always@(posedge clk_1K or
negedge Rst_n)

if(!Rst_n)

sel_r <=
8'b0000_0001;

else
if(sel_r ==
8'b1000_0000)

sel_r <=
8'b0000_0001;

else

sel_r <= sel_r <<
1;

 

利用8选1多路器,选择端为当前扫描到的数码管,利用多路器将待显示数据输送到对应到数码管上。

reg
[3:0]data_tmp;

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 =
4'b0000;

endcase

 

前面所说如果要使数码管显示数字或字符,须对数字或字符进行编码译码。这里利用一个4输入查找表,来实现7位输出用做显示译码。

always@(*)

case(data_tmp)

4'h0:seg =
7'b1000000;

4'h1:seg =
7'b1111001;

4'h2:seg =
7'b0100100;

4'h3:seg =
7'b0110000;

4'h4:seg =
7'b0011001;

4'h5:seg =
7'b0010010;

4'h6:seg =
7'b0000010;

4'h7:seg =
7'b1111000;

4'h8:seg =
7'b0000000;

4'h9:seg =
7'b0010000;

4'ha:seg =
7'b0001000;

4'hb:seg =
7'b0000011;

4'hc:seg =
7'b1000110;

4'hd:seg =
7'b0100001;

4'he:seg =
7'b0000110;

4'hf:seg =
7'b0001110;

endcase

    

模块化的设计理念是每个模块以后调用以及控制方便,基于这种理念,这里需要加入使能信号。关于使能子模块,直接利用一个二选一多路器即可实现。

assign sel =
(En)?sel_r:8'b0000_0000;

 

进行分析和综合直至没有错误以及警告。

    为了测试仿真编写测试激励文件,新建HEX8_tb.v文件保存到testbench文件夹下,除编写正常的时钟外,输入以下内容再次进行分析和综合直至没有错误以及警告。以下生成了复位信号以及使能信号、待显示数据的初始化以及切换,分别在数码管上显示87654321以及89abcdef。

initial
begin

Rst_n =
1'b0;

En =
1;

disp_data =
32'h12345678;

#(`clk_period*20);

Rst_n =
1;

#(`clk_period*20);

#20000000;

disp_data =
32'h87654321;

#20000000;

disp_data =
32'h89abcdef;

#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;
//50M

input Rst_n;

 

output
[7:0] sel;//数码管位选(选择当前要显示的数码管)

output
[6:0] seg;//数码管段选(当前要显示的内容)

 

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设计思想与验证方法视频教程配套文档的更多相关文章

  1. AC620教程 第十五节 8位7段数码管驱动设计与验证

    本章导读 电子系统中常用的显示设备有数码管.LCD液晶以及VGA显示器等.其中数码管又可分为段式显示(7段.米字型等)以及点阵显示(8*8.16*16等),LCD液晶的应用可以分为字符式液晶(1602 ...

  2. 小梅哥FPGA数字逻辑设计教程——基于线性序列机的TLC5620型DAC驱动设计

    基于线性序列机的TLC5620型DAC驱动设计 目录 TLC5620型DAC芯片概述:    2 TLC5620型DAC芯片引脚说明:    2 TLC5620型DAC芯片详细介绍:    3 TLC ...

  3. [51单片机] 以从0开始做4位8段共阴数码管3461AS驱动谈细节决定高质量DIY

    目录 1)问题产生 2)失败尝试 3)最终方案 4)使用方法 5)知识共享 1)问题产生 在上一篇“以PWM控制直流电机为例建一个简单的51工程框架”中已向大家介绍了一个封装好的8位8段数码管的驱动( ...

  4. 音响音箱/恒温壶/电量显示/电子数字时钟等LED数码管显示驱动IC-VK1640B 8段12位/12段8位显示

    市面上最常用的数码管为七段/八段显示,八段数码管比七段数码管多一个发光二极管单元(比七段数码管多一个点),又按能显示多少个"8"可分为1位.2位.4位等等.数码管又分为共阳极驱动/ ...

  5. C# 打印PDF文档的10种方法

    操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些 ...

  6. 在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入

    MongoDB,被归类为NoSQL数据库,是一个以类JSON格式存储数据的面向文档的数据库系统.MongoDB在底层以名为bson的二进制编码格式表示JSON文档,MongoDB bson实现是轻量级 ...

  7. 求助下 Ubuntu 15.10(64 位)下安装 pyspider 下的问题 - V2EX

    https://www.v2ex.com/t/279405 求助下 Ubuntu 15.10(64 位)下安装 pyspider 下的问题 - V2EX pip 更新到最新 sudo apt inst ...

  8. 在debian下安装QT 5.10 32位

    准备工作: 在开始之前最好把GCC升级到5.0以上. 如果升级后出现“libstdc++.so.6: version `CXXABI_1.3.9' not found”错误,可以参考https://b ...

  9. “全能”选手—Django 1.10文档中文版Part1

    本文是博主翻译的Django1.10版本官方文档的第一部分,如时间充裕,争取一直翻译下去,经验不足,或有错漏,敬请指正. 另外对于公开文档进行翻译的版权问题不是很清楚,如有侵权请联系我! 另外,要转载 ...

随机推荐

  1. alternatives命令用法

    alternatives是Linux下的一个功能强大的命令.只能在根权限下执行.如系统中有几个命令功能十分类似,却又不能随意删除,那么可以用替代指定一个全局的设置.alternatives常用于同一个 ...

  2. 纯Java配置使用slf4j配置log4j

    工程目录如下 代码里面用的是slf4j,但是想要用log4j来管理日志,就得添加slf4j本来的jar,然后添加log4j和slf4j箱关联的jar即可. 如果是maven项目的话添加下面的依赖即可 ...

  3. centos部署gitlab服务器

    gitlab的安装和配置非常简单,关于git,这里摘抄一下百度百科: Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git是一个开源的分布式版本控制系统,可以有效. ...

  4. web自动化测试中绕开验证码登陆的方式

    web自动化测试中登陆需验证码是很大的一个困扰.现推荐一种简单的避开验证码登陆的方式,先代码进入登录页,人工输入验证码登录后浏览器自动保存cookie,再在新的标签中登录. 具体代码如下: publi ...

  5. svn中第一次check out working copy项目下来出现 ld: library not found for -lcrypto clang: error: linker command failed with exit code 1 (use -v to see invocation)

    这个问题主要是.a文件的忽略删除,需要更改设置,并且把文件重新添加

  6. selenium webdriver自动化测试

    selenium家族介绍           Selenium IDE:Selenium IDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能.   Selenium ...

  7. 如何给main传参数

    main 函数的参数有连个argc argcv[]  argc 是参数个数 argcv是参数的数组指针,且argcv的第一个参数是默认程序路径加程序名 给main传参数,需要在命令行启动程序时设置 如 ...

  8. Immutable api example

    var temp=[{name:"kitty",age:31},{name:"ff",age:22},{name:"kitty",age:4 ...

  9. 使用PowerShell解三道测试开发笔试题

    在网上看到了三道测试开发的笔试题,答案是用Python解的.这段时间正好在学PowerShell,练习一下:) 1. 验证邮箱格式 2. 获取URL的后缀名 3. 获取前一天时间或前一秒 我的解法是: ...

  10. 79. Word Search

    使用的别人的思路,用一个二维数组记录每一个位置是否用过,然后通过递归来判断每一个位置是否符合 public class Solution { public boolean exist(char[][] ...