资源描述
学校代码 10126 学号 01161030
分 类 号 TP 密级 公开
本科毕业论文(设计)
万年历设计和实现
学院、系 鄂尔多斯学院电子信息工程系
专业名称 自 动 化
年 级 级
学生姓名 张 文 博
指导老师 王 俊 林
6月 8 日
万年历设计和实现
摘要
本设计为一个多功效万年历,含有年、月、日、时、分、秒计数显示功效,以二十四小时循环计数,含有校对功效。本设计采取EDA技术,以硬件描述语言verilog HDL和VHDL为系统逻辑描述手段设计文件,在Quartus II工具软件环境下,采取自顶向下设计方法,由各个基础模块共同构建了一个基于KH-310开发工具万年历。系统主芯片采取EP1C12Q240C8,由主程序和BCD模块组成。经编译和仿真所设计程序,在可编程逻辑器件上下载验证,本系统经过控制能够完成年、月、日和时、分、秒分别显示,由按键输入进行数字钟校时、切换、扫描功效。
关键字:VHDL Verilog HDL EDA 万年历
目录
1绪论....................................................................................................................1
1.1选题背景...................................................................................................1
1.2课题相关技术发展..............................................................................1
1.3课题研究必需性..................................................................................2
1.4课题研究内容............................................................................3
2 EDA技术.................................................................................................4
2.1 EDA概述.....................................................................................4
2.2什么是EDA...................................................................................4
2.3 EDA特点...................................................................................5
3 FPGA介绍................................................................................................7
3.1 FPGA概述....................................................................................7
3.2 FPGA开发编程原理.......................................................................7
3.3FPGA基础结构...............................................................................8
3.4 FPGA系统设计步骤.....................................................................10
4万年历设计方案.....................................................................................14
4.1万年历原理.............................................................................14
4.2 试验程序.................................................................................14
4.3 试验连接..................................................................................34
4.4 试验仿真和实现........................................................................36
5试验结论和研究展望.............................................................................38
5.1试验结论....................................................................................38
5.2研究展望....................................................................................38
致谢........................................................................................................39
参考文件................................................................................................40
1绪论
1.1选题背景
20世纪末,数字电子技术飞速发展,有力推进了社会生产力发展和社会信息化提升。在其推进下,数字技术应用已经渗透到人类生活各个方面。从计算机到手机,从数字电话到数字电视,从家用电器到军用设备,从工业自动化到航天技术,全部尽可能采取了数字电子技术。而现代电子设计技术关键是EDA技术。
本设计采取VHDL和Verilog HDL是两种应用最为广泛硬件描述语言。前者含有很强大功效,覆盖面广,描述能力强,支持门级电路描述,也支持以寄存器、存放器、总线及其运算单元等组成寄存器传输级电路描述,还支持以行为算法和结构混合描述为对象系统级电路描述。后者能够用来进行多种层次逻辑设计,也能够进行数字系统逻辑综合、仿真验证和时序分析。而采取Verilog HDL进行电路设计最大优点就是设计和工艺无关性。
本设计将从EDA中FPGA嵌入式应用开发技术和数字钟技术发展客观实际出发,经过对该技术发展情况了解,和课题本身需要,指出研究基于FPGA芯片系统和设计——万年历设计和实现必需性。
1.2课题相关技术发展
当今电子产品正向功效多元化,体积最小化,功耗最低化方向发展。它和传统电子产品在设计上显著区分师大量使用大规模可编程逻辑器件,使产品性能提升,体积缩小,功耗降低。同时广泛利用现代计算机技术,提升产品自动化程度和竞争力,缩短研发周期。EDA技术正是为了适应该代电子技术要求,吸收众多学科最新科技结果而形成一门新技术。
美国Altera企业可编程逻辑器件采取全新结构和优异技术,加上MaxplusII(或最新QUARTUS)开发环境,更含有高性能,开发周期短等特点,十分方便进行电子产品开发和设计。
EDA技术以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述关键表示方法,以计算机、大规模可编程逻辑器件开发软件及试验开发系统为设计工具,经过相关开发软件,自动完成用软件方法设计电子系统到硬件系统逻辑编译,逻辑化简,逻辑分割,逻辑映射,编程下载等工作。最终形成集成电子系统或专用集成芯片一门新技术。
1.3课题研究必需性
现在时代是科技是第一生产力时期。所以,新产品、新技术层出不穷,电子技术发展更是日新月异。在这快速发展年代,时间对大家来说是越来越宝贵,在快节奏生活时,大家往往忘记了时间,一旦碰到关键事情而忘记了时间,这将会带来很大损失。所以我们需要一个定时系统来提醒这些忙碌人。数字化钟表给大家带来了极大方便。近些年,伴随科技发展和社会进步,大家对数字钟要求也越来越高,传统时钟已不能满足大家需求。多功效,样式新奇已经成为数字钟发展时尚。
1.4 课题研究内容
本设计关键研究基于FPGA数字钟,要求时间以二十四小时为一个周期,显示年、月、日、时、分、秒,能够对年、月、日、时、分及秒进行单独校对,使其校正到标按时间。所以,研究数字钟及扩大其应用,有着很现实意义。
2 EDA技术
2.1 EDA概述
EDA在通信行业(电信)里另一个解释是企业数据架构,EDA给出了一个企业级数据架构总体视图,并根据电信企业特征,进行了框架和层级划分。 “EDA是电子设计自动化(Electronic Design Automation)缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)概念发展而来[1]。”
2.2 什么是EDA
20世纪90年代,国际上电子和计算机技术较优异国家,一直在主动探索新电子电路设计方法,并在设计方法、工具等方面进行了根本变革,取得了巨大成功。在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)应用,已得到广泛普及,这些器件为数字系统设计带来了极大灵活性。这些器件能够经过软件编程而对其硬件结构和工作方法进行重构,从而使得硬件设计能够如同软件设计那样方便快捷。这一切极大地改变了传统数字系统设计方法、设计过程和设计观念,促进了EDA技术快速发展。
EDA技术就是依靠功效强大电子计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description Language)为系统逻辑描述手段完成设计文件,自动地完成逻辑编译、化简、分割、综合、优化、仿真,直至下载到可编程逻辑器件CPLD/FPGA或专用集成电路ASIC(Application Specific Integrated Circuit)芯片中,实现既定电子电路设计功效。EDA技术使得电子电路设计者工作仅限于利用硬件描述语言和EDA软件平台来完成对系统硬件功效实现,极大地提升了设计效率,缩短了设计周期,节省了设计成本。
今天,EDA技术已经成为电子设计关键工具,不管是设计芯片还是设计系统,假如没有EDA工具支持,全部将难以完成。EDA工具已经成为现代电路设计师关键武器,正在发挥着越来越关键作用。
2.3 EDA特点
(1) 高层综合和优化。为了能愈加好地支持自顶向下设计方法,现代EDA工具能够在系统进行综合和优化,这么就缩短了设计周期,提升了设计效率。
(2)采取硬件描述语言进行设计。采取硬件描述语言进行电路和系统描述是目前EDA技术另一个特征。和传统原理图设计方法相比,HDL语言更适合描述规模大数字系统,它能够使设计者在比较抽象层次上对所设计系统结构和逻辑功效进行描述。采取HDL语言设计突出优点是:语言公开性和利用性;设计和工艺无关性;宽范围描述能力;便于组织大规模系统设计;便于设计复用,交流,保留和修改等。现在最常见硬件描述语言有VHDL和Verilog HDL,它们全部已经成为IEEE标准。
(3)开放性和标准化。现代EDA工具普遍采取标准化和开放性框架结构,任何一个EDA系统只要建立了一个符合标准开放式框架结构,就能够接纳其它厂商EDA工具仪器进行设计工作。这么就能够实现多种EDA工具优化组合,并集成在一个易于管理统一环境下,实现资源共享。
3 FPGA介绍
3.1 FPGA概述
“FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件基础上深入发展产物。它是作为专用集成电路(ASIC)领域中一个半定制电路而出现,既处理了定制电路不足,又克服了原有可编程器件门电路数有限缺点。[2]”
3.2FPGA开发编程原理
FPGA采取了逻辑单元阵列LCA(Logic Cell Array)这么一个概念,内部包含可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。 现场可编程门阵列(FPGA)是可编程器件,和传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA含有不一样结构。FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器输入端,触发器再来驱动其它逻辑电路或驱动I/O,由此组成了既可实现组合逻辑功效又可实现时序逻辑功效基础逻辑单元模块,这些模块间利用金属连线相互连接或连接到I/O模块。“FPGA逻辑是经过向内部静态存放单元加载编程数据来实现,存放在存放器单元中值决定了逻辑单元逻辑功效和各模块之间或模块和I/O间联接方法并最终决定了FPGA所能实现功效,FPGA许可无限次编程[2]。”
3.3 FPGA基础结构
FPGA含有掩膜可编程门阵列通用结构,它由逻辑功效块排成阵列,并由可编程互连资源连接这些逻辑功效块来实现不一样设计。
FPGA通常由3种可编程电路和一个用于存放编程数据静态存放器SRAM组成。这3种可编程电路是:可编程逻辑模块(CLB--Configurable Logic Block)、输入/输出模块(IOB--I/O Block)和互连资源(IR—Interconnect Resource)。“可编程逻辑模块CLB是实现逻辑功效基础单元,它们通常规则排列成一个阵列,散布于整个芯片;可编程输入/输出模块(IOB)关键完成芯片上逻辑和外部封装脚接口,它通常排列在芯片四面;可编程互连资源包含多种长度连接线段和部分可编程连接开关,它们将各个CLB之间或CLB、IOB之间和IOB之间连接起来,组成特定功效电路[3]。”
(1) CLB是FPGA关键组成部分。它关键由逻辑函数发生器、触发器、数据选择器等电路组成。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中地址表能够得到对应组合逻辑函数输出[4]。”其次,逻辑函数发生器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关键由很多金属线段组成,这些金属线段带有可编程开关,经过自动布线实现多种电路连接。
3.4FPGA系统设计步骤
通常说来,一个比较大完整项目应该采取层次化描述方法:分为多个较大模块,定义好各功效模块之间接口,然后各个模块再细分去具体实现,这就是TOP DOWN(自顶向下)设计方法。现在这种高层次设计方法已被广泛采取。高层次设计只是定义系统行为特征,能够不包含实现工艺,所以还能够在厂家综合库支持下,利用综合优化工具将高层次描述转换成针对某种工艺优化网络表,使工艺转化变得轻而易举。CPLD/FPGA系统设计工作步骤图2-2所表示。
图3.1FPGA系统设计步骤设计准备
设计输入
原理图
硬件描述语言 波形图
设计处理
优化、综合、适配、分割
布局、布线
设计完成
器件编程
功效仿真
时序仿真
器件测试
步骤说明:
1.工程师根据“自顶向下”设计方法进行系统划分。
2.输入verilog HDL代码,这是设计中最为普遍输入方法。另外,还能够采取图形输入方法(框图、状态图等),这种输入方法含有直观、轻易了解优点。
3.将以上设计输入编译成标准verilog HDL文件。
4.进行代码级功效仿真,关键是检验系统功效设计正确性。这一步骤适适用于大型设计,因为对于大型设计来说,在综合前对源代码仿真,就能够大大降低设计反复次数和时间。通常情况下,这一仿真步骤可略去。
5.利用综合器对verilog HDL源代码进行综合优化处理,生成门级描述网络表文件,这是将高层次描述转化为硬件电路关键步骤。综合优化是针对ASIC芯片供给商某一产品系列进行,所以综合过程要在对应厂家综合库支持下才能完成。
6.利用产生网络表文件进行适配前时序仿真,仿真过程不包含具体器件硬件特征,是较为粗略。通常设计,也可略去这一步骤。
7.利用适配器将综合后网络表文件针对某一具体目标器件进行逻辑映射操作,包含底层器件配置、逻辑分割、逻辑优化和布局布线。
8.在适配完成后,产生多项设计结果:(a)适配汇报,包含芯片内部资源利用情况,设计布尔方程描述情况等;(b)适配后仿真模型;(c)器件编程文件。依据适配后仿真模型,能够进行适配后时序仿真,因为已经得到器件实际硬件特征(如时延特征),所以仿真结果能比较正确预期未来芯片实际性能。假如仿真结果达不到设计要求,就修改verilog HDL源代码或选择不一样速度和品质器件,直至满足设计要求。
最终将适配器产生器件编程文件经过编程器或下载电缆载入到目标芯片CPLD/FPGA中。
4 万年历总体设计方案
4.1 万年历原理
设计原理图4.1所表示:
基按时钟
置数按键
控制按键
显示
动态显示译码
计数器
图4.1 设计原理图
计数器在正常情况下是对1HZ频率计数,在调整时间情况下是对需要调整时间模块进行计数;控制按键用来选择是正常计数还是调整时间并决定调整时、分、秒;置数按键按下时,表示对应调整块要加一,如要对小时调整时,显示时间LED管将闪烁且当置数按键按下时,对应小时显示要加一。动态显示模块是对计数器计数进行译码,送到LED显示。
4.2 试验程序
(1) Clock模块
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity Clock is
port( mode, set, clr, clk ,k:in std_logic;
seg7, segctr :out std_logic_vector(7 downto 0) );
end entity;
ARCHITECTURE arch OF Clock IS
signal state: std_logic_vector(1 downto 0);
signal Hour, Min, Sec,Year,Mon,Day,d: std_logic_vector(5 downto 0);
signal BCDH, BCDM, BCDS,BCDN,BCDY,BCDR: std_logic_vector(7 downto 0);
signal segDat: std_logic_vector(3 downto 0);
signal blink: std_logic_vector(2 downto 0);
signal set_reg, blink_clk: std_logic;
component BCD
port(DataIn : in std_logic_vector(5 downto 0);
BCDOut : out std_logic_vector(7 downto 0) );
end component;
BEGIN
process(mode)
begin
if (clr='1') then
state<="00";
else
if (mode'event and mode='1') then
state<=state+1;
end if;
end if;
end process;
process(state, blink_clk)
begin
case state is
when "00" => blink<="000";
when "01" => blink<=(2=>blink_clk, others=>'0');
when "10" => blink<=(1=>blink_clk, others=>'0');
when "11" => blink<=(0=>blink_clk, others=>'0');
end case;
end process;
process(Mon, Year,d)
begin
case Mon is
when "000001" => d<="011111";
when "000010" =>
case Year is
when "010000" => d<="011101";
when "010100" => d<="011101";
when "011000" => d<="011101";
when "011100" => d<="011101";
when "100000" => d<="011101";
when "100100" => d<="011101";
when "101000" => d<="011101";
when "101100" => d<="011101";
when "110000" => d<="011101";
when "110100" => d<="011101";
when "111000" => d<="011101";
when "111100" => d<="011101";
when others => d<="011100";
end case;
when "000011" => d<="011111";
when "000100" => d<="011110";
when "000101" => d<="011111";
when "000110" => d<="011110";
when "000111" => d<="011111";
when "001000" => d<="011111";
when "001001" => d<="011110";
when "001010" => d<="011111";
when "001011" => d<="011110";
when "001100" => d<="011111";
when others => d<="011110";
end case;
end process;
process(clk)
variable blink_cnt: std_logic_vector(13 downto 0);
begin
if (clr='1') then
blink_clk<='0';
blink_cnt:=(others=>'0');
else
if (clk'event and clk='1') then
if (blink_cnt="11") then
blink_cnt:=(others=>'0');
blink_clk<=not blink_clk;
else
blink_cnt:=blink_cnt+1;
end if;
end if;
end if;
end process;
process(clk, state)
variable clk_cnt: std_logic_vector(16 downto 0);
begin
if (clr='1') then
Hour<="000000"; Min<="000000"; Sec<="000000";
Year<="000000"; Mon<="000000"; Day<="000000";
clk_cnt:=(others=>'0');set_reg<='0';
else
if (clk'event and clk='1') then
case state is
when "00" =>
if (clk_cnt="11111") then
clk_cnt:=(others=>'0');
if (Sec=59) then
Sec<=(others=>'0');
if (Min=59) then
Min<=(others=>'0');
if (Hour=23) then
Hour<=(others=>'0');
if (Day=d) then
Day<="000001";
if (Mon=12) then
Mon<="000001";
if (Year=63) then
Year<="000001";
else Year<=Year+1;
end if;
else Mon<=Mon+1;
end if;
else Day<=Day+1;
end if;
else Hour<=Hour+1;
end if;
else Min<=Min+1;
end if;
else Sec<=Sec+1;
end if;
else clk_cnt:=clk_cnt+1;
end if;
when "01" =>
if(k='1')then
if (set='1') then
if set_reg='0' then
set_reg<='1';
if (Year=63) then
Year<="000001";
else Year<=Year+1;
end if;
end if;
else
set_reg<='0';
end if;
else
if (set='1') then
if set_reg='0' then
set_reg<='1';
if (Hour=23) then
Hour<=(others=>'0');
else Hour<=Hour+1;
end if;
end if;
else
set_reg<='0';
end if;
end if;
when "10" =>
if(k='1')then
if (set='1') then
if set_reg='0' then
set_reg<='1';
if (Mon=12) then
Mon<="000001";
else Mon<=Mon+1;
end if;
end if;
else
set_reg<='0';
end if;
else
if (set='1') then
if set_reg='0' then
set_reg<='1';
if (Min=59) then
Min<=(others=>'0');
else Min<=Min+1;
end if;
end if;
else
set_reg<='0';
end if;
end if;
when "11" =>
if(k='1')then
if (set='1') then
if set_reg='0' then
set_reg<='1';
if (Day=d) then
Day<="000001";
else Day<=Day+1;
end if;
end if;
else
set_reg<='0';
end if;
else
if (set='1') then
if
展开阅读全文