您的当前位置:首页正文

EDA课设_电子闹钟

2023-06-23 来源:易榕旅网


福建师范大学数学与计算机科学学院

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 页

因篇幅问题不能全部显示,请点此查看更多更全内容