资源描述
八位七段数码管动态显示电路的设计
一 七段显示器介绍
七段显示器,在许多产品或场合上经常可见。其内部结构是由八个发光二极管所组成,为七个笔画与一个小数点,依顺时针方向为A、B、C、D、E、F、G与DP等八组发光二极管之排列,可用以显示0~9数字及英文数A、b、C、d、E、F。目前常用的七段显示器通常附有小数点,如此使其得以显示阿拉伯数之小数点部份。七段显示器的脚位和线路图如下图4.1所示( 其第一支接脚位于俯视图之左上角 )。
图4.1、七段显示器俯视图
由于发光二极管只有在顺向偏压的时候才会发光。因此,七段显示器依其结构不同的应用需求,区分为低电位动作与高电位动作的两种型态的组件,另一种常见的说法则是共阳极( 低电位动作 )与共阴极( 高电位动作 )七段显示器,如下图4.2所示。
( 共阳极 ) ( 共阴极 )
图4.2、共阳极(低电位动作)与共阴极(高电位动作)
要如何使七段显示器发光呢?对于共阴极规格的七段显示器来说,必须使用“ Sink Current ”方式,亦即是共同接脚COM为VCC,并由Cyclone II FPGA使接脚成为高电位,进而使外部电源将流经七段显示器,再流入Cyclone II FPGA的一种方式
本实验平台之七段显示器模块接线图如下图4.5所示。此平台配置了八组共阳极之七段显示器,亦即是每一组七段显示器之COM接脚,均接连至VCC电源。而每一段发光二极管,其脚位亦均与Cyclone II FPGA接连。四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。
图4.5、七段显示器模块接线图
七段显示器之常见应用如下
Ø 可作为与数值显示相关之设计。
n 电子时钟应用显示
n 倒数定时器
n 秒表
n 计数器、定时器
n 算数运算之数值显示器
二 七段显示器显示原理
七段显示器可用来显示单一的十进制或十六进制的数字,它是由八个发光二极管所构成的( 每一个二极管依位置不同而赋予不同的名称,请参见图4.1 ) 。我们可以简单的说,要产生数字,便是点亮特定数据的发光二极管。例如要产生数字「0」,须只点亮A、B、C、D、E、F等节段的发光二极管;要产生数字「5」,则须点亮A、C、D、F、G等节段发光二极管,以此类推,参见图4.6。因此,以共阳极七段显示器而言,要产生数字「0」,必须控制Cyclone II FPGA芯片接连至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-3 QUARTUSII软件运行界面
2)选择软件中的菜单File > New Project Wizard,新建一个工程。如图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,在中间右边的Speed grade下拉菜单中选取8,在左下方的Available devices框中选取EP2C35F672C8,点击NEXT完成器件的选取,进入EDA TOOL设定界面如图1-7所示。
图1-7 EDA TOOL对话框
5)按默认选项,点击Next出现新建工程以前所有的设定信息,如图1-8所示,点击Finish完成新建工程的建立。
图1-8 新建工程信息
2、建立VHDL设计文件
1)在创建好设计工程后,选择File > NEW…菜单,出现图1-9所示的新建设计文件类型选择窗口。这里我们以建立VHDL设计文件为例进行说明。
图1-9 新建设计文件选择窗口
2)在New对话框(图1-9)中选择Device Design Files页下的VHDL File,点击OK按钮,打开图形编辑器对话框,如图1-10所示。图中标明了常用的每个按钮的功能
3) 在文本编辑器中输入如下VHDL程序:
--下面是引用库 -------------------------------------
library ieee; --库函数
use ieee.std_logic_1164.all;--定义了std_logic数据类型及相应运算
use ieee.std_logic_arith.all;--定义了signed和unsigned数据类型、相应运算和相关类型转换函数
use ieee.std_logic_unsigned.all;--定义了一些函数,可以使std_logic_vector类
--型被当作符号数或无符号数一样进行运算
--------------------------------------------------------------------
--下面是构造实体
entity exp4 is --exp4为实体名
port( clk : in std_logic; --定义动态扫描时钟信号
key : in std_logic_vector(3 downto 0); --定义四位输入信号
ledag : out std_logic_vector(6 downto 0); --定义七位输出信号
del : out std_logic_vector(2 downto 0) --定义八位数码管位置显示信号
);
end exp4; --结束实体
--------------------------------------------------------------------
architecture whbkrc of exp4 is --whbkrc为结构体名
begin --以begin为标志开始结构体的描述
process(clk) --进程,clk变化时启动进程
variable dount : std_logic_vector(2 downto 0); --变量,计数
begin
if clk'event and clk='1' then--检测时钟上升沿
dount:=dount+1;--计数器dount累加
end if;
del<=dount; --片选信号
end process;--结束进程
process(key) --进程,key变化时启动进程
begin
case key is
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
when others => null;
end case;
end process; --结束进程
end whbkrc; --结束结构体
关于VHDL,我们以上面八位七段数码管显示程序为例来解释VHDL的语法构成,以使大家对VHDL有个整体的把握。
一个VHDL程序有三部分构成,其为 :
1.库和包 library(设计资源);
2. 实体 entity(外部端口)
3. 结构体 architecture(内部结构)
① 库和包 library(设计资源)的介绍
1.1 use ieee.std_logic_1164.all;--定义了std_logic数据类型及相应运算
1.2 use ieee.std_logic_arith.all;--定义了signed和unsigned数据类型、相应运算
--和相关类型转换函数
1.3 use ieee.std_logic_unsigned.all;--定义了一些函数,可以使std_logic_vector
--类型被当作符号数或无符号数一样进行运算
本程序中用到3个库函数包:如下 :
补充:当使用库时,需要说明使用的库名称,同时需要说明库中包集合的名称及范围;每个实体都应独立进行库的说明;库的说明应该在实体之前;经过说明后,实体和结构体就可以自动调用库中的资源;
② 实体 entity(外部端口)
entity exp4 is --exp4为实体名
port( clk : in std_logic; --定义动态扫描时钟信号
key : in std_logic_vector(3 downto 0); --定义四位输入信号
ledag : out std_logic_vector(6 downto 0); --定义七位输出信号
del : out std_logic_vector(2 downto 0) --定义八位数码管位置显示信
);
end exp4; --结束实体
实体说明主要描述对象的外貌,即对象的输入和输出(I/O)的端口信息,它并不描述器件的具体功能。在电路原理图上实体相当于元件符号。
CLK del(2…0)
Key(3..0) ledag(7…0)
图4-9
实体exp4中描述如上图4-9输入和输出(I/O)的端口信息
③ 结构体 architecture(内部结构)
结构体具体指明了该设计实体的行为,定义了该设计实体的功能,规定了该设计实体的数据流程,指派了实体中内部元件的连接关系。
architecture whbkrc of exp4 is --whbkrc为结构体名
begin --以begin为标志开始结构体的描述
process(clk) --进程,clk变化时启动进程
variable dount : std_logic_vector(2 downto 0); --变量,计数
begin
if clk'event and clk='1' then--检测时钟上升沿
dount:=dount+1;--计数器dount累加
end if;
del<=dount; --片选信号
end process;--结束进程
process(key) --进程,key变化时启动进程
begin
case key is
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
when others => null;
end case;
end process; --结束进程
end whbkrc; --结束结构体
4)点击保存按钮,弹出如下选项,将其名命名为exp1,如下图
5)对设计文件进行编译
QUARTUSII编译器窗口包含了对设计文件处理的全过程。在QUARTUSII软件中选择processin>start compilation菜单项,就会自动编译,出现QUARTUSII的编译器窗口,如下图所示
如果文件有错,在软件的下方则会提示错误的原因和位置,以便于使用者进行修改直到设计文件无错。整个编译完成,软件会提示编译成功,
3 管脚分配
在前面选择好一个合适的目标器件(在这个实验中选择为EP2C35F672C8),完成设计的分析综合过程,得到工程的数据文件以后,需要对设计中的输入、输出引脚指定到具体的器件管脚号码,指定管脚号码称为管脚分配或管脚锁定。这里介绍两种方法进行管脚锁定。
1)点击Assignments菜单下面的Assignment Editor,进入到引脚分配窗口。如图1-15所示。
图1-15 进入引脚分配界面
首先将要分配管脚的信号放置在To下方。双击To下方的《New》,如图1-15所示则会出现如图1-16所示界面。
图1-16 信号选择对话框
选择Node Finder…进入如图1-17所示的Node Finder对话框界面。按图1-17中样例设置参数。在Filter窗口选择Pins:all,在Named窗口中输入“*”,点击List在Nodes Found窗口出现所有信号的名称,点击中间的 按钮则Selected Nodes窗口下方出现被选择的端口名称。双击OK按钮,完成设置。进入管脚分配窗口,如图1-18所示。
图1-17 Node Finder对话框
图1-18 管脚分配
在图1-18中以锁定端口key[0]的管脚为例,其它端口的管脚锁定与其基本一致。选择端口key[0]的对应Assignment Name 待其变为蓝色,双击之,出现下拉菜单选取如图1-18所示的Location(Accepts wildcards/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所示。选取对话框的Other File标签页,从中选取Vector Waveform File,点击OK按钮,则打开了一个空的波形编辑器窗口,如图1-25所示。
图1-24 新建文件对话框 图1-25 波形编辑器
2)设置仿真结束时间,波形编辑器默认的仿真结束时间为1µS,根据仿真需要,可以自由设置仿真的结束时间。选择QUARTUSII软件的Edit>End Time命令,弹出线路束时间对话框,在Time框办输入仿真结束时间,点击OK按钮完成设置。
3)加入输入、输出端口,在波形编辑器窗口左边的端口名列表区点击鼠标右键,在弹出的右键菜单中选择Insert Node or Bus…命令,在弹出的Insert Node or Bus对话框如图1-26所示界面中点击Node Finder…按钮。
图1-26 Insert Node or Bus对话框
在出现的Node Finder界面中,如图1-27所示,在Filter列表中选择Pins:all,在Named窗口中输入“*”,点击List在Nodes Found窗口出现所有信号的名称,点击中间的按钮则Selected Nodes窗口下方出现被选择的端口名称。双击OK按钮,完成设置,回到图1-26所示的Insert Node or Bus对话框,双击OK按钮,所有的输入、输出端口将会在端口名列表区内显示出来,如图1-28所示。
图1-27 Node Finder对话框
图1-28 在波形编辑器中加入端口
4)编辑输入端口波形,即指定输入端口的逻辑电平变化,在如图1-28所示的波形编辑窗口中,选择要输入波形的输入端口如clk端口,在端口名显示区左边的波形编辑器工具栏中有要输入的各种波形,其按钮说明如图1-29所示。根据仿真的需要输入波形。以添加输入端口波形clk为例来讲解如何操作:在添加完输入,输出端口后,在每个端口的左边会出现I 或者O字样,分别代表输入,输出,我们只需要添加输入端口波形,首先单击Edit--àEdn Time 左边第一行输入10 ,第二行输入us ,完毕后单击OK,完成了整个仿真时间的设置。然后用波形编辑工具选中Clk的0到40ns后,然后单击高电平,该段波形高电平1,用同样的方法编辑其他时段的波形和其他输入端口的波形,参照图1-30 编辑输入端口波形。
注:输入波形的时间不能过小,最好能达到每段波形最小间隔40ns,否则很可能由于延时造成结果的不如意。
完成后如图1-30所示。最后选择软件的File>Save进行保存。
图1-29 波形编辑器工具栏
\
图1-30 编辑输入端口波形
5)指定仿真器设置,在仿真过程中有时序仿真和功能仿真之分,在这里介绍功能仿真。在QUARTUSII软件中选择Tool>Simulator Tool命令,打开仿真器工具窗口,如图1-31所示。
图1-31 仿真器工具窗口
图1-31
按图1-31上的提示,首先产生功能仿真网表文件,点击产生功能仿真网表的按钮Generate Functional Simulation Netlist,产生功能仿真网表,然后点击开始仿真的START按钮开始进行仿真,直到仿真进度条为100%完成仿真。点击仿真报告窗口按钮Report,观察仿真波形。如图1-32所示。
图1-32 仿真波形
5、从设计文件到目标器件的加载
完成对器件的加载有两种形式,一种是对目标器件进行加载文件,一种是对目标器件的配置芯片进行加载。这里我们介绍对目标器件EP2C35F672C8进行加载的方法。
1)使用下载电缆将PC机与实验系统连接起来。
2)选择QUARTUSII软件的Tool>Programmer命令,进行编程器窗口,如图1-33所示,如果没有设置编程硬件,则编程硬件类型为No Hardware,需要对编程硬件进行设置。点击Hardware Setup…编程硬件设置按钮,进行如图1-34所示的编程硬件设置对话框。
图1-33 编程器窗口
图 1-33
图1-34 编程器硬件设置对话框
3)点击Add Hardware按钮,出现Add Hardware对话框,如图1-35所示。
图1-35 编程硬件选择对话框
4)在Add Hardware对话框中,从Hardware type列表中选择所需要硬件类型,如果是USB接口的请参照用户使用手册中的USB电缆的安装与使用,如果使用的是并口下载线则选取如图1-35所示的硬件类型,点击OK按钮,完成对硬件类型的设置。回到编程器硬件设置窗口, 点击Close按钮退出设置。则在编程器对话框中的编程硬件类型会出现刚才选取的编程器硬件。
5)如果软件已运行一个工程,则在打开编程器的时候,编程器窗口会自动出现这个工程文件要加载到目标器件的文件,如果要加载其它文件可以从其它地方进行添加更改。选好加载文件后,再点选Progam/Configure,编程模式选取JTAG模式,点击STRAT进行文件加载,直到加载进度变为100%,文件成功加载完成。
四 实验现象与结果
以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号源模块的时钟选择为1KHZ,拨动四位拨动开关,使其为一个数值,则八个数码管均显示拨动开关所表示的十六进制的值。
五 实验报告
1、 绘出仿真波形,并作说明。
2、 明扫描时钟是如何工作的,改变扫描时钟会有什么变化。
3 .实验原理、设计过程、编译仿真波形和分析结果、硬件测试结果记录下来。
23
展开阅读全文