usleep(1000000);//等待1秒的定时时间
if(second<59)second++;
else
{
second=0;
if(minute<59)minute++;
else
{
minute=0;
if(hour<23)hour++;
else
{
hour=0;
if(day<30)day++;
else
{
day=1;
if(month<12)month++;
else
{
month=1;
if(year<9999)year++;
elseyear=2005;
}
}
}
}
}
switch(edge_capture)//检测按钮
{
case0x08:
pos=pos+1;break;//改变调整位置
/*
对数据进行加减操作的CASE:
case0x02和case0x04
根据当前调整位置,判断当前屏显示的是年、月、日还是时分、秒
然后决定是对年月日进行加减还是对分时秒进行加减
*/
case0x02:
//对当前位置上的数据执行减操作
if(pos==0)
{
if(screen==0)
{
if(day>1)day--;
else
{
if(check_month(month)==0)day=30;
if(check_month(month)==1)day=31;
if(check_month(month)==2)
{
if(check_year(year))day=29;
elseday=28;
}
}
}
if(screen==1)
{
if(second>0)second--;
elsesecond=59;
}
}
if(pos==1)
{
if(screen==0)
{
if(month>1)month--;
elsemonth=12;
}
if(screen==1)
{
if(minute>0)minute--;
elseminute=59;
}
}
if(pos==2)
{
if(screen==0)
{
if(year>0)year--;
elseyear=2005;
}
if(screen==1)
{
if(hour>0)hour--;
elsehour=23;
}
}
break;
case0x04:
//对当前位置上的数据执行加操作
if(pos==0)
{
if(screen==0)
{
if(check_month(month)==0){if(day<30)day++;elseday=1;}
if(check_month(month)==1){if(day<31)day++;elseday=1;}
if(check_month(month)==2)
{
if(check_year(year)){if(day<29)day++;elseday=1;}
else{if(day<28)day++;elseday=1;}
}
}
if(screen==1)
{
if(second<59)second++;
elsesecond=0;
}
}
if(pos==1)
{
if(screen==0)
{
if(month<12)month++;
elsemonth=1;
}
if(screen==1)
{
if(minute<59)minute++;
elseminute=0;
}
}
if(pos==2)
{
if(screen==0)
{
if(year<9999)year++;
elseyear=2005;
}
if(screen==1)
{
if(hour<23)hour++;
elsehour=0;
}
}
break;
case0x01:
screen++;break;//换屏
}
edge_capture=0;
{
year4=year/1000;year3=(year-year4*1000)/100;
year2=(year-year4*1000-year3*100)/10;year1=year%10;
month2=month/10;month1=month%10;
day2=day/10;day1=day%10;
LCD_Line1();
date[0]=year4+0x30;date[1]=year3+0x30;
date[2]=year2+0x30;date[3]=year1+0x30;
date[4]='';date[5]='';
date[6]=month2+0x30;date[7]=month1+0x30;
date[8]='';date[9]='';
date[10]=day2+0x30;date[11]=day1+0x30;
date[12]='';date[13]='';
date[14]='';date[15]='';
LCD_Show_Text(date);
}
{
hour4=0;hour3=0;
hour2=hour/10;hour1=hour%10;
minute2=minute/10;minute1=minute%10;
second2=second/10;second1=second%10;
time[0]='';time[1]='';
time[2]=hour2+0x30;time[3]=hour1+0x30;
time[4]='';time[5]='';
time[6]=minute2+0x30;time[7]=minute1+0x30;
time[8]='';time[9]='';
time[10]=second2+0x30;time[11]=second1+0x30;
time[12]='';time[13]='';
time[14]='';time[15]='';
LCD_Line2();
LCD_Show_Text(time);
}
}
}
2.lcd.h的代码:
#ifndef_LCD_H_
#define_LCD_H_
//LCDModule16*2
#definelcd_write_cmd(base,data)IOWR(base,0,data)
#definelcd_read_cmd(base)IORD(base,1)
#definelcd_write_data(base,data)IOWR(base,2,data)
#definelcd_read_data(base)IORD(base,3)
//----------------------------------------------------------------------
voidLCD_Init();
voidLCD_Show_Text(char*Text);
voidLCD_Line2();
voidLCD_Test();
//----------------------------------------------------------------------
#endif
六、实验分析和实验结果
用输入按钮BUTTON[0]可以控制LCD行修改,同时让NiosIIDE2开发板上的绿色发光二极管LEDG3的亮灭来表示。
用输入按钮BUTTON[3]可以控制日期和时间的修改,BUTTON[1]和BUTTON[2]输入按钮可以减少和增加显示的数字。
实验中开始时SDRAM的BIDIR端口的命名错误导致引脚锁定未成功,此端口的名称应为DRAM_DQ[15..0]。
此外,三态桥的设置被改变了,需要重新设置,回到QuartusII中,在assignments中选择settings,Device->DeviceandPinOptions->UnusedPins,改为Asinputtri-stated。
七、总结
通过这12周的SOPC技术综合设计实践的学习,我学会了QuartusII,
SOPCBuider和NiosIIDE2的使用,并通过这些软件可以进行简单的实验操作,强化了我的动手能力,并通过这几次实验更加了解SOPC的设计与应用。
在实验中,遇到了各种各样的问题,首先是自己进行检查,查不出来再由老师同学进行检查和讲解,提高了自己解决问题的能力,并且熟悉了整个实验的流程及具体的操作。
我觉得这门课程很有意思,实验中是把各个部分的操作整合在一起,形成一个系统,做实验时要有整体感,一旦出现问题整体的重新进行设置和编译,比如如果添加组建时出现错误,要重新添加,重新生成模块,重新倒入模块,重新编译顶层文件,是一个整体的过程。
八、附录
参考《SOPC技术与应用》,编著:
江国强,机械工业出版社。
参考《SOPC技术综合设计实践实验指南》,编著:
邱德惠。
思考题:
1.何谓SOC?
SOC(SystemOnaChip)称为片上系统,它是指将一个完整产品的功能集成在一个芯片上或芯片组上。
SOC中可以包括微处理器CPU、数字信号处理器DSP、存储器(ROM、RAM、Flash等)、总线和总线控制器、外围设备接口等,还可以包括数模混合电路(放大器、比较器、A/D和D/A转换器、锁相环等),甚至传感器、微机电和微光电单元。
2.何谓SOPC?
SOPC(SystemOnaProgrammableChip)称为可编程片上系统,它是基于可编程逻辑器件(FPGA或CPLD)可重构的SOC。
SOPC集成了硬核或软核CPU、DSP、锁相环(PLL)、存储器、I/O接口及可编程逻辑,可以灵活高效地解决SOC方案,而且设计周期短,设计成本低,一般只需要一台配有SOPC开发软件的PC和一台SOPC实验开发系统(或开发板),就可以进行SOPC的设计与开发。
3.何谓IP核?
IP(IntellectualProperty)是知识产权的简称。
集成电路IP是指经过预先设计、预先验证、符合产业界普遍认同的设计规范和设计标准,并具有相对独立并可以重复利用的电路模块或子系统,如CPU、运算器、存储器、放大器等。
集成电路IP模块具有知识含量高、占用芯片面积小、运行速度快、功耗低、工艺容差性大等特点,可重复用于SOC、SOPC或复杂ASIC设计中。
4.何谓嵌入式系统,嵌入式系统的CPU核可以分为哪两种类型?
嵌入式系统是指嵌入到对象体系中的专用计算机系统,包括硬件和软件两大部分。
硬件包括处理器、存储器、输入输出接口和外部设备等,软件包括系统软件和应用软件。
基于SOPC的嵌入式系统结构主要包括嵌入式微处理器(CPU核)、定时器(Timer)、嵌入式锁相环(PLL)、嵌入式数字信号处理器(DSP)及其他IP模块等部分。
嵌入式系统的CPU核可以分为硬核和软核。
5.简述CPU软核的特点。
软核通常以可综合的HDL提供,因此具有较高的灵活性,并与具体的实现工艺无关,其主要缺点是缺乏对时序、面积和功耗的预见性。
由于软核是以源代码的形式提供,尽管源代码可以采用加密方法,但其知识产权保护问题不容忽视。
6.简述HAL的用途及基于HAL的外围设备的编程方法。
HAL作为支持NiosII处理器系统的软件包,为用户的嵌入式系统上的外围设备提供了与之相匹配的接口程序。
用户不用自己建立或复制HAL文件,也不需要编辑HAL中的任何源代码,使用时只需要在C/C++源程序中指明代表这些接口程序的库函数包含的头文件即可。
在一个基于NiosII的SOPC系统上,外围设备包括通用异步串口UART、发光二极管LED、七段数码管、按钮、LCD、存储器、定时器、鼠标、VGA等。
在应用软件的开发中,对于按钮、发光二极管LED、七段数码管等通用输入输出设备的编程比较简单,而对于通用异步串口UART、LCD、VGA等字符模式外围设备的编程就比较复杂。
为了方便用户对字符模式外围设备的编程,HAL支持标准输入、标准输出和标准错误函数,允许在程序中调用stdio.h中的I/O函数来完成对这些设备的访问,也支持字符模式外围设备的通用访问。
7.简述SOPC的设计流程。
SOPC硬件开发流程
a)创建QuartusII工程
b)创建NiosII系统模块
c)配置NiosII系统
d)将NiosII系统模块、LPM和用户自定义模块连接起来
e)编译、引脚分配、编程下载
SOPC软件开发流程
NiosII程序包括一个应用工程、可选的库工程和一个板支持包工程(自动生成)。
将NiosII程序编译成一个能在NiosII处理器上运行的.elf文件。
1.新建NiosIIC/