八位七段数码管动态显示电路的设计
一七段显示器介绍
七段显示器,在许多产品或场合上经常可见。其内部结构是由八个发光二极管所组成,为七个笔画与一个小数点,依顺时针方向为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、七段显示器模块接线图
七段显示器之常见应用如下
?可作为与数值显示相关之设计。
?电子时钟应用显示
?倒数定时器
?秒表
?计数器、定时器
?算数运算之数值显示器
二七段显示器显示原理
七段显示器可用来显示单一的十进制或十六进制的数字,它是由八个发光二极管所构成的( 每一个二极管依位置不同而赋予不同的名称,请参见图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(设计资源)的介绍
本程序中用到3个库函数包:如下:
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
--类型被当作符号数或无符号数一样进行运算补充:当使用库时,需要说明使用的库名称,同时需要说明库中包集合的名称及范围;每个实体都应独立进行库的说明;库的说明应该在实体之前;经过说明后,实体和结构体就可以自动调用库中的资源;
②实体 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)的端口信息,它并不描述器件的具体功能。在电路原理图上实体相当于元件符号。
…0)
Key(3..0)…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所有引脚全部分配结束后的软件窗口
表4-2端口管脚分配表
值得注意的是,当管脚分配完之后一定要进行再进行一次全编译,以使分配的管脚有效。
4、对设计文件进行仿真
1)创建一个仿真波形文件,选择QUARTUSII 软件File>New ,进行新建文件对话框。如图1-24所示。选取对话框的Other File 标签页,从中选取Vector Waveform File ,点击OK 按钮,则打开了一个空的波形编辑器窗口,如图1-25所示。
图1-24 新建文件对话框 图1-25 波形编辑器
端口名 使用模块信号 对应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
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 仿真波形