1八位七段数码管动态显示电路的设计一七段显示器介绍七段显示器,在许多产品或场合上经常可见。其内部结构是由八个发光二极管所组成,为七个笔画与一个小数点,依顺时针方向为A、B、C、D、E、F、G与DP等八组发光二极管之排列,可用以显示0~9数字及英文数A、b、C、d、E、F。目前常用的七段显示器通常附有小数点,如此使其得以显示阿拉伯数之小数点部份。七段显示器的脚位和线路图如下图4.1所示(其第一支接脚位于俯视图之左上角)。图4.1、七段显示器俯视图由于发光二极管只有在顺向偏压的时候才会发光。因此,七段显示器依其结构不同的应用需求,区分为低电位动作与高电位动作的两种型态的组件,另一种常见的说法则是共阳极(低电位动作)与共阴极(高电位动作)七段显示器,如下图4.2所示。(共阳极)(共阴极)图4.2、共阳极(低电位动作)与共阴极(高电位动作)2要如何使七段显示器发光呢?对于共阴极规格的七段显示器来说,必须使用“SinkCurrent”方式,亦即是共同接脚COM为VCC,并由CycloneIIFPGA使接脚成为高电位,进而使外部电源将流经七段显示器,再流入CycloneIIFPGA的一种方式本实验平台之七段显示器模块接线图如下图4.5所示。此平台配置了八组共阳极之七段显示器,亦即是每一组七段显示器之COM接脚,均接连至VCC电源。而每一段发光二极管,其脚位亦均与CycloneIIFPGA接连。四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。图4.5、七段显示器模块接线图七段显示器之常见应用如下可作为与数值显示相关之设计。电子时钟应用显示倒数定时器秒表计数器、定时器算数运算之数值显示器3二七段显示器显示原理七段显示器可用来显示单一的十进制或十六进制的数字,它是由八个发光二极管所构成的(每一个二极管依位置不同而赋予不同的名称,请参见图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、共阳极七段显示器显示数字编码资料DPGFEDCBA16进制011000000C0111111001F9210100100A4310110000B0410011001995100100109261000001082711111000F881000000080本实验要求完成的任务是在时钟信号的作用下,通过输入的键值在数码管上显示相应的键值。在实验中时,数字时钟选择1KHZ作为扫描时钟,用四个拨动开关做为输入,当四个拨动开关置为一个二进制数时,在数码管上显示其十六进制的值。实验箱中的拨动开关与FPGA的接口电路,以及拨动开关FPGA的管脚连接在实验一中都做了详细说明,这里不在赘述。4数码管显示模块的电路原理如图4-2所示,图4-2数字时钟信号模块电路原理三实验步骤(本实验用VHDL文本语言实现八位七段数码管动态显示,当然也可用Quartus的图形输入法实现八位七段数码管动态显示)1.下面我们建立一个八位七段数码管动态显示的VHDL工程1)选择开始程序AlteraQuartusII5.1,运行QUARTUSII软件。或者双击桌面上的QUARTUSII的图标运行QUARTUSII软件,出现如图1-3所示。图1-3QUARTUSII软件运行界面52)选择软件中的菜单FileNewProjectWizard,新建一个工程。如图1-4所示。图1-4新建工程对话框3)点击图1-4中的NEXT进入工作目录,工程名的设定对话框如图1-5所示。第一个输入框为工程目录输入框,用户可以输入如e:/eda等工作路径来设定工程的目录,设定好后,所有的生成文件将放入这个工作目录。第二个输入框为工程名称输入框,第三个输入框为顶层实体名称输入框。用户可以设定如EXP1,一般情况下工程名称与实体名称相同。使用者也可以根据自已的实际情况来设定工程名和顶层文件名。注:本处的顶层文件名必须和程序的实体名一致,否则编译会出错。图1-5指定工程名称及工作目录64)点击NEXT,进入下一个设定对话框,按默认选项直接点击NEXT进行器件选择对话框。如图1-6所示。这里我们以选用CycloneII系列芯片EP2C35F672C8为例进行介绍。用户可以根据使用的不同芯片来进行设定。图1-6器件选择界面首先在对话框的左上方的Family下拉菜单中选取CycloneII,在中间右边的Speedgrade下拉菜单中选取8,在左下方的Availabledevices框中选取EP2C35F672C8,点击NEXT完成器件的选取,进入EDATOOL设定界面如图1-7所示。图1-7EDATOOL对话框75)按默认选项,点击Next出现新建工程以前所有的设定信息,如图1-8所示,点击Finish完成新建工程的建立。图1-8新建工程信息2、建立VHDL设计文件1)在创建好设计工程后,选择FileNEW…菜单,出现图1-9所示的新建设计文件类型选择窗口。这里我们以建立VHDL设计文件为例进行说明。8图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);--定义四位输入信号9ledag:outstd_logic_vector(6downto0);--定义七位输出信号del:outstd_logic_vector(2downto0)--定义八位数码管位置显示信号);endexp4;--结束实体--------------------------------------------------------------------architecturewhbkrcofexp4is--whbkrc为结构体名begin--以begin为标志开始结构体的描述process(clk)--进程,clk变化时启动进程variabledount:std_logic_vector(2downto0);--变量,计数beginifclk'eventandclk='1'then--检测时钟上升沿dount:=dount+1;--计数器dount累加endif;del=dount;--片选信号endprocess;--结束进程process(key)--进程,key变化时启动进程begincasekeyiswhen0000=ledag=0111111;--七段数码管显示0when0001=ledag=0000110;--1when0010=ledag=1011011;--2when0011=ledag=1001111;--3when0100=ledag=1100110;--4when0101=ledag=1101101;--5when0110=ledag=1111101;--6when0111=ledag=0000111;--7when1000=ledag=1111111;--8when1001=ledag=1101111;--9when1010=ledag=1110111;--R10when1011=ledag=1111100;--bwhen1100=ledag=0111001;--Cwhen1101=ledag=1011110;--dwhen1110=ledag=1111001;--Ewhen1111=ledag=1110001;--Fwhenothers=null;endcase;endprocess;--结束进程endwhbkrc;--结束结构体关于VHDL,我们以上面八位七段数码管显示程序为例来解释VHDL的语法构成,以使大家对VHDL有个整体的把握。一个VHDL程序有三部分构成,其为:1.库和包library(设计资源);2.实体entity(外部端口)3.结构体architecture(内部结构)①库和包library(设计资源)的介绍本程序中用到3个库函数包:如下:补充:当使用库时,需要说明使用的库名称,同时需要说明库中包集合的名称及范围;每个实体都应独立进行库的说明;库的说明应该在实体之前;经过说明后,实体和结构体就可以自动调用库中的资源;②实体entity(外部端口)entityexp4is--exp4为实体名port(clk:instd_logic;--定义动态扫描时钟信号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--类型被当作符号数或无符号数一样进行运算11key: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);--变量,计数beginifclk'eventandclk='1'then--检测时钟上升沿dount:=dount+1;--计数器dount累加endif;del=dount;--片选信号