《在系统编程技术》项目设计报告.docx
《《在系统编程技术》项目设计报告.docx》由会员分享,可在线阅读,更多相关《《在系统编程技术》项目设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
《在系统编程技术》项目设计报告
《在系统编程技术》项目设计报告
课程名称在系统编程技术
任课教师周泽华
设计题目数字钟
班级
学号0
日期2012-6-15
目录
一、摘要3
二、关键词数字钟EDAVHDL语言3
三、设计目的3
四、题目分析4
五、设计方案4
1、顶层实体描述4
2、模块划分4
3.内部各功能模块描述:
5
4.VHDL设计6
5.实验设备7
六、设计步骤8
1、用VHDL程序设计8
步骤5:
引脚锁定11
2、实验箱显示12
七、总结13
附录:
15
一、摘要
EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
目前,在国内电子技术教学和产业界的技术推广中已形成“EDA热”,完全可以说,掌握EDA技术是电子信息类专业学生、工程技术人员所必备的基本能力和技能。
EDA技术在电子系统设计领域越来越普及,本设计主要利用VHDL语言在EDA平台上设计一个电子数字钟,它的计时周期为24小时,显示满刻度为24时59分59秒,另外还具有校时功能和闹钟功能。
总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数和设置程序模块、比较器程序模块、三输入数据选择器程序模块、译码显示程序模块和拼接程序模块。
并且使用QUARTUS II软件进行电路波形仿真,下载到EDA实验箱进行验证。
二、关键词数字钟EDAVHDL语言
三、设计目的
课程设计是一种复杂的学习实践过程。
设计过程采用系统设计的方法,先分析任务,得到系统设计的要求,然后进行总体设计,划分子系统模块,然后进行详细设计,编写各个功能子系统VHDL代码并进行功能仿真,最后进行整个系统总装并仿真。
四、题目分析
功能介绍
1)具有时、分、秒计数显示功能,以24小时循环计时。
2)时钟计数显示时有LED灯的花样显示。
3)具有调节小时、分钟、秒及清零的功能。
4)具有整点报时功能。
五、设计方案
1、顶层实体描述
基于可编程逻辑器件CPLD/FPGA的芯片,使用硬件描述语言(VHDL)设计一个数字电子钟芯片[5],并进行计算机仿真和编程下载。
要求该数字电子钟芯片能够实现如下功能:
(1).计数功能:
完成00时00分00秒到23时59分59秒的计时功能。
(2).清零功能:
到23时59分59秒时电路自动清零,并设有一个手动清零开关,通过它可以对电路实现随时的手动的清零。
(3).定时功能:
能够随意设定,精确到秒,由开关调节设定需要设定的时刻。
(4).动态显示功能:
能够动态显示电子中的时刻数。
2、模块划分
根据该数字电子钟的功能要求,现划分为以下5个模块:
(1).秒计数模块
(2).分计数模块
(3).时计数模块
(4).显示模块
(5).顶层模块
在计数模块中,程序中的控制信号表示如下:
clk是脉冲控制输入信号。
reset是清零输入信号,低电平有效。
数字钟的基本原理方框图如下:
图1.数字钟实现原理框图
3.内部各功能模块描述:
(1)小时
输入信号有clk,其为分钟模块产生的脉冲,reset为重置按钮,daout为数据输出。
(2)分
Clk1为秒产生的脉冲信号,Reset为重置信号,sethour为设置小时的信号,enhour为小时脉冲信号,当Reset为1时,系统恢复原始状态,每当clk1产生了60个脉冲信号时,形成一个小时脉冲,而sethour每按一下,产生一个小时脉冲,而daout为分钟的显示信号。
(3)秒
Clk为时钟信号,当产生60个脉冲信号时,产生一个分钟脉冲信号,reset为重置信号,当reset为1时,系统恢复原始状态,而setmin按下时,同样也产生一个时钟脉冲信号。
数字钟设计的电路原理图:
图2.数字钟的电路图
4.VHDL设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYalertIS
PORT(clk:
INSTD_LOGIC;
dain:
INSTD_LOGIC_VECTOR(6DOWNTO0);
speak:
OUTSTD_LOGIC;
lamp:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDalert;
ARCHITECTUREfunOFalertIS
SIGNALcount:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALcount1:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
speaker:
PROCESS(clk)
BEGIN
IF(clk'eventandclk='1')THEN
IF(dain="0000000")THEN
speak<=count1
(1);
IF(count1>="10")THEN
count1<="00";--count1为三进制加法计数器
ELSE
count1<=count1+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESSspeaker;
lamper:
PROCESS(clk)
BEGIN
IF(rising_edge(clk))THEN
IF(count<="10")THEN
IF(count="00")THEN
lamp<="001";--循环点亮三只灯
ELSIF(count="01")THEN
lamp<="010";
ELSIF(count="10")THEN
lamp<="100";
ENDIF;
count<=count+1;
ELSE
count<="00";
ENDIF;
ENDIF;
ENDPROCESSlamper;
ENDfun;
注:
详细的VHDL文件见附录
5.实验设备
PC机一台、GW48教学实验系统一台、下载电缆一根
六、设计步骤
1、用VHDL程序设计
(1)为本设计建立文件夹
任何一项设计都是一项工程,都必须首先为此工程建立一个放置与此工程相关的所有的文件夹,在此文件夹被EDA软件默认为工作库。
一个设计项目可以包含多个设计文件,一般不同的设计项目最好放在不同的文件夹中。
注意:
文件名不能使用中文,且不能带空格。
(2)设计输入项目和存盘
1)打开QUARTUS||,单击“file”菜单,将鼠标移到NewProjectWizard选项单击则显示如下图内容,在其中建立项目名和实体名,项目名和实体必须保持一致,最后点击finish完成
图6.1建立NewProject
2)
在其中点击file→new,选择原理图编辑器,在这里我们建立VHDL文件,点击确定则显示下图情况,可以在里面键入程序,如下图。
图6.2输入程序
(3)选择目标器件并编译
1)在Assign选项的下拉菜单中选择器件选择项Device,如图所示。
在DeviceFamily(器件序列栏)中选定目标器件对应的序列名,EPF10K10对应的是FLEX10K系列。
为了选择EPF10K10LC84-4器件,应将此栏下方标有ShowonlyFastestSpeedGrades的勾消去,以便显示出所有速度级别的器件。
完成器件选择后,按OK键。
注意:
所选器件必须与目标板的器件型号完全一致。
选择CyclonePackage:
TQFPPIN:
144Speedgrade:
8
图6.3选择目标板器件型号
3)输入完程序以后点击工具栏右方一个紫色的三角符号“
”,然后运行程序,如果程序出现错误在改正。
(4)时序仿真
1.建立波形文件:
选择File->New,选择VectorWaveformFile,单击OK。
图6.4建立波形文件
2.选择Edit->EndTime选项,如图6.6所示,设定仿真时间宽度。
图6.5设置仿真时间
3.双击Name下的空白处,弹出InsertNodorBus对话框,单击NodeFinder。
图6.6选择添加结点设置
4.如图6.7所示选定各个选择项。
图6.7选择结点
5.单击OK,完成引脚输入。
图6.8
6.加上输入信号后波形文件存盘。
图6.9波形
7.运行仿真器。
在Processing菜单下选择StartSimulation项,直到Simulatorwassuccessful出现,仿真结束。
完成波形如图所示。
步骤5:
引脚锁定
选择AssignPin\Location\Chip,在跳出的窗口中的NodeName栏中用键盘输入半加器的端口名,如a、b等。
如果输入的端口名正确,在右侧的PinType栏将显示该信号的属性。
输入以后如下图,设定完成以后再运行一次程序。
图6.11引脚锁定
(5)编程下载
1)首先将下载线把计算机的打印机口与目标板(如开发板或实验板)连接好,打开电源
2)下载方式设定。
选择MAX+plusIIProgrammer选项,跳出下图左侧所示的编程器窗口,然后选择OptionsHardwareSetup硬件设置选项,其窗口图中左侧所示。
在其下拉菜单中选ByteBlaster(MV)编程方式。
此编程方式对应计算机的并行口下载通道,“MV”是混合电压的意思,主要指对ALTERA的各类芯核电压(如5V、3.3V、2.5V与1.8V等)的FPGA/CPLD都能由此下载。
此项设置只在初次装软件后第一次编程前进行,设置确定后就不必重复此设置了
图6.12下载编译
最后点击start按钮,进入下载模式,等待下载完成以后在试验箱上进行调试检测是否正确。
2、实验箱显示
(1)任意设置时间,让其从这一时间开始显示
图6.13设置时间
(2)时间显示为24进制,当时间显示到大23:
59:
59后将会从00:
00:
00开始显示
图6.14数字钟为24进制显示
图6.15时间跳变到000000
七、总结
从开始接到设计题目到电路图的设计,再到报告文章的完成,每走一步对我来说都是新的尝试与挑战。
在这段时间里,我学到了很多知识也有很多感受。
当然在做的过程中也遇到过很多的麻烦,一些没有接触过的元件,它们的封装需要自己去书籍、网上搜索,在更新的时候会有一些错误,自己很难改正,只得求助老师,最后得以解决。
这次毕业设计使我开始了自主的学习和试验,查看相关的资料和书籍,让自己头脑中模糊的概念逐渐清晰,使自己非常稚嫩作品一步步完善起来,每一次改进都是我学习的收获,每一次的成功都会让我兴奋好一段时间。
此次设计过程中,各种系统的适用条件,各种程序的选用标准,各种元件的安装方式,我都是随着设计的不断深入而不断熟悉并学会应用的。
和同学的沟通交流更使我对设计有了新的认识也对自己提出了新的要求。
课题设计过程中我不怕失败,在失败中总结经验,为成功积累素材;学着自我超越,敢于尝试,在尝试中进步,这对我能力的提高大有好处。
设计中有太多的不懂和陌生,但是我会多看、多想、多问、多学,认真的对待每老师交代的任务,每一个任务都是一个锻炼的机会和成长的过程,我在规定的时间尽善尽美的完成,把自己的能力发挥到最大限度。
这些本是我工作后才会意识到的问题,通过这次课程设计让我提前了解了这些知识,这是很珍贵的。
这个课程设计的过程让我学习、工作的思路有了更为明朗的认识:
它是站在一定高度上去工作的,眼界要放宽,思路要开阔,内容要饱满。
我曾经也做过简单的设计,但都是局限在课本中,而这次实验设计,能够让我走出来,仿佛推开门看见外面的世界是如此之大,如同井底之蛙跳上井沿过程中要有很好的团结合作意识和责任感,积极的参与到实验设计的讨论中去,学习和听取别人的意见,我也主动的发表意见,用一个积极上进、激情乐观的态度面对每一天的实验设计生活,让我的学习生活丰富多彩。
非常感谢学院能给我们提供这样的一个可以自己动脑、动手进行设计的机会,同时也大大加强了同学之间的沟通,以及学生与老师之间的交流,这是一个放飞自我的平台,也是我们理想与实际结合的升华,我想学院给我们提供的这些,教会我们的这些不仅仅在现在有用,对于我们今后步入社会也是同样有用的。
最后感谢周老师对我们的指导,以及同学们对我的帮助,使得实验能够顺利完成!
附录:
VHDL设计程序
1、秒
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsecondIS
PORT(clk,reset,setmin:
STD_LOGIC;
enmin:
OUTSTD_LOGIC;
daout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYsecond;
ARCHITECTUREfunOFsecondIS
SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALenmin_1,enmin_2:
STD_LOGIC;--enmin_1为59秒时的进位信号
BEGIN--enmin_2由clk调制后的手动调分脉冲信号串
daout<=count;
enmin_2<=(setminandclk);--setmin为手动调分控制信号,高电平有效
enmin<=(enmin_1orenmin_2);--enmin为向分进位信号
PROCESS(clk,reset,setmin)
BEGIN
IF(reset='0')THENcount<="0000000";--若reset为0,则异步清零
ELSIF(clk'eventandclk='1')then--否则,若clk上升沿到
IF(count(3downto0)="1001")then--若个位计时恰好到"1001"即9
IF(count<16#60#)then--又若count小于16#60#,即60H
IF(count="1011001")then--又若已到59D
enmin_1<='1';count<="0000000";--则置进位为1及count复0
ELSE--未到59D
count<=count+7;--则加7,而+7=+1+6,即作"加6校正"
ENDIF;
ELSE--若count不小于16#60#(即count等于或大于16#60#)
count<="0000000";--count复0
ENDIF;--ENDIF(count<16#60#)
ELSIF(count<16#60#)then--若个位计数未到"1001"则转此句再判
count<=count+1;--若count<16#60#则count加1
enmin_1<='0'after100ns;--没有发生进位
ELSE--否则,若count不小于16#60#
count<="0000000";--则count复0
ENDIF;--ENDIF(count(3DOWNTO0)="1001")
ENDIF;--ENDIF(reset='0')
ENDPROCESS;
ENDfun;
2、分
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYminuteIS
PORT(clk,clk1,reset,sethour:
INSTD_LOGIC;
enhour:
OUTSTD_LOGIC;
daout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYminute;
ARCHITECTUREfunOFminuteIS
SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALenhour_1,enhour_2:
STD_LOGIC;--enmin_1为59分时的进位信号
BEGIN--enmin_2由clk调制后的手动调时脉冲信号串
daout<=count;
enhour_2<=(sethourandclk1);--sethour为手动调时控制信号,高电平有效
enhour<=(enhour_1orenhour_2);
PROCESS(clk,reset,sethour)
BEGIN
IF(reset='0')THEN--若reset为0,则异步清零
count<="0000000";
ELSIF(clk'eventandclk='1')THEN--否则,若clk上升沿到
IF(count(3DOWNTO0)="1001")THEN--若个位计时恰好到"1001"即9
IF(count<16#60#)THEN--又若count小于16#60#,即60
IF(count="1011001")THEN--又若已到59D
enhour_1<='1';--则置进位为1
count<="0000000";--count复0
ELSE
count<=count+7;--若count未到59D,则加7,即作"加6校正"
ENDIF;--使前面的16#60#的个位转变为8421BCD的容量
ELSE
count<="0000000";--count复0(有此句,则对无效状态电路可自启动)
ENDIF;--ENDIF(count<16#60#)
ELSIF(count<16#60#)THEN
count<=count+1;--若count<16#60#则count加1
enhour_1<='0'after100ns;--没有发生进位
ELSE
count<="0000000";--否则,若count不小于16#60#count复0
ENDIF;--ENDIF(count(3DOWNTO0)="1001")
ENDIF;--ENDIF(reset='0')
ENDprocess;
ENDfun;
3、时
LIBRARYIEEE;
useIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYhourIS
PORT(clk,reset:
INSTD_LOGIC;
daout:
outSTD_LOGIC_VECTOR(5DOWNTO0));
ENDENTITYhour;
ARCHITECTUREfunOFhourIS
SIGNALcount:
STD_LOGIC_VECTOR(5DOWNTO0);
BEGIN
daout<=count;
PROCESS(clk,reset)
BEGIN
IF(reset='0')THENcount<="000000";--若reset=0,则异步清零
ELSIF(clk'eventandclk='1')THEN--否则,若clk上升沿到
IF(count(3DOWNTO0)="1001")THEN--若个位计时恰好到"1001"即9
IF(count<16#23#)THEN--23进制
count<=count+7;--若到23D则
else
count<="000000";--复0
ENDIF;
ELSIF(count<16#23#)THEN--若未到23D,则count进1
count<=count+1;
ELSE--否则清零
count<="000000";
ENDIF;--ENDIF(count(3DOWNTO0)="1001")
ENDIF;--ENDIF(reset='0')
ENDPROCESS;
ENDfun;
4、主程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYalertIS
PORT(clk:
INSTD_LOGIC;
dain:
INSTD_LOGIC_VECTOR(6DOWNTO0);
speak:
OUTSTD_LOGIC;
lamp:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDalert;
ARCHITECTUREfunOFalertIS
SIGNALcount:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALcount1:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
speaker:
PROCESS(clk)
BEGIN
--speak<=count1
(1);
IF(clk'eventandclk='1')THEN
IF(dain="0000000")THEN
speak<=count1
(1);
IF(count1>="10")THEN
count1<="00";--count1为三进制加法计数器
ELSE
count1<=count1+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESSspeaker;
lamper:
PROCESS(clk)
BEGIN
IF(rising_edge(clk))THEN
IF(count<="10")THEN
IF(count="00")THEN
lamp<="001";--循环点亮三只灯
ELSIF(count="01")THEN
lamp<="010";
ELSIF(count="10")THEN
lamp<="100";
ENDIF;
count<=count+1;
ELSE
count<="00";
ENDIF;
ENDIF;
ENDPROCESSlamper;
ENDfun;