目 录
引言 ......................................................... 2 第一章 FPGA简介 ............................................... 3 1.1 FPGA概述 .......................................................... 3 1.2 FPGA基本结构 ...................................................... 3 1.3 FPGA系统设计流程 .................................................. 5 1.4 FPGA开发编程原理 .................................................. 7 第二章 数字钟总体设计方案 ....................................... 8 2.1 数字钟的构成 ....................................................... 8 2.2 数字钟的工作原理 ................................................... 8 2.3 数字钟硬件电路设计 ................................................. 8 第三章 单元电路设计 ........................................... 11 3.1 分频模块电路设计 .................................................. 11 3.2 校时控制模块电路设计 .............................................. 12 3.2.1 按键消抖 ...................................................... 12 3.2.2 按键控制模块 .................................................. 13 3.3 计数模块 .......................................................... 16 3.4 译码显示模块 ...................................................... 22 3.5 译码显示强制转换模块 .............................................. 24 3.6 整点报时模块 ...................................................... 24 总结 ....................................................... 26 主要参考文献 .................................................. 27
附录 ........................................................ 28
引言
当今电子产品正向功能多元化,体积最小化,功耗最低化的方向发展。它与传统的电子产品在设计上的显着区别是大量使用大规模可编程逻辑器件,使产品的性能提高,体积缩小,功耗降低,同时广泛运用现代计算机技术,提高产品的自动化程度和竞争力,缩短研发周期。EDA技术正是为了适应现代电子技术的要求,吸收众多学科最新科技成果而形成的一门新技术。
本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级这三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述,覆盖面广,抽象能力强,因此在实际应用中越来越广泛。ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器;而FPGA是特殊的ASIC芯片,与其它的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些都是以钟表数字化为基础的。因此研究数字钟以及扩大其应用有着非常现实的意义。
本设计主要研究基于FPGA的数字钟,要求时间以24小时为一个周期,显示时、分。具有校时以及整点报时功能,可以对时、分进行单独校对,使其校正到标准时间。校对时间由五个按键进行控制,为了保证计时的稳定及准确须由晶体振荡器提供时间基准信号。
第一章 FPGA简介 1.1 FPGA概述
FPGA是现场可编程门阵列(Field Programmable Gate Array)的简称,与之相应的CPLD是复杂可编程逻辑器件(Complex Programmable Logic Device)的简称,两者的功能基本相同,只是实现原理略有不同,有时可以忽略这两者的区别,统称为可编程逻辑器件或CPLD/PGFA。CPLD/PGFA几乎能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路。它如同一张白纸或是一堆积木,工程师可以通过传统的原理图输入或硬件描述语言自由的设计一个数字系统。通过软件仿真可以事先验证设计的正确性,在PCB完成以后,利用CPLD/FPGA的在线修改功能,随时修改设计而不必改动硬件电路。使用CPLD/FPGA开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。这些优点使得CPLD/FPGA技术在20世纪90年代以后得到飞速的发展,同时也大大推动了EDA软件和硬件描述语言HDL的进步。[3]
1.2 FPGA基本结构
FPGA具有掩膜可编程门阵列的通用结构,它由逻辑功能块排成阵列,并由可编程的互连资源连接这些逻辑功能块来实现不同的设计。
FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器SRAM组成。这3种可编程电路是:可编程逻辑模块(CLB--Configurable Logic Block)、输入/输出模块(IOB--I/O Block)和互连资源(IR—Interconnect Resource)。可编程逻辑模块CLB是实现逻辑功能的基本单元,它们通常规则的排列成一个阵列,散布于整个芯片;可编程输入/输出模块(IOB)主要完成芯片上的逻辑与外部封装脚的接口,它通常排列在芯片的四周;可编程互连资源包括各种长度的连接线段和一些可编程连接开关,它们将各个CLB之间或CLB、IOB之间以及IOB之间连接起来,构成特定功能的电路。[4]
1.CLB是FPGA的主要组成部分。图2.1是CLB基本结构框图,它主要由逻辑函数发生器、触发器、数据选择器等电路组成。CLB中3个逻辑函数发生器分别是G、F和H,相应的输出是G’、F’和H’。G有4个输入变量G1、G2、G3和G4;F也有4个输入变量F1、F2、F3和F4。这两个函数发生器是完全的,均可以实现4输入变量的任意组合逻辑函数。逻辑函数发生器H有3个输入信号;前两个是函数发生器的输出G’和F’,而另一个
输入信号是来自信号变换电路的输出H1。这个函数发生器能实现3输入变量的各种组合函数。这3个函数发生器结合起来,可实现多达9变量的逻辑函数。
CLB中有许多不同规格的数据选择器(四选一、二选一等),通过对CLB内部数据选择器的编程,逻辑函数发生器G、F和H的输出可以连接到CLB输出端X或Y,并用来选择触发器的激励输入信号、时钟有效边沿、时钟使能信号以及输出信号。这些数据选择器的地址控制信号均由编程信息提供,从而实现所需的电路结构。
CLB中的逻辑函数发生器F和G均为查找表结构,其工作原理类似于ROM。F和G的输入等效于ROM的地址码,通过查找ROM中的地址表可以得到相应的组合逻辑函数输出。另外,逻辑函数发生器F和G还可以作为器件内高速RAM或小的可读写存储器使用,它由信号变换电路控制。
2.输入/输出模块IOB。IOB提供了器件引脚和内部逻辑阵列之间的连接。它主要由输入触发器、输入缓冲器和输出触发/锁存器、输出缓冲器组成。
每个IOB控制一个引脚,它们可被配置为输入、输出或双向I/O功能。当IOB控制的引脚被定义为输入时,通过该引脚的输入信号先送入输入缓冲器。缓冲器的输出分成两路:一路可以直接送到MUX,另一路延时几个纳秒(或者没有延时)后送到输入通路D触发器,再送到数据选择器。通过编程给数据选择器不同的控制信息,确定送至CLB阵列的I1和I2是来自输入缓冲器,还是来自触发器。
当IOB控制的引脚被定义为输出时,CLB阵列的输出信号OUT也可以有两条传输途径:一条是直接经MUX送至输出缓冲器,另一条是先存入输出通路D触发器,再送至输出缓冲器。
IOB输出端配有两只MOS管,它们的栅极均可编程,使MOS管导通或截止,分别经上拉电阻接通VCC、地线或者不接通,用以改善输出波形和负载能力。
3.可编程互连资源IR。可编程互连资源IR可以将FPGA内部的CLB和CLB之间、CLB和IOB之间连接起来,构成各种具有复杂功能的系统。IR主要由许多金属线段构成,这些金属线段带有可编程开关,通过自动布线实现各种电路的连接。
CLB CLB CLB CLB CLB CLB可编程开关 矩
CLB CLB
CLB CLB CLB CLB 输入输出模块 CLB CLB CLB CLB 互连资源 图2.1 CLB基本结构
1.3 FPGA系统设计流程
一般说来,一个比较大的完整的项目应该采用层次化的描述方法:分为几个较大的模块,定义好各功能模块之间的接口,然后各个模块再细分去具体实现,这就是自顶向下的设计方法。目前这种高层次的设计方法已被广泛采用。高层次设计只是定义系统的行为特征,可以不涉及实现工艺,因此还可以在厂家综合库的支持下,利用综合优化工具将高层次描述转换为针对某种工艺优化的网络表,使工艺转化变得轻而易举。
CPLD/FPGA系统设计的工作流程如图2.2所示。 流程说明:
1.工程师按照“自顶向下”的设计方法进行系统划分。
2.输入VHDL代码,这是设计中最为普遍的输入方式。此外,还可以采用图形输入方式,这种输入方式具有直观、容易理解的优点。
3.将以上的设计输入编译成标准的VHDL文件。
4.进行代码级的功能仿真,主要是检验系统功能设计的正确性。这一步骤适用于大型设计,因为对于大型设计来说,在综合前对源代码仿真,就可以大大减少设计重复的次数和时间。一般情况下,这一仿真步骤可略去。
5.利用综合器对VHDL源代码进行综合优化处理,生成门级描述的网络表文件,这是将高层次描述转化为硬件电路的关键步骤。综合优化是针对ASIC芯片供应商的某一产品系列进行的,所以综合的过程要在相应的厂家综合库的支持下才能完成。
6.利用产生的网络表文件进行适配前的时序仿真,仿真过程不涉及具体器件的硬件特性,是较为粗略的。一般的设计,也可略去这一步骤。
7.利用适配器将综合后的网络表文件针对某一具体的目标器件进行逻辑映射操作,包括底层器件配置、逻辑分割、逻辑优化和布局布线。
8.在适配完成后,产生多项设计结果:a.适配报告,包括芯片内部资源利用情况,设计的布尔方程描述情况等;b.适配后的仿真模型;c.器件编程文件。根据适配后的仿真模型,可以进行适配后时序仿真,因为已经得到器件的实际硬件特性(如时延特性),所以仿真结果能比较精确的预期未来芯片的实际性能。如果仿真结果达不到设计要求,就修改VHDL源代码或选择不同速度和品质的器件,直至满足设计要求。
最后将适配器产生的器件编程文件通过编程器或下载电缆载入到目标芯片CPLD/FPGA中。[5]
适配后时序仿真 CPLD/FPGA实现 ASIC实现 适配后仿真模型 器件编程文件 适配报告 适配器 仿真综合库 综合器 代码级功能仿真 VHDL代码或图形方式输入 系统划分 编译器 适配前时序仿真
图1.2 CPLD/FPGA系统设计流程
1.4 FPGA开发编程原理
硬件设计需要根据各种性能指标、成本、开发周期等因素,确定最佳的实现方案,画出系统框图,选择芯片,设计PCB并最终形成样机。
CPLD/FPGA软件设计可分为两大块:编程语言和编程工具。编程语言主要有VHDL和Verilog两种硬件描述语言;编程工具主要是两大厂家Altera和Xilinx的集成综合EDA软件QuartusII以及第三方工具。具体的设计输入方式有以下几种:
1.HDL语言方式。HDL既可以描述底层设计,也可以描述顶层的设计,但它不容易做到较高的工作速度和芯片利用率。用这种方式描述的项目最后所能达到的性能与设计人员的水平、经验以及综合软件有很大的关系。
2.图形方式。可以分为电路原理图描述,状态机描述和波形描述3种形式。电路原理图方式描述比较直观和高效,对综合软件的要求不高。一般大都使用成熟的IP核和中小规模集成电路所搭成的现成电路,整体放到一片可编程逻辑器件的内部去,其硬件工作速度和芯片利用率很高,但是当项目很大时,该方法就显得有些繁琐;状态机描述主要用来设计基于状态机思想的时序电路。在图形的方式下定义好各个工作状态,然后在各个状态上输入转换条件以及相应的输入输出,最后生成HDL语言描述,送去综合软件综合到可编程逻辑器件的内部。由于状态机到HDL语言有一种标准的对应描述方式,所以这种输入方式最后所能达到的工作速度和芯片利用率主要取决于综合软件;波形描述方式是基于真值表的一种图形输入方式,直接描述输入与输出的波形关系。
第二章 数字钟总体设计方案
2.1 数字钟的构成
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定,通常使用石英晶体振荡器电路构成数字钟。
本设计总体框架见附图。
2.2 数字钟的工作原理
振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数。计数满后各计数器清零,重新计数。计数器的输出分别经译码器送数码管显示。计时出现误差时,可以用校时电路校时、校分。控制信号由1×5矩形键盘输入。时基电路可以由石英晶体振荡电路构成,假设晶振频率1MHz,经过6次十分频就可以得到秒脉冲信号。译码显示电路由八段译码器完成。
2.3 数字钟硬件电路设计
1.系统芯片的选取
本系统拟采用Altera公司Cyclone系列的EP1C3T144芯片。选用该款芯片的原因是:
① Altera公司的Quartus II开发环境非常友好、直观,为整个系统的开发提供了极
大的方便;
② 该FPGA片内逻辑资源、IO端口数和RAM容量都足够用,并且价格相对来说比较便宜,速度快,可以满足要求,且有很大的升级空间。
EP1C3T144是Altera公司生产的Cyclone I代、基于1.5V(内核),3.3V(I/O),0.13um和SRAM的FPGA,容量为2910个LE,拥有13个 M4KRAM(4K位+奇偶校验)块;除此之外,还集成了许多复杂的功能,提供了全功能的锁相环(PLL),用于板级的时钟网络管理和专用I/O口,这些接口用于连接业界标准的外部存储器器件,具有成本低和使用方便的特点,具有以下特性:
① 新的可编程架构通过设计实现低成本;
② 嵌入式存储资源支持各种存储器应用和数字信号处理器(DSP); ③ 采用新的串行置器件如EPCS1的低成本配置方案; ④ 支持LVTTL、LVCMOS、SSTL-2以及SSTL-3 I/O标准; ⑤ 支持66MHZ,32位PCI标准;
⑥ 支持低速(311Mbps)LVDS I/O;
⑦ 支持串行总线和网络接口及各种通信协议; ⑧ 使用PLL管理片内和片外系统时序;
⑨ 支持外部存储器,包括 DDR SDRAM(133MHZ),FCRAM以及 SDR SDRAM; ⑩ 支持多种IP,包括Altera公司的MegaCore以及其合伙组织的IP,支持最新推出的Nios II嵌入式处理器,具有超凡的性能、低成本和最完整的一套软件开发工具。[7]
EP1C3T144引脚图如图2.1所示。
图3.1 EP1C3T144引脚图
2.显示电路设计
显示电路所选用4个数码管以静态显示驱动方式完成时、分显示。静态驱动是指每个数码管的每一个段码都由一个I/O端口进行驱动,其优点是编程简单,显示亮度高,
缺点是占用I/O端口多。
显示电路原理图如图3.2所示。
图2.2 LED静态驱动显示原理图
第三章 单元电路设计 3.1 分频模块电路设计
晶体振荡器是构成数字式时钟的核心,振荡器的稳定度及频率的精度决定了数字钟计时的准确程度,它保证了时钟的走时准确及稳定。
石英晶体的选频特性非常好,只有某一频率点的信号可以通过它,其它频率段的信号均会被它所衰减,而且,振荡信号的频率与振荡电路中的R、C组件的数值无关。因此这种振荡电路输出的是准确度极高的信号。然后再利用分频电路,将其输出信号转变为秒信号,其组成框图如图3.1。
石英晶体 振荡电路 分频电路 秒信号 图3.1 秒信号产生电路框图
本系统使用的晶体振荡器电路给数字钟提供了一个频率稳定准确的20MHZ的方波信号,其输出至分频电路。分频电路的逻辑框图如图3.2所示。
diviclkoclk1soclk2msinst8 图3.2 分频电路模块
经分频后输出1HZ的标准秒信号oclk1s、500HZ的按键消去抖信号。该模块的时序仿真图如图3.3所示,满足设计要求。
图3.3 分频模块仿真图
3.2 校时控制模块电路设计
3.2.1 按键消抖
本模块用于当有按键按下时,采用软件的办法去除按键抖动。模块的实现方法是先判断是否有按键按下,如有按键按下则延时一段时间,待抖动过去之后再读行线状态,如果仍有低电平行线,则确定有按键按下,然后产生一个有按键按下的信号。该模块有一个时钟输入端口,输入时钟信号是分频出来的500HZ的时钟;有一个输入端口与行线相连,用于输入行线状态;一个输出端口,用于输出有按键按下的信号。该模块的逻辑框图如图3.4所示。
图3.4 消抖逻辑框图
该模块在这里实现的比较简单,原理是当有按键按下的时候,inkey会变成低电平,如果此时count不为30时,内部计数器计数,从0直到30,当计数到30时,okey输出底电平,同时给计数器赋值为30。由于计数脉冲为500HZ,故从有按键按下到输入信号产生大概需要60ms。而按键产生抖动的时间大约2ms到10ms,所以一旦计数完成,
抖动已经过去,不会发生重键现象了,这样就去除了抖动。
该模块的仿真波形如图3.5所示。
图3.5 按键消抖模块波形仿真
3.2.2 按键控制模块
按键控制模块的框图如图4.6所示。
a
b
图3.6 按键控制模块
图3.6中a图是控制分的高位,低位以及小时的高位的模块,b图是控制小时的低位的模块。inkey是由消抖模块输出的有键按下的信号,这个信号引发按键控制模块内部信号的变化。oaddr[3..0]作为输出信号,用于控制时间的调整。b图中的flag是判断小时高位是1还是2的信号,若为1,则flag信号为低电平;若为2,则flag信号为高电平。
1.分低位按键控制核心程序如下: ENTITY addram IS
PORT
(inkey : IN STD_LOGIC;
oaddr : OUT STD_LOGIC_VECTOR(3 downto 0));
END addram;
ARCHITECTURE addram_architecture OF addram IS signal count:std_logic_vector(3 downto 0);
BEGIN oaddr<=count; k1:process(inkey) begin
if rising_edge(inkey) then
count<=count+1; if count=9 then
count<=\"0000\";
end if;
end if; end process k1;
END addram_architecture; 说明:
每按键一次,即每当inkey的上升沿到来时,count加一,当count等于9的时候,作为分的低位,将0赋值于count,在此过程中,随时将十进制数的count的值的8421码作为oaddr的信号。
对于分的高位,仅将程序中的count=9改成count=5即可; 对于小时的高位,仅将程序中的count=9改成count=2即可。 该模块的仿真波形如图3.7所示。
图3.7分低位按键控制模块波形仿真
2.小时低位按键控制核心程序如下: ENTITY addram3 IS
PORT
(inkey : IN STD_LOGIC;
flag : IN STD_LOGIC;
oaddr : OUT STD_LOGIC_VECTOR(3 downto 0));
END addram3;
ARCHITECTURE addram3_architecture OF addram3 IS signal count:std_logic_vector(3 downto 0); BEGIN oaddr<=count;
k1:process(inkey,flag) begin
if rising_edge(inkey) then
if flag='1' then
if count=3 then
count<=\"0000\";
else
count<=count+1;
end if;
else
count<=count+1; if count=9 then
count<=\"0000\";
end if;
end if;
end if; end process k1;
END addram3_architecture; 说明:
当flag为高电平时,即小时高位为2,小时低位只能在0到3之间变动; 当flag为低电平时,即小时高位为1,小时低位可以在0到9之间变动。 该模块的仿真波形如图3.8所示。
图3.8小时低位按键控制模块波形仿真
3.3 计数模块
1.秒计数模块
该模块框图如图3.9所示。模块主要完成秒向分的进位,产生脉冲信号。
图3.9 秒模块逻辑框图
核心程序如下: ENTITY second IS
PORT
(clk_1s : IN STD_LOGIC; os : OUT STD_LOGIC);
END second;
ARCHITECTURE sec_architecture OF second IS BEGIN
k1:process(clk_1s)
variable count:integer range 0 to 100:=0; begin
if rising_edge(clk_1s) then
if count=59 then
os<='1'; count:=0;
else
os<='0'; count:=count+1;
end if;
end if; end process k1;
该模块的仿真波形如图3.10所示。
图3.10 秒计数模块波形仿真
2.分低位计数器
该模块框图如图3.11所示。主要完成分低位向高位的进位,产生脉冲信号。
图3.11分低位逻辑框图
核心程序如下: ENTITY ml IS
PORT
(clk_1s : IN STD_LOGIC; iset : IN STD_LOGIC;
iset_addr : IN STD_LOGIC_VECTOR(3 DOWNTO 0); addr_1s : OUT STD_LOGIC_vector(3 downto 0); os : OUT STD_LOGIC);
END ml;
ARCHITECTURE ml_architecture OF ml IS BEGIN
k1:process(clk_1s,iset)
variable count:integer range 0 to 10:=0; begin if iset='0' then
count:=CONV_INTEGER(iset_addr); addr_1s<=iset_addr;
elsif rising_edge(clk_1s) then
if count=9 then
os<='1'; count:=0;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
else
os<='0'; count:=count+1;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
end if;
end if; end process k1; END ml_architecture;
说明:对于分高位计数模块的程序,只需将上面程序中的count=9改成count=6即
可。
3.小时低位计数模块
该模块框图如图3.12所示。主要完成小时低位向高位的进位,产生脉冲信号,同时根据flag信号的不同判断出小时高位时1还是2。
hlclk_1sisetflagiset_addr[3..0]addr_1s[3..0]osinst14 图3.12小时低位计数模块组件图
核心程序如下: ENTITY hl IS
PORT
(clk_1s : IN STD_LOGIC; iset : IN STD_LOGIC; flag : IN STD_LOGIC;
iset_addr : IN STD_LOGIC_VECTOR(3 DOWNTO 0); addr_1s : OUT STD_LOGIC_vector(3 downto 0); os : OUT STD_LOGIC);
END hl;
ARCHITECTURE hl_architecture OF hl IS BEGIN
k1:process(clk_1s,iset)
variable count:integer range 0 to 10:=0; begin if iset='0' then
count:=CONV_INTEGER(iset_addr); addr_1s<=iset_addr;
elsif rising_edge(clk_1s) then
if flag='1' then
if count=3 then
os<='1'; count:=0;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
else
os<='0'; count:=count+1;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
end if;
else
if count=9 then
os<='1'; count:=0;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
else
os<='0'; count:=count+1;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
end if;
end if;
end if; end process k1; END hl_architecture; 4.小时高位计数模块
该模块框图如图3.13所示,主要完成小时高位1和2之间的变换,同时当小时高位为2时, flag为高电平,当为1时,flag为低电平。
hhclk_1sisetiset_addr[3..0]inst13addr_1s[3..0]flag 图3.13小时高位计数模块组件
核心程序如下: ENTITY hh IS
PORT
(clk_1s : IN STD_LOGIC; iset : IN STD_LOGIC;
iset_addr : IN STD_LOGIC_VECTOR(3 DOWNTO 0); addr_1s : OUT STD_LOGIC_vector(3 downto 0); flag: OUT STD_LOGIC);
END hh;
ARCHITECTURE hh_architecture OF hh IS BEGIN
k1:process(clk_1s,iset)
variable count:integer range 0 to 2:=0; begin if iset='0' then
count:=CONV_INTEGER(iset_addr); addr_1s<=iset_addr; if count=2 then
flag<='1';
else
flag<='0';
end if;
elsif rising_edge(clk_1s) then
if count=2 then
flag<='0'; count:=0;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
elsif count=1 then
flag<='1'; count:=count+1;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
else
flag<='0'; count:=count+1;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
end if;
end if; end process k1; END hh_architecture;
3.4 译码显示模块
该模块完成对计数器编码信息的译码工作,驱动数码管则显示相应的数字。模块组件如3.14所示。
driveclkaddr[3..0]led[7..0]inst9 图3.14译码显示模块组件
核心程序如下: ENTITY drive IS
PORT
(clk:in std_logic;
addr : IN STD_LOGIC_vector(3 downto 0); led : OUT STD_LOGIC_vector(7 downto 0));
END drive;
ARCHITECTURE behave OF drive IS
SIGNAL sel:STD_LOGIC_vector(3 downto 0); BEGIN process(clk) begin sel<=addr;
case sel is
when \"0000\"=>led<=\"11000000\"; when \"0001\"=>led<=\"11111001\"; when \"0010\"=>led<=\"10100100\"; when \"0011\"=>led<=\"10110000\"; when \"0100\"=>led<=\"10011001\"; when \"0101\"=>led<=\"10010010\"; when \"0110\"=>led<=\"10000010\"; when \"0111\"=>led<=\"11111000\"; when \"1000\"=>led<=\"10000000\"; when \"1001\"=>led<=\"10010000\"; when others=>led<=\"10111111\";
end case; end process; end behave;
该模块的仿真波形如图3.15所示。
图3.15 译码显示波形仿真
3.5 译码显示强制转换模块
由于系统只能显示时、分,故在此将时低位的数码管的“小数点”作为秒显示,以1HZ的频率闪烁。模块组件如图3.16所示。
convidata[7..0]odata[6..0]inst18 图3.16 译码显示强制转换模块组件
3.6 整点报时模块
该模块能够完成整点时的报时功能。即将至整点时,前四秒低音,最后一秒高音。该模块在十二点三十分的时候,蜂鸣器响起音乐,持续一分钟。模块组件如图3.17所示。
baoshimh[3..0]ml[3..0]hh[3..0]hl[3..0]iclkclksig500sig1kspeakerinst24 图3.17 整点报时模块组件
1.整点报时核心程序如下: if rising_edge(clk05s) then
if cnt=119 then
cnt:=0;
else
cnt:=cnt+1;
end if;
if mh=\"0101\" and ml=\"1001\" and(cnt=117 or cnt=115 or cnt=113 or cnt=111) then
c<='0';
else
c<='1';
end if;
if mh=\"0000\" and ml=\"0000\" and (cnt=119 or cnt=0 or cnt=1)then
d<='0'; else
d<='1';
end if; end if; end process;
a<=clk1k and not(d); b<=clk05s and not(c); speaker<=a or b;
说明:改程序中的时钟信号clk05s的频率为2HZ,且其有效电平(高电平)占空比为2/3。
该模块仿真波形如图3.18所示。
图4.18 整点报时模块波形仿真
总结
主要参考文献
[1] 王紫婷,吴蓉 ,张彩珍,EDA技术与应用,兰州大学出版社,2003 [2] 潘松,黄继业,EDA技术实用教程,北京科学出版社,2006
[3] 崔葛,基于FPGA的数字电路系统设计,西安电子科技大学出版社,2008 [4] 王开军,姜宇柏,面向CPLD/FPGA的VHDL设计,机械工业出版社,2007 [5] 毕满清,电子技术实验与课程设计,机械工业出版社,2005 [6] 吕思忠,数子电路实验与课程设计,哈尔滨工业大学出版社,2001 [7] 谢自美,电子线路设计、实验、测试,华中理工大学出版社,2003
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- vipyiyao.com 版权所有 湘ICP备2023022495号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务