八位七段数码管动态显示电路设计方案.docx
《八位七段数码管动态显示电路设计方案.docx》由会员分享,可在线阅读,更多相关《八位七段数码管动态显示电路设计方案.docx(28页珍藏版)》请在冰豆网上搜索。
八位七段数码管动态显示电路设计方案
八位七段数码管动态显示电路的设计
一七段显示器介绍
七段显示器,在许多产品或场合上经常可见。
其内部结构是由八个发光二极管所组成,为七个笔画与一个小数点,依顺时针方向为A、B、C、D、E、F、G与DP等八组发光二极管之排列,可用以显示0~9数字及英文数A、b、C、d、E、F。
目前常用的七段显示器通常附有小数点,如此使其得以显示阿拉伯数之小数点部份。
七段显示器的脚位和线路图如下图4.1所示(其第一支接脚位于俯视图之左上角)。
图4.1、七段显示器俯视图
由于发光二极管只有在顺向偏压的时候才会发光。
因此,七段显示器依其结构不同的应用需求,区分为低电位动作与高电位动作的两种型态的组件,另一种常见的说法则是共阳极(低电位动作)与共阴极(高电位动作)七段显示器,如下图4.2所示。
(共阳极)(共阴极)
图4.2、共阳极(低电位动作)与共阴极(高电位动作)
要如何使七段显示器发光呢?
对于共阴极规格的七段显示器来说,必须使用“SinkCurrent”方式,亦即是共同接脚COM为VCC,并由CycloneIIFPGA使接脚成为高电位,进而使外部电源将流经七段显示器,再流入CycloneIIFPGA的一种方式
本实验平台之七段显示器模块接线图如下图4.5所示。
此平台配置了八组共阳极之七段显示器,亦即是每一组七段显示器之COM接脚,均接连至VCC电源。
而每一段发光二极管,其脚位亦均与CycloneIIFPGA接连。
四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。
八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。
图4.5、七段显示器模块接线图
七段显示器之常见应用如下
Ø可作为与数值显示相关之设计。
⏹电子时钟应用显示
⏹倒数定时器
⏹秒表
⏹计数器、定时器
⏹算数运算之数值显示器
二七段显示器显示原理
七段显示器可用来显示单一的十进制或十六进制的数字,它是由八个发光二极管所构成的(每一个二极管依位置不同而赋予不同的名称,请参见图4.1)。
我们可以简单的说,要产生数字,便是点亮特定数据的发光二极管。
例如要产生数字「0」,须只点亮A、B、C、D、E、F等节段的发光二极管;要产生数字「5」,则须点亮A、C、D、F、G等节段发光二极管,以此类推,参见图4.6。
因此,以共阳极七段显示器而言,要产生数字「0」,必须控制CycloneIIFPGA芯片接连至A、B、C、D、E、F等接脚呈现“低电位”,使电路形成通路状态。
表4.1则为共阳极七段显示器显示之数字编码。
图4.6、七段显示器显示阿拉伯数字
表4.1、共阳极七段显示器显示数字编码
资料
DP
G
F
E
D
C
B
A
16进制
0
1
1
0
0
0
0
0
0
C0
1
1
1
1
1
1
0
0
1
F9
2
1
0
1
0
0
1
0
0
A4
3
1
0
1
1
0
0
0
0
B0
4
1
0
0
1
1
0
0
1
99
5
1
0
0
1
0
0
1
0
92
6
1
0
0
0
0
0
1
0
82
7
1
1
1
1
1
0
0
0
F8
8
1
0
0
0
0
0
0
0
80
本实验要求完成的任务是在时钟信号的作用下,通过输入的键值在数码管上显示相应的键值。
在实验中时,数字时钟选择1KHZ作为扫描时钟,用四个拨动开关做为输入,当四个拨动开关置为一个二进制数时,在数码管上显示其十六进制的值。
实验箱中的拨动开关与FPGA的接口电路,以及拨动开关FPGA的管脚连接在实验一中都做了详细说明,这里不在赘述。
数码管显示模块的电路原理如图4-2所示,
图4-2数字时钟信号模块电路原理
三实验步骤
(本实验用VHDL文本语言实现八位七段数码管动态显示,当然也可用Quartus的图形输入法实现八位七段数码管动态显示)
1.下面我们建立一个八位七段数码管动态显示的VHDL工程
1)选择开始>程序>Altera>QuartusII5.1,运行QUARTUSII软件。
或者双击桌面上的QUARTUSII的图标运行QUARTUSII软件,出现如图1-3所示。
图1-3QUARTUSII软件运行界面
2)选择软件中的菜单File>NewProjectWizard,新建一个工程。
如图1-4所示。
图1-4新建工程对话框
3)点击图1-4中的NEXT进入工作目录,工程名的设定对话框如图1-5所示。
第一个输入框为工程目录输入框,用户可以输入如e:
/eda等工作路径来设定工程的目录,设定好后,所有的生成文件将放入这个工作目录。
第二个输入框为工程名称输入框,第三个输入框为顶层实体名称输入框。
用户可以设定如EXP1,一般情况下工程名称与实体名称相同。
使用者也可以根据自已的实际情况来设定工程名和顶层文件名。
注:
本处的顶层文件名必须和程序的实体名一致,否则编译会出错。
图1-5指定工程名称及工作目录
4)点击NEXT,进入下一个设定对话框,按默认选项直接点击NEXT进行器件选择对话框。
如图1-6所示。
这里我们以选用CycloneII系列芯片EP2C35F672C8为例进行介绍。
用户可以根据使用的不同芯片来进行设定。
图1-6器件选择界面
首先在对话框的左上方的Family下拉菜单中选取CycloneII,在中间右边的Speedgrade下拉菜单中选取8,在左下方的Availabledevices框中选取EP2C35F672C8,点击NEXT完成器件的选取,进入EDATOOL设定界面如图1-7所示。
图1-7EDATOOL对话框
5)按默认选项,点击Next出现新建工程以前所有的设定信息,如图1-8所示,点击Finish完成新建工程的建立。
图1-8新建工程信息
2、建立VHDL设计文件
1)在创建好设计工程后,选择File>NEW…菜单,出现图1-9所示的新建设计文件类型选择窗口。
这里我们以建立VHDL设计文件为例进行说明。
图1-9新建设计文件选择窗口
2)在New对话框(图1-9)中选择DeviceDesignFiles页下的VHDLFile,点击OK按钮,打开图形编辑器对话框,如图1-10所示。
图中标明了常用的每个按钮的功能
3)在文本编辑器中输入如下VHDL程序:
--下面是引用库-------------------------------------
libraryieee。
--库函数
useieee.std_logic_1164.all。
--定义了std_logic数据类型及相应运算
useieee.std_logic_arith.all。
--定义了signed和unsigned数据类型、相应运算和相关类型转换函数
useieee.std_logic_unsigned.all。
--定义了一些函数,可以使std_logic_vector类
--型被当作符号数或无符号数一样进行运算
--------------------------------------------------------------------
--下面是构造实体
entityexp4is--exp4为实体名
port(clk:
instd_logic。
--定义动态扫描时钟信号
key:
instd_logic_vector(3downto0)。
--定义四位输入信号
ledag:
outstd_logic_vector(6downto0)。
--定义七位输出信号
del:
outstd_logic_vector(2downto0)--定义八位数码管位置显示信号
)。
endexp4。
--结束实体
--------------------------------------------------------------------
architecturewhbkrcofexp4is--whbkrc为结构体名
begin--以begin为标志开始结构体的描述
process(clk)--进程,clk变化时启动进程
variabledount:
std_logic_vector(2downto0)。
--变量,计数
begin
ifclk'eventandclk='1'then--检测时钟上升沿
dount:
=dount+1。
--计数器dount累加
endif。
del<=dount。
--片选信号
endprocess。
--结束进程
process(key)--进程,key变化时启动进程
begin
casekeyis
when"0000"=>ledag<="0111111"。
--七段数码管显示0
when"0001"=>ledag<="0000110"。
--1
when"0010"=>ledag<="1011011"。
--2
when"0011"=>ledag<="1001111"。
--3
when"0100"=>ledag<="1100110"。
--4
when"0101"=>ledag<="1101101"。
--5
when"0110"=>ledag<="1111101"。
--6
when"0111"=>ledag<="0000111"。
--7
when"1000"=>ledag<="1111111"。
--8
when"1001"=>ledag<="1101111"。
--9
when"1010"=>ledag<="1110111"。
--R
when"1011"=>ledag<="1111100"。
--b
when"1100"=>ledag<="0111001"。
--C
when"1101"=>ledag<="1011110"。
--d
when"1110"=>ledag<="1111001"。
--E
when"1111"=>ledag<="1110001"。
--F
whenothers=>null。
endcase。
endprocess。
--结束进程
endwhbkrc。
--结束结构体
关于VHDL,我们以上面八位七段数码管显示程序为例来解释VHDL的语法构成,以使大家对VHDL有个整体的把握。
一个VHDL程序有三部分构成,其为:
1.库和包library(设计资源);
2.实体entity(外部端口)
3.结构体architecture(内部结构)
①库和包library(设计资源)的介绍
1.1useieee.std_logic_1164.all。
--定义了std_logic数据类型及相应运算
1.2useieee.std_logic_arith.all。
--定义了signed和unsigned数据类型、相应运算
--和相关类型转换函数
1.3useieee.std_logic_unsigned.all。
--定义了一些函数,可以使std_logic_vector
--类型被当作符号数或无符号数一样进行运算
本程序中用到3个库函数包:
如下:
补充:
当使用库时,需要说明使用的库名称,同时需要说明库中包集合的名称及范围;每个实体都应独立进行库的说明;库的说明应该在实体之前;经过说明后,实体和结构体就可以自动调用库中的资源;
②实体entity(外部端口)
entityexp4is--exp4为实体名
port(clk:
instd_logic。
--定义动态扫描时钟信号
key:
instd_logic_vector(3downto0)。
--定义四位输入信号
ledag:
outstd_logic_vector(6downto0)。
--定义七位输出信号
del:
outstd_logic_vector(2downto0)--定义八位数码管位置显示信
)。
endexp4。
--结束实体
实体说明主要描述对象的外貌,即对象的输入和输出(I/O)的端口信息,它并不描述器件的具体功能。
在电路原理图上实体相当于元件符号。
CLKdel(2…0)
Key(3..0)ledag(7…0)
图4-9
实体exp4中描述如上图4-9输入和输出(I/O)的端口信息
③结构体architecture(内部结构)
结构体具体指明了该设计实体的行为,定义了该设计实体的功能,规定了该设计实体的数据流程,指派了实体中内部元件的连接关系。
architecturewhbkrcofexp4is--whbkrc为结构体名
begin--以begin为标志开始结构体的描述
process(clk)--进程,clk变化时启动进程
variabledount:
std_logic_vector(2downto0)。
--变量,计数
begin
ifclk'eventandclk='1'then--检测时钟上升沿
dount:
=dount+1。
--计数器dount累加
endif。
del<=dount。
--片选信号
endprocess。
--结束进程
process(key)--进程,key变化时启动进程
begin
casekeyis
when"0000"=>ledag<="0111111"。
--七段数码管显示0
when"0001"=>ledag<="0000110"。
--1
when"0010"=>ledag<="1011011"。
--2
when"0011"=>ledag<="1001111"。
--3
when"0100"=>ledag<="1100110"。
--4
when"0101"=>ledag<="1101101"。
--5
when"0110"=>ledag<="1111101"。
--6
when"0111"=>ledag<="0000111"。
--7
when"1000"=>ledag<="1111111"。
--8
when"1001"=>ledag<="1101111"。
--9
when"1010"=>ledag<="1110111"。
--R
when"1011"=>ledag<="1111100"。
--b
when"1100"=>ledag<="0111001"。
--C
when"1101"=>ledag<="1011110"。
--d
when"1110"=>ledag<="1111001"。
--E
when"1111"=>ledag<="1110001"。
--F
whenothers=>null。
endcase。
endprocess。
--结束进程
endwhbkrc。
--结束结构体
4)点击保存按钮,弹出如下选项,将其名命名为exp1,如下图
5)对设计文件进行编译
QUARTUSII编译器窗口包含了对设计文件处理的全过程。
在QUARTUSII软件中选择processin>startcompilation菜单项,就会自动编译,出现QUARTUSII的编译器窗口,如下图所示
如果文件有错,在软件的下方则会提示错误的原因和位置,以便于使用者进行修改直到设计文件无错。
整个编译完成,软件会提示编译成功,
3管脚分配
在前面选择好一个合适的目标器件(在这个实验中选择为EP2C35F672C8),完成设计的分析综合过程,得到工程的数据文件以后,需要对设计中的输入、输出引脚指定到具体的器件管脚号码,指定管脚号码称为管脚分配或管脚锁定。
这里介绍两种方法进行管脚锁定。
1)点击Assignments菜单下面的AssignmentEditor,进入到引脚分配窗口。
如图1-15所示。
图1-15进入引脚分配界面
首先将要分配管脚的信号放置在To下方。
双击To下方的《New》,如图1-15所示则会出现如图1-16所示界面。
图1-16信号选择对话框
选择NodeFinder…进入如图1-17所示的NodeFinder对话框界面。
按图1-17中样例设置参数。
在Filter窗口选择Pins:
all,在Named窗口中输入“*”,点击List在NodesFound窗口出现所有信号的名称,点击中间的按钮则SelectedNodes窗口下方出现被选择的端口名称。
双击OK按钮,完成设置。
进入管脚分配窗口,如图1-18所示。
图1-17NodeFinder对话框
图1-18管脚分配
在图1-18中以锁定端口key[0]的管脚为例,其它端口的管脚锁定与其基本一致。
选择端口key[0]的对应AssignmentName待其变为蓝色,双击之,出现下拉菜单选取如图1-18所示的Location(Acceptswildcards/groups)选项。
选择端口key[0]的对应Value栏,待其变为蓝色,依照表1-2所示的硬件与FPGA的管脚连接表(或附录),输入对应的管脚名AC22,按回车键,软件将自动将其改为PIN_AC22,同时蓝色选择条会自动跳转到Value栏的下一行,这表明软件已经将输入端口key[0]分配到FPGA的AC22引脚上,如图1-19所示。
图1-19给key[0]端口进行管脚分配
用同样的方法,依照表4-2和所示的硬件与FPGA的管脚连接表(或附录),对其它端口进行管脚分配,如图1-20所示。
图1-20所有引脚全部分配结束后的软件窗口
端口名
使用模块信号
对应FPGA管脚
说明
CLK
数字信号源
N2
时钟为1KHZ
KEY0
拨动开关K1
AC22
二进制数据输入
KEY1
拨动开关K2
AD23
KEY2
拨动开关K3
AB8
KEY3
拨动开关K4
AA9
LEDAG0
数码管A段
V17
十六进制数据
输出显示
LEDAG1
数码管B段
W16
LEDAG2
数码管C段
W15
LEDAG3
数码管D段
L10
LEDAG4
数码管E段
V14
LEDAG5
数码管F段
V13
LEDAG6
数码管G段
W12
DEL0
位选DEL0
U12
DEL1
位选DEL1
V20
DEL2
位选DEL2
V21
表4-2端口管脚分配表
值得注意的是,当管脚分配完之后一定要进行再进行一次全编译,以使分配的管脚有效。
4、对设计文件进行仿真
1)创建一个仿真波形文件,选择QUARTUSII软件File>New,进行新建文件对话框。
如图1-24所示。
选取对话框的OtherFile标签页,从中选取VectorWaveformFile,点击OK按钮,则打开了一个空的波形编辑器窗口,如图1-25所示。
图1-24新建文件对话框图1-25波形编辑器
2)设置仿真结束时间,波形编辑器默认的仿真结束时间为1µS,根据仿真需要,可以自由设置仿真的结束时间。
选择QUARTUSII软件的Edit>EndTime命令,弹出线路束时间对话框,在Time框办输入仿真结束时间,点击OK按钮完成设置。
3)加入输入、输出端口,在波形编辑器窗口左边的端口名列表区点击鼠标右键,在弹出的右键菜单中选择InsertNodeorBus…命令,在弹出的InsertNodeorBus对话框如图1-26所示界面中点击NodeFinder…按钮。
图1-26InsertNodeorBus对话框
在出现的NodeFinder界面中,如图1-27所示,在Filter列表中选择Pins:
all,在Named窗口中输入“*”,点击List在NodesFound窗口出现所有信号的名称,点击中间的
按钮则SelectedNodes窗口下方出现被选择的端口名称。
双击OK按钮,完成设置,回到图1-26所示的InsertNodeorBus对话框,双击OK按钮,所有的输入、输出端口将会在端口名列表区内显示出来,如图1-28所示。
图1-27NodeFinder对话框
图1-28在波形编辑器中加入端口
4)编辑输入端口波形,即指定输入端口的逻辑电平变化,在如图1-28所示的波形编辑窗口中,选择要输入波形的输入端口如clk端口,在端口名显示区左边的波形编辑器工具栏中有要输入的各种波形,其按钮说明如图1-29所示。
根据仿真的需要输入波形。
以添加输入端口波形clk为例来讲解如何操作:
在添加完输入,输出端口后,在每个端口的左边会出现I或者O字样,分别代表输入,输出,我们只需要添加输入端口波形,首先单击Edit--EdnTime左边第一行输入10,第二行输入us,完毕后单击OK,完成了整个仿真时间的设置。
然后用波形编辑工具选中Clk的0到40ns后,然后单击
高电平,该段波形高电平1,用同样的方法编辑其他时段的波形和其他输入端口的波形,参照图1-30编辑输入端口波形。
注:
输入波形的时间不能过小,最好能达到每段波形最小间隔40ns,否则很可能由于延时造成结果的不如意。
完成后如图1-30所示。
最后选择软件的File>Save进行保存。
图1-29波形编辑器工具栏
\
图1-30编辑输入端口波形
5)指定仿真器设置,在仿真过程中有时序仿真和功能仿真之分,在这里介绍功能仿真。
在QUARTUSII软件中选择Tool>SimulatorTool命令,打开仿真器工具窗口,如图1-31所示。
图1-31仿真器工具窗口
图1-31
按图1-31上的提示,首先产生功能仿真网表文件,点击产生功能仿真网表的按钮GenerateFunctionalSimulationNetlist,产生功能仿真网表,然后点击开始仿真的START按钮开始进行仿真,直到仿真进度条为100%完成仿真。
点击仿真报告窗口按钮Report,观察仿真波形。
如图1-32所示。
图1-32仿真波形
5、从设计文件到目标器件的加载
完成对器件的加载有两种形式,一种是对目标器件进行加载文件,一种是对目标器件的配置芯片进行加载。
这里我们介绍对目标器件EP2C35F672C8进行加载的方法。
1)使用下载电缆将PC机与实验系统连接起来。
2)选择QUARTUSII软件的Tool>Programmer命令,进行编程器窗口