课程设计基于SOPC技术实现数字闹钟.docx
《课程设计基于SOPC技术实现数字闹钟.docx》由会员分享,可在线阅读,更多相关《课程设计基于SOPC技术实现数字闹钟.docx(14页珍藏版)》请在冰豆网上搜索。
课程设计基于SOPC技术实现数字闹钟
基于SOPC技术实现数字闹钟
【摘要】
在现代社会,数字闹钟方便了人们的生活和工作。
数码管显示的时间简单明了而且读数快、时间准确显示到秒。
该数字闹钟主要采用sopc技术,设计由系统对外部机械按键模块进行扫描获取部分指令,对外部时钟分频后进行小时24分频计时模块、分钟60分频计时模块、秒钟60分频计时模块,并进一步建立年月日计时判断模块。
采用LED数码管显示时、分、秒,以24小时计时方式,蜂鸣器则作为闹钟声音提示用。
该数字闹钟优点是小巧,价格低廉,走时精度高,整点报时和定时非常方便。
关键字:
SOPC技术数码管显示整点提示闹钟
一、课题简介
SOPC技术是美国Altrea公司于2000年最早提出的,并同时推出了相应的开发软件QuartusII。
SOPC是基于FPGA解决方案的SOC,与ASIC的SOC解决方案相比,SOPC系统及其开发技术具有更多的特色,构成SOPC的方案有多种途径,我们主要用到的是:
基于FPGA嵌入IP硬核的SOPC系统
1.基于FPGA嵌入IP硬核的SOPC系统
即在FPGA中预先植入嵌入式系统处理器。
目前最为常用的嵌入式系统大多采用了含有ARM的32位知识产权处理器核的器件。
尽管由这些器件构成的嵌入式系统有很强的功能,但为了使系统更为灵活完备,功能更为强大,对更多任务的完成具有更好的适应性,通常必须为此处理器配置许多接口器件才能构成一个完整的应用系统。
如除配置常规的SRAM、DRAM、Flash外,还必须配置网络通信接口、串行通信接口、USB接口、VGA接口、PS/2接口或其他专用接口等。
这样会增加整个系统的体积、功耗,而降低系统的可靠性。
但是如果将ARM或其他知识产权核,以硬核方式植入FPGA中,利用FPGA中的可编程逻辑资源和IP软核,直接利用FPGA中的逻辑宏单元来构成该嵌入式系统处理器的接口功能模块,就能很好地解决这些问题。
2.基于FPGA嵌入IP软核的SOPC系统
这种SOPC系统是指在FPGA中植入软核处理器,如:
NIOSII核等。
用户可以根据设计的要求,利用相应的EDA工具,对NIOSII及其外围设备进行构建,使该嵌入式系统在硬件结构、功能特点、资源占用等方面全面满足用户系统设计的要求。
二、数字闹钟的工作原理及设计过程
1、工作原理
数字闹钟组成结构
数字闹钟一般由振荡器、分频器、计数器、译码器、显示器及部分扩展电路等组成。
1.1振荡器
振荡器是数字电子钟的核心,其作用是产生一个频率标准,即时间标准信号,然后再由分频器生成秒脉冲,所以,振荡器频率的精度和稳定度就基本决定了数字电子钟的准确度,为产生稳定的时间标准信号,一般采用石英晶体振荡器。
从数字电子钟的精度考虑,振荡频率越高记数精度越高。
但这回使振荡器的耗电量增大,分频器级数增多。
所以在确定频率时应同时考虑这两方面的因素再选择器材。
如果精度要求不是很高的话我们可以采用由集成逻辑门与RC组成的时钟源振荡器或由集成电路定时器555与RC组成的多谐振荡器。
一般而言,选用石英晶体振荡器所选用的晶振频率为32768Hz,再通过15级2分频集成电路得到1Hz的标准秒脉冲。
1.2分频器
振荡器产生的时标信号频率很高,要使它变成用来计时的“秒”信号,需要若干级分频电路,分频器的级数和每级分频次数要根据时标信号的频率来决定。
其功能主要有两个:
一是产生标准秒脉冲信号,二是提供功能扩展电路所需的信号。
1.3计数器
有了“秒”信号了就可以根据60秒为一分,60分为一小时,24小时为一天的进制,分别选定没“秒”、“分”、“时”的计数器。
从这些计数器的输出可得到一分、一小时、一天的时间进位信号。
在秒计数器钟因为是60进制通常用两个十进制计数器的集成片组成,其中秒个位是十进制的、十位是6进制的。
可采用反馈归零法变“秒”十位为6进制,实现秒的60进制,同样,分计数器的与秒的一样,只是时计数器里需要变成24进制,也用反馈归零法实现。
1.4译码器及显示器
因为计数器全部采用8421BCD码十进制计数集成芯片,所以“秒”、“分”、“时”的个位和十位都有四个状态输出端(Qa、Qb、Qc、Qd)。
将这些输出端接至专门设计制造的译码电路,就可产生驱动七段数码显示器的信号。
1.5校时电路
当数字钟接通电源或者计时出现误差时需要校正时间,校时电路的要求是:
在小时校正时不影响分和秒的正常计数;在分校时时不影响时和秒的正常计数;校时方式有“快校时”和“慢校时”两种,“快校时“是通过开关控制使计数器对1Hz的校时脉冲计数,“慢校时”是通过手动产生单脉冲作校时脉冲,校时的基本原理是将0.5秒的脉冲信号(可由分频器的第14级分频输出端直接获得),直接引进“时”计数器,同时将计数器置“0”,在时的指示调到需要的数字后,再切断“0.5”信号让计数器正常工作。
2、设计过程
SOPC设计首先使用QuartusII建立一个QuartusII的工程,创建完成工程之后,需要创建顶层实体。
创建完顶层设计文件之后,使用SOPCBuilder创建NIOSII嵌入式处理器,添加、配置系统的外设IP,组成NiosII系统模块。
NiosII系统模块设计完成之后要加入到该顶层实体中,然后进行其他片上逻辑的开发。
2.1QuartusII工程的建立:
(1)启动QuartusII软件;
(2)选择File菜单NewProjectWizard,出现Introduction页面,该页面介绍所要完成的具体任务,点击next。
(3)进行项目名称的设定、工作目录的选择。
指定工程存放的目录,工程名和顶层实体名,工程名和顶层实体名要求相同,工程目录可以随意设置,但必须是英文的目录,工程名和顶层实体名也要求是英文名字,我们的工程名和顶层实体名为clock,选择Next。
4.可以为工程添加先期已经输入的设计文件,指定用户自定义的元件库的路径,这里我们没有事先输入好的文件,也没有自定义的元件库,点击Next进入下一步。
5.用户指定目标器件,根据开发板的所使用的器件来选择,实际开发中,通过查看核心板的参考手册来获取所使用的器件具体型号,可以使用窗口右边的Filters来加快器件的选择,选择完毕点击Next。
6.指定在QuartusII之外的用于,设计输入、综合、仿真、时序分析的第三方EDA工具,QuartusII对第三方工具的支持比较完善。
这里我们不做选择,直接点击Next。
所见新工程的信息,确认所创建工程的主要信息,点击Finish完成工程的建立,在开发的过程中,还可以通过菜单assignmentSettings来对这些配置进行修改。
点击Finish按钮,QuartusII自动会打开这个工程,可以看到顶层实体名出现在工程导航窗口中。
7,、新建的工程窗口中,选择FileNew;在DeviceDesignFile页中,选择BlockDiagram/SchematicFile,即原理图文件,也可以选择硬件描述语言的文件形式。
单击OK。
出现一个模块编辑窗口;选择FileSaveAs,出现SaveAs对话框,显示的目录为之前设置的工程目录,文件名为之前设置的顶层实体名(由于这是工程的第一个文件,系统会默认为顶层设计实体的名字)。
确定AddtoCurrentProject选项被选中,点击save。
器件型号
2.2创建NIOSII系统模块
(1)创建系统:
启动SOPCBuilder,选择ToolsSOPCBuilder,出现如图所示的CreateNewSystem对话框。
键入系统的名字,选择硬件描述语言Verilog或者是VHDL。
(2)设置系统主频和指定目标FPGA:
在Board部分选择Unspecified,然后在DeviceFamily选择CycloneII。
用户需要设置系统的时钟频率,该频率用于计算硬件和软件开发中的定时,比如时钟分频或波特率,还可以选择是否选用流水线。
(3)加入NiosIICPU和IP模块:
首先加入NiosII软核,NiosII是软核CPU,共有三种类型的CPU可供选择:
NiosII/e(经济型)、NiosII/s(标准型)和NiosII/f(快速型)。
用户可以根据实际的情况进行选择。
NiosII是一个用户可以自行进行定制的CPU,用户可以增加新的外设、新的指令等。
添加CPU软核
添加内存__SDRAM
添加LCD模块添加100ms的定时器
完整的SOPC的硬件系统
生成的PLL模块
顶层总原理图
2.3部分程序如下:
模24计数器
//counter24.v
1//filename:
counter24.v(BCD:
0--23)
2modulecounter24(CntH,CntL,ncR,EN,CP);
3inputCP,ncR,EN;
4output[3:
0]CntH,CntL;
5reg[3:
0]CntH,CntL;
6
7always@(posedgeCP,negedgencR)
8begin
9if(~ncR)
10{CntH,CntL}<=8'h00;
11elseif(~EN)
12{CntH,CntL}<={CntH,CntL};
13elseif((CntH>2)||(CntL>9)||((CntH==2)&&(CntL>=3)))
14{CntH,CntL}<=8'h00;
15elseif((CntH==2)&&(CntL<3))
16begin
17CntH<=CntH;
18CntL<=CntL+1'b1;
19end
20elseif(CntL==9)
21begin
22CntH<=CntH+1'b1;
23CntL<=4'b0000;
24end
25else
26begin
27CntH<=CntH;
28CntL<=CntL+1'b1;
29end
30end
31
32endmodule
模60计数器
//counter60.v
1//countuer60
2
3//counter10.v(BCD:
0--9)
4modulecounter10(Q,ncR,EN,CP);
5inputCP,ncR,EN;
6outputreg[3:
0]Q;
7
8always@(posedgeCP,negedgencR)
9begin
10if(~ncR)
11Q<=4'b0000;
12elseif(~EN)
13Q<=Q;
14elseif(Q==4'b1001)
15Q<=4'b0000;
16else
17Q<=Q+1'b1;
18end
19endmodule
20
21//counter6.v(BCD:
0--5)
22modulecounter6(Q,ncR,EN,CP);
23inputCP,ncR,EN;
24outputreg[3:
0]Q;
25
26always@(posedgeCP,negedgencR)
27begin
28if(~ncR)
29Q<=4'b0000;
30elseif(~EN)
31Q<=Q;
32elseif(Q==4'b0101)
33Q<=4'b0000;
34else
35Q<=Q+1'b1;
36end
37endmodule
38
39//counter60.v(BC