福建师范大学数学与计算机科学学院
EDA课程设计报告
数字电子闹钟设计
院 (系): XXXXXXXXXXXXXXXX 专 业: XXXXXXXXXXXXXXXXXX 学生姓名: XXXXXXXXX 学 号: XXXXXXXXXXXXXX 指导教师: X X X
2013年6月8日
福建师范大学数学与计算机科学学院
摘要
时钟我们的日常生活中必备的生活用品之一。而数字时钟的出现更是给人们的生产生活带来了极大的便利。EDA技术为数字类产品提供了一个非常简便实用的开发平台。随着EDA技术的快速发展数字时钟的应用的范围越来越广泛并且它在功能、外观等方面也有了很大的改善和提高。本课程设计侧重于逻辑电路设计同时采用VHDL硬件描述语言辅助完成对数字电子钟电路的功能仿真。在设计过程中,重点探讨了数字电子时钟的设计思路和功能模块的划分,对设计过程中出现的问题详细进行分析。系统主要由四个模块组成:时钟脉冲模块、计时校时模块、液晶显示模块、报时模块。
关键词:数字电子闹钟 FPGA 硬件描述语言 EDA
第 1 页 共 2 页
福建师范大学数学与计算机科学学院
目录
摘要................................................................................................................................1 第一章 前言..................................................................................................................3
1.1 EDA技术简介..................................................................................................................3 1.2 EDA发展前景..................................................................................................................3
第二章 设计内容与要求..............................................................................................4
2.1 设计内容...........................................................................................................................4 2.2 设计要求...........................................................................................................................4
第三章 设计原理..........................................................................................................5
3.1 设计原理...........................................................................................................................5 3.2 设计框图...........................................................................................................................5
第四章 模块程序及仿真时序.....................................................................................6
4.1 分频器设计......................................................................................................................6 4.2 时钟控制电路设计..........................................................................................................7 4.3 显示电路设计..................................................................................................................11 4.4 报时电路设计.................................................................................................................17
第五章 不足与改进....................................................................................................19 第六章 附录................................................................................................................20
第 2 页 共 3 页
福建师范大学数学与计算机科学学院
第一章 前言
1.1 EDA技术简介
EDA即电子设计自动化,英文全称Electronic Design Automation。EDA技术是以计算机为工作平台,以EDA软件工具为开发环境,以硬件描述语言为设计语言,以可编程器件为实验载体,以芯片为目标器件,以电子系统设计为应用方向的电子产品自动化设计过程。EDA技术满足了提高设计规模、质量和效益的需要。目前,电子产品开发领域的竞争十分激烈,其产品的市场周期越来越短,这意味着电子产品的设计开发周期必须大大缩短,没有高效率的设计手段是无法参与市场竞争的。EDA工具的优势体现在复杂电路系统的设计上,其设计效率远远高于人工设计,而且可按照事先规定的设计规则随时进行检查,及时提醒设计者出现的设计失误,设计质量得到保障,这自然会缩短周期、降低成本、提升竞争力,从而最大限度地提高经济效益。
1.2 EDA发展前景
作为现代电子系统设计的主导技术,EDA 具有几个明显特征:
1. 用软件设计的方法来设计硬件。硬件系统的转换是由有关的开发软件自动完成的, 设计输入可以是原理图或VHDL 语言,通过软件设计方式的测试,实现对特定功能硬件电路的设计,而硬件设计的修改工作也如同修改软件程序一样快捷方便, 设计的整个过程几乎不涉及任何硬件,可操作性、产品互换性强。
2.基于芯片的设计方法 EDA 设计方法又称为基于芯片的设计方法,集成化程度更高,可实现片上系统集成,进行更加复杂的电路芯片化设计和专用集成电路设计,使产品体积小、功耗低、可靠性高;可在系统编程或现场编程,使器件编程、重构、修改简单便利,可实现在线升级;可进行各种仿真,开发周期短,设计成本低,设计灵活性高。
3.自动化程度高 EDA 技术根据设计输入文件, 将电子产品从电路功能仿真、性能分析、优化设计到结果测试的全过程在计算机上自动处理完成,自动生成目标系统,使设计人员不必学习许多深入的专业知识,也可免除许多推导运算即可获得优化的设计成果,设计自动化程度高,减轻了设计人员的工作量,开发效率高。
第 3 页 共 4 页
福建师范大学数学与计算机科学学院
第二章 设计内容与要求
2.1 设计内容
1.按键设计:
a) 设置复位键,使闹钟具有复位功能; b) 设置一按键,使其进入时钟时间调节模式; c) 设置一按键,使其进入闹钟报时时间调节模式;
d) 设置三按键,对时钟的时、分、秒进行调节,对闹钟的时、分进行调节; 2.显示模块设计:
时钟、闹钟的时间同时显示在LCD1602上,第一行显示时钟,第二行显示闹钟。时钟显示时分秒,以“00:00:00”形式显示,闹钟显示时分,以“00:00”形式显示。 3.闹钟报时输出:
当时钟到达闹钟设定值时,数码管由0变为1,显示时长为60s,当时钟值与闹钟值不一致时,数码管显示为0;
2.2 设计要求
1. 设计思路清晰,整体设计给出框图,提供顶层电路图; 2. 应用vhdl完成各次级模块设计,绘出具体设计程序; 3. 完成设计仿真和程序下载;
第 4 页 共 5 页
福建师范大学数学与计算机科学学院
第三章 设计原理
3.1 设计原理
数字电子时钟的功能为数字钟,调整时间,报时3个功能,可以分为以下4个模块:
1.时钟脉冲模块:FPGA开发板的时钟频率为20MHZ,数字钟每秒进一位,也就是1HZ频率,因此需要设置一个分频器使其进行20M~1的分频;
2.计时校时模块:计时模块与提供的时钟息息相关,当秒满59时,秒置零分进一,分满59时,分置零时进一,时满23时,时置零;校时模块主要是闹钟与数字钟进行比对(即比较器),当满足时分相等时,输出一个高电平表示闹钟报时; 3.液晶显示模块:要在LCD1602上进行显示,必须符合字符编码的要求,字符编码相见附录
4.闹钟报时模块:本模块对闹钟报时进行模拟,在校时模块输出的高电平以数码管的形式输出‘1’,视觉上更加形象;
3.2 设计框图
第四章 模块程序及仿真时序
第 5 页 共 6 页
福建师范大学数学与计算机科学学院
4.1 分频器设计 代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity divider is port(clk_in:in std_logic; clk_low:out std_logic;
clk_mid:out std_logic; clk_high:out std_logic);
end entity;
architecture one of divider is signal clk_out_low:std_logic; signal clk_out_mid:std_logic; signal clk_out_high:std_logic; begin
process(clk_in)
variable n: integer range 1 to 10000000; variable k: integer range 1 to 100000; variable i: integer range 1 to 10; begin
if clk_in'event and clk_in='1' then
if n<10000000 then n:=n+1; else n:=1; clk_out_low<=not clk_out_low; end if; if k<1000 then k:=k+1; else k:=1; clk_out_mid<=not clk_out_mid; end if; if i<2 then i:=i+1; else i:=1; clk_out_high<=not clk_out_high; end if;
end if;
clk_low<=clk_out_low; clk_mid<=clk_out_mid; clk_high<=clk_out_high;
第 6 页 共 7 页
福建师范大学数学与计算机科学学院
end process;
end architecture one;
时序仿真图:
说明:由仿真图可知,clk_mid一个时钟周期经过了10us,仿真图输入脉冲周期为5ns,也就是clk_mid经过一周期,输入脉冲要经过2000000个周期,这与系统频率一致; 封装:
4.2 时钟控制电路设计 代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CLOCK IS
PORT( CLK_IN, RST, SET, SSET, MSET, HSET, ALARM_SET:IN STD_LOGIC; SECM,MINM,HOUM,
ALARM_MINM,
ALARM_HOUM
:OUT
STD_LOGIC_VECTOR(7 DOWNTO 0); RING:OUT STD_LOGIC );
END ENTITY CLOCK;
ARCHITECTURE ASU OF CLOCK IS
第 7 页 共 8 页
福建师范大学数学与计算机科学学院
SIGNAL SECC,MINC,HOUC,ALARM_MINC,
ALARM_HOUC:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN
SECM<=SECC;MINM<=MINC;HOUM<=HOUC;
ALARM_MINM<=ALARM_MINC;
ALARM_HOUM<=ALARM_HOUC;
PROCESS(CLK_IN) BEGIN
IF RST='0'THEN
SECC<=\"00000000\";
MINC<=\"00000000\";
HOUC<=\"00000000\";
RING<='0';--设置复位, 异步
ELSE
IF (CLK_IN='1' AND CLK_IN'EVENT) THEN
IF SET='1' THEN
--SET='1'时,正常计时
--SECC < 59时
IF SECC<\"01011001\"
THEN IF (SECC(3 DOWNTO 0)=\"1001\")
THEN SECC<=SECC+7;
ELSE SECC<=SECC+1; RING<='0'; END IF;
ELSE SECC<=\"00000000\"; --秒钟sec IF MINC<\"01011001\" --MINC < 59时 THEN IF (MINC(3 DOWNTO 0)=\"1001\")
THEN MINC<=MINC+7; ELSE MINC<=MINC+1; END IF;
ELSE MINC<=\"00000000\"; --分钟min IF HOUC<\"00100100\"
--HOUC < 24时
THEN IF (HOUC(3 DOWNTO 0)=\"1001\")
THEN HOUC<=HOUC+7;RING<='1'; ELSE HOUC<=HOUC+1;RING<='1';
第 8 页 共 9 页
福建师范大学数学与计算机科学学院
END IF;
--小时hour
ELSE HOUC<=\"00000000\"; END IF; END IF; END IF;
--SET='0'
ELSE IF HSET='0' --SET='0', HSET = '0'时,小时调整
THEN IF HOUC<\"00100100\"--24
THEN IF (HOUC(3 DOWNTO 0)=\"1001\") THEN HOUC<=HOUC+7; ELSE HOUC<=HOUC+1; END IF;
ELSE HOUC<=\"00000000\";
END IF;
--SET='0', MSET = '0'时,分钟调整
ELSE IF MSET='0'
THEN IF MINC<\"01100000\"--60
THEN IF (MINC(3 DOWNTO 0)=\"1001\")
THEN MINC<=MINC+7; ELSE MINC<=MINC+1; END IF;
ELSE MINC<=\"00000000\";
END IF;
--SET='0', SSET = '0'时,秒钟为0
ELSE IF SSET='0'
THEN SECC<=\"00000000\";
ELSE NULL;
END IF;
END IF; END IF;
第 9 页 共 10 页
福建师范大学数学与计算机科学学院
END IF; END IF;
END IF; --闹钟设置
IF (CLK_IN='1' AND CLK_IN'EVENT) THEN
IF ALARM_SET='0' THEN
IF MSET='0'
--SET='0', MSET = '0'时,分钟调整
THEN IF MINC<\"01100000\"--60
THEN IF (ALARM_MINC(3 DOWNTO 0)=\"1001\")
THEN ALARM_MINC<=ALARM_MINC+7; ELSE ALARM_MINC<=ALARM_MINC+1; END IF;
ELSE ALARM_MINC<=\"00000000\";
END IF;
ELSE IF HSET='0'
THEN IF ALARM_HOUC<\"00100100\"--24
THEN IF (ALARM_HOUC(3 DOWNTO 0)=\"1001\") THEN ALARM_HOUC<=ALARM_HOUC+7; ELSE ALARM_HOUC<=ALARM_HOUC+1; END IF;
ELSE ALARM_HOUC<=\"00000000\";
END IF;
END IF; END IF;
END IF;
END IF; --闹钟“匹配”
IF (MINC=ALARM_MINC AND HOUC=ALARM_HOUC) THEN
RING<='1';
第 10 页 共 11 页
福建师范大学数学与计算机科学学院
ELSE RING<='0'; END IF;
END PROCESS;
END ASU;
仿真时序图:
说明:当按键未按下时,信号处于高电平状态,当按下时,信号变为低电平。因此RST处于高电平时,电子时钟处于“非复位”状态,由时序图可知:当SET = ‘1’时,即时钟正常工作时,输出信号HOUM,MINM,SECM每遇到一个高电平CLK_IN,就会加1,SECM加满59后,向MINM进1,SECM清零,HOUM的工作原理也是一样的;当SET = ‘0’,ALARM_SET = ‘1’时,表示调整闹钟时间,这时候就要看输入信号HSET,MSET,SSET,其工作原理与前者大体一致; 封装:
4.3 显示电路设计 代码:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;
第 11 页 共 12 页
福建师范大学数学与计算机科学学院
library work;
--use work.ascii_table.all;
entity lcd1602 is Port ( clk :in std_logic; reset :in std_logic;
hour :in std_logic_vector(7 downto 0); minute :in std_logic_vector(7 downto 0); second :in std_logic_vector(7 downto 0); alarm_h :in std_logic_vector(7 downto 0); alarm_m :in std_logic_vector(7 downto 0); LCD_RS :out std_logic; --寄存器选择信号 LCD_RW :out std_logic; --液晶读写信号 LCD_EN :out std_logic; --液晶时钟信号
LCD_Data :out std_logic_vector(7 downto 0)); --液晶数据信号
end lcd1602;
architecture bev of lcd1602 is type
state
(set_clr,set_function,set_cursor,set_input_mode,write_cgram,set_ddram,write_LCD_Data); signal current_state:state;
type ram1 is array(0 to 31) of std_logic_vector(7 downto 0); signal cgram1 :ram1; signal clk1 : std_logic; signal clk_out : std_logic; signal lcd_clk : std_logic; begin
LCD_EN <= clk_out; LCD_RW <= '0';
process(clk) --分频,使时钟满足液晶的建立时间
第 12 页 共 13 页 is
福建师范大学数学与计算机科学学院
variable n1:integer range 0 to 9;--variable n1:integer range 0 to 999; begin
if rising_edge(clk) then
if n1<9 then --if n1<999 then n1:=n1+1; else n1:=0;
clk_out<=not clk_out; end if; end if; end process; lcd_clk <= clk_out;
process(lcd_clk,reset,current_state)
variable cnt1: std_logic_vector(4 downto 0); begin
if reset='0' then
current_state<=set_clr; --清屏 cnt1:=\"11110\";
LCD_RS<='0'; --RS='0',RS='0'=>指令寄存器写入 elsif rising_edge(lcd_clk)then current_state <= current_state ; LCD_RS <= '0'; case current_State is
when set_clr=> --清屏 cnt1:=\"00000\";
LCD_Data<=\"00000001\"; current_state<=set_function;
when set_function=> --功能设置,设定下一个要存入数据的CGRAM的地址 LCD_Data<=\"00111000\";
第 13 页 共 14 页
福建师范大学数学与计算机科学学院
current_state<=set_cursor;
when set_cursor=> --显示开关控制,显示功能开,有光标,光标不闪烁 LCD_Data<=\"00001100\"; current_state<=set_input_mode;
when set_input_mode=> --输入方式控制,写入新数据后光标右?写入新数据后显示屏不移动?
LCD_Data<=\"00000100\"; current_state<=write_cgram; when write_cgram=>
LCD_RS<='1'; --RS='1',RW='0',数据寄存器写入 LCD_Data<=cgram1(conv_integer(cnt1)); current_state<=set_ddram; when set_ddram=>
if cnt1<\"11111\" then cnt1:=cnt1+1; else
cnt1:=\"00000\"; end if;
case cnt1 is --第一行显示时钟
when \"00000\"=>cgram1(conv_integer(cnt1))<=X\"54\"; when \"00010\"=>cgram1(conv_integer(cnt1))<=x\"49\"; when \"00011\"=>cgram1(conv_integer(cnt1))<=x\"4D\"; when \"00100\"=>cgram1(conv_integer(cnt1))<=x\"45\"; when \"00110\"=>cgram1(conv_integer(cnt1))<=x\"20\";
when \"00111\"=>cgram1(conv_integer(cnt1))<=x\"3\" & hour(7 downto 4); --转换成ASCII码
when \"01000\"=>cgram1(conv_integer(cnt1))<=x\"3\" & hour(3 downto 0); --转换成ASCII码
when \"01001\"=>cgram1(conv_integer(cnt1))<=x\"3A\";
第 14 页 共 15 页
福建师范大学数学与计算机科学学院
when \"01010\"=>cgram1(conv_integer(cnt1))<=x\"3\" & minute(7 downto 4);--转换成ASCII码
when \"01011\"=>cgram1(conv_integer(cnt1))<=x\"3\" & minute(3 downto 0);--转换成ASCII码
when \"01100\"=>cgram1(conv_integer(cnt1))<=x\"3A\";
when \"01101\"=>cgram1(conv_integer(cnt1))<=x\"3\" & second(7 downto 4);--转换成ASCII码
when \"01110\"=>cgram1(conv_integer(cnt1))<=x\"3\" & second(3 downto 0);--转换成ASCII码
when \"10000\"=>cgram1(conv_integer(cnt1))<=X\"41\"; when \"10001\"=>cgram1(conv_integer(cnt1))<=X\"6C\"; when \"10010\"=>cgram1(conv_integer(cnt1))<=X\"61\"; when \"10011\"=>cgram1(conv_integer(cnt1))<=X\"72\"; when \"10101\"=>cgram1(conv_integer(cnt1))<=X\"6D\"; when \"10110\"=>cgram1(conv_integer(cnt1))<=X\"FE\";
when \"10111\"=>cgram1(conv_integer(cnt1))<=x\"3\" & alarm_h(7 downto
4); --转换成ASCII码
when \"11000\"=>cgram1(conv_integer(cnt1))<=x\"3\" & alarm_h(3 downto 0); --转换成ASCII码
when \"11001\"=>cgram1(conv_integer(cnt1))<=x\"3A\";
when \"11010\"=>cgram1(conv_integer(cnt1))<=x\"3\" & alarm_m(7 downto 4);--转换成ASCII码
when \"11011\"=>cgram1(conv_integer(cnt1))<=x\"3\" & alarm_m(3 downto 0);--转换成ASCII码
--when \"11000\"=>cgram1(conv_integer(cnt1))<=X\"62\"; --when \"11001\"=>cgram1(conv_integer(cnt1))<=x\"79\"; --when \"11010\"=>cgram1(conv_integer(cnt1))<=x\"FE\"; --when \"11011\"=>cgram1(conv_integer(cnt1))<=x\"41\"; --when \"11100\"=>cgram1(conv_integer(cnt1))<=x\"53\";
第 15 页 共 16 页
福建师范大学数学与计算机科学学院
--when \"11101\"=>cgram1(conv_integer(cnt1))<=x\"55\"; when others => cgram1(conv_integer(cnt1))<=x\"FE\";
end case; if(cnt1<=\"01111\") then
LCD_Data<=\"10000000\"+cnt1;--80H-8fH else
LCD_Data<=\"11000000\"+cnt1-\"10000\";--c0H-cfH end if;
current_state<=write_LCD_Data;
when write_LCD_Data=>
LCD_Data<=\"00000000\"; current_state<=set_function; when others => null; end case;end if; end process; end bev;
仿真时序图:
说明:LCD_DATA的地址范围为80H~8FH,C0H~CFH,由仿真图可以看出,在80H与81H之间的5个值分别表示输入信号hour,minute,second,alarm_h,alarm_m 封装:
第 16 页 共 17 页
福建师范大学数学与计算机科学学院
4.4 报时电路设计 代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity awake is port(ring:in std_logic; end;
architecture one of awake is begin
process(ring) begin
if ring = '1' then
awake <= \"0001\";
awake:out std_logic_vector(3 downto 0));
else
awake <= \"0000\";
end if; end process;
end architecture one;
仿真时序图:
第 17 页 共 18 页
福建师范大学数学与计算机科学学院
说明:当ring为1时,即时钟与设置的闹钟的时间值相同时,则awake显示为1,实际的意义为:在数码管上显示1,显示时间为60s;
封装:
第五章 不足与改进
1、开发板资源:FPGA开发板仅集成了LCD液晶显示电路,一个数码管,8个按键对于需要使用多个按键或多个数码管的情况,必须使用能够外扩设备;
2、设计不足:在调时模式和设置闹钟模式下,由于这两种情况下低电平有效,因此需要对相关按键进行长按处理,比较麻烦,解决的办法也很简单,只需要将开发板上的非自锁开关换成自锁开关即可;
3、闹钟报时功能换成了以数码管显示的形式,在实际应用中不现实,可以外设一个蜂鸣器作为闹钟的警报信号,本设计使用数码管仅因为在视觉上体现的比较形象;
第 18 页 共 19 页
6.1顶层文件原理图:
福建师范大学数学与计算机科学学院
第六章 附录
第 19 页 共 20 页
福建师范大学数学与计算机科学学院
6.2顶层文件引脚分配图:
6.3 LCD显示的字符表:
第 20 页 共 21 页
福建师范大学数学与计算机科学学院
第 21 页 共 22 页
因篇幅问题不能全部显示,请点此查看更多更全内容