《SOPC课程设计--万年历.doc》由会员分享,可在线阅读,更多相关《SOPC课程设计--万年历.doc(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateSOPC课程设计-万年历SOPC课程设计-万年历 SOPC课程设计实验报告 万年历 学院: 专业: 学号: 姓名: 指导老师: 2012/06/04一、摘要本文介绍了一种基于片上可编程系统(SOPC)设计万年历的方法。本次设计从系统硬件出发,由CPU,总线,RAM,外接设备等构成SOPC Builder的硬件系统,通过Nios II DE2开发的嵌入式软件编写并嵌入S
2、OPC Builder的硬件中实现万年历的整体开发。通过应用SoPC Builder开发工具,设计者可以摆脱传统的、易于出错的软硬件设计细节,从而达到加快项目开发、缩短开发周期、节约开发成本的目的并具有高集成度、设计灵活和可移植性较好。关键词:万年历 SOPC SOPC Builder Nios II DE2二、设计要求 用Nios II DE2 开发板的LCD显示电子钟的日期和时间。LCD分两行显示,第1行显示年、月、日;第2行显示时、分、秒。用输入BUTTON0来控制LCD行的修改,同时让Nios II DE2开发板上的绿色发光二极管亮灭来表示这个选择。当BUTTON0按一下后,LEDG3
3、亮,可以修改年、月和日的数字;再按一下BUTTON0后,LEDG3灭,可以修改时、分和秒的数字。另外用输入按钮BUTTON3来控制日期和时间的修改,当处于日期修改方式时,每次按动一次BUTTON3,依次更换“年”、“月”和“日”的修改。当处于时间修改方式时,每次按动一次BUTTON3,依次更换“时”、“分”和“秒”的修改。修改对象被选中后,按动BUTTON2输入按钮可以增加显示的数字;按动BUTTON1输入按钮可以减少显示的数字。三、设计内容1、按键信息BUTTON3:“年”、“月”、“日”或“时”、“分”、“秒”切换键BUTTON2:+键BUTTON1:-键BUTTON0:“年”、“月”、“
4、日”与“时”、“分”、“秒”切换键显示信息LCD_Line1:显示“年”、“月”、“日” LCD_Line1:显示“时”、“分”、“秒”2、SOPC Builder 硬件建立 SOPC Builder是在Quartus II里的SOPC Builder进行的,先建立工程,在SOPC Builder里添加硬件,包括CPU ,jtag_uart ,RAM,LCD,PIO,按键,LED,以及LCD_ON。3、Quartus II硬件处理 硬件会自动建立一个顶层模块,通过建一个原理图来对对应的硬件进行输入输出的添加,再锁定引脚,编译工程,硬件下载。 4、Nios II DE2嵌入软件编写 在Nios
5、II里建立工程,选择相应的模块,编写需要嵌入的软件,添加缺少的头文件对应的宏定义,编译工程,进行软件下载,在观察结果。四、设计步骤1、打开Quartus II新建工程2、打开SOPC Builder生成相应的硬件如图所示 建立好后点击Generate运行,看是否出错,然后点击exit退出。 3、调用刚才生成的硬件系统,在Quartus II中建立图形文件,然后进行引脚锁定。引脚锁定引脚文件如下:#Setup.tcl#Setup pin settingset_global_assignment -name RESERVE_ALL_UNUSED_PINS AS INPUT TRI-STATEDse
6、t_global_assignment -name ENABLE_INIT_DONE_OUTPUT OFFset_location_assignment PIN_N2 -to clkset_location_assignment PIN_V18 -to led3set_location_assignment PIN_W19 -to led2set_location_assignment PIN_AF22 -to led1set_location_assignment PIN_AE22 -to led0set_location_assignment PIN_W26 -to KEY3set_loc
7、ation_assignment PIN_P23 -to KEY2set_location_assignment PIN_N23 -to KEY1set_location_assignment PIN_G26 -to KEY0set_location_assignment PIN_K4 -to LCD_RWset_location_assignment PIN_K3 -to LCD_ENset_location_assignment PIN_K1 -to LCD_RSset_location_assignment PIN_L4 -to LCD_ONset_location_assignment
8、 PIN_J1 -to LCD_DATA0set_location_assignment PIN_J2 -to LCD_DATA1set_location_assignment PIN_H1 -to LCD_DATA2set_location_assignment PIN_H2 -to LCD_DATA3set_location_assignment PIN_J4 -to LCD_DATA4set_location_assignment PIN_J3 -to LCD_DATA5set_location_assignment PIN_H4 -to LCD_DATA6set_location_as
9、signment PIN_H3 -to LCD_DATA7 然后进行编译,在Quartus I下生成文件如下图:4、 Nios II运行打开Nios II IDE2,建立工程,选择count_binary模块,添加一个LCD.h的顶层文件。LCD.h的顶层文件为:#ifndef _LCD_H_#define _LCD_H_/LCD Module 16*2#define lcd_write_cmd(base,data) IOWR(base, 0, data)#define lcd_read_cmd(base) IORD(base, 1)#define lcd_write_data(base,da
10、ta) IOWR(base, 2, data)#define lcd_read_data(base) IORD(base, 3)/=void LCD_Init();void LCD_Show_Text(char*Text);void LCD_Line2();void LCD_Test();/=#endif /_LCD_H_然后建立count_binary的C+文件。C+文件见附件。5、 连接开发板,将文件下载到开发板,运行文件检验是否正确。6、 检查错误并修改,知道结果正确。 五、运行情况与问题分析1、建立工程时,注意不能出现中文或者空格,且工程名需与文件名一致,选定芯片;2、在生成CPU硬件
11、系统时,定义端口时,需注意设定端口输入与输出的位宽,需与程序定义的数值一致,否则运行溢出报错,须修改;3、建立图形文件后,需进行编译,出现错误得返回原理图核对,找到错误修改后重新编译;4、进行引脚锁定时,注意引脚文件的编写,否则选择引脚文件点击Run后会不成功,从而影响后面程序的调试; 5、当日数为31时,调节月份日期不会随机改变,就会出现4月31日等错误,加入程序段但是还是没有完成跳变; 6、程序中闪烁程序段、跳变程序段不执行,程序还需后续修改。 六、结论采用NIOS集成开发环境提供的快捷开发手段,在Cyclone 1C6Q240C8芯片上创建了一个用户定制CPU和外设的片上系统,同时完成对
12、液晶显示器和LED的编程控制。整个系统充分体现了SOPC设计方法的灵活性,设计时只定制系统需要的外设器件接口,避免过多的外围电路和器件造成体积、功耗的增多和可靠性的下降。由于采用软核结构,方便系统的升级和扩展,而不必硬件改版,节约了成本,加快开发进度,缩短了产品的开发周期。综上所述,万年历的设计思想新颖独特,有很多创新之处。 七、心得体会 经过本次SOPC课程设计实验,使我更加熟悉了Quartus 与Nios DE2以及开发板的使用,熟练掌握了从理论设计到硬件开发的流程,了解了万年历通过编程实现的整个过程。从整个实验实现的过程中,碰到一些以前未出现过的问题,在自己的努力以及同学、老师的帮助下,
13、使自己的理论及操作水平有所提高,在此我要郑重感谢指导老师黄乡生。附 件C+程序代码如下:#include alt_types.h#include #include #include #include system.h#include sys/alt_irq.h#include altera_avalon_pio_regs.h/#includecount_binary.h#include LCD.h#include io.h/#include basic_io.hvolatile int edge_capture;void LCD_Init() lcd_write_cmd(LCD_BASE,0x
14、38); usleep(2000); lcd_write_cmd(LCD_BASE,0x0C); usleep(2000); lcd_write_cmd(LCD_BASE,0x01); usleep(2000); lcd_write_cmd(LCD_BASE,0x06); usleep(2000); lcd_write_cmd(LCD_BASE,0x80); usleep(2000);void LCD_Show_Text(char*Text) int i; for(i=0;i=3) pos=0; if(screen=2) screen=0; /na_LED8-np_piodata=1pos;
15、if(screen=0) IOWR_ALTERA_AVALON_PIO_DATA(LEDG_BASE,0x2); else IOWR_ALTERA_AVALON_PIO_DATA(LEDG_BASE,0x0); usleep(500000);/等待半秒的定时时间 if(i=0) i=1; else i=0; if(i=0) if(second59) second+; else second=0; if(minute59) minute+; else minute=0; if(hour23) hour+; else hour=0; if(day30) day+; else day=1; if (
16、month12) month+; else month=1; if(year1) 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; else day=28; if (screen=1) if(second0) second-; else second=59; else if(pos=1) if(screen=0) if(month1) month-; else month=12; i
17、f(day=31) if(month=4|month=6|month=9|month=11) day=30; else if (month=2) if(year%400)=0)|(year%4)=0)&(year%100)!=0) day=29; else day=28; else day=31; if(screen=1) if(minute0) minute-; else minute=59; if(pos=2) if(screen=0) if (year0) year-; else year=2005; if (screen=1) if (hour0) hour-; else hour=2
18、3; break; case 0x04: if (pos=0) if (screen=0) if(check_month(month)=0) if(day30) day+; else day=1; else if (check_month(month)=1) if (day31) day+; else day=1; else if(check_month(month)=2) if (check_year(year) if(day29) day+ ; else day=1; else if (day28) day+ ; else day=1; else if(screen=1) if(secon
19、d59) second+; else second=0; else if (pos=1) if(screen=0) if (month12) month+; else month=1; if(day=31) if(month=4|month=6|month=9|month=11) day=30; else if (month=2) if(year%400)=0)|(year%4)=0)&(year%100)!=0) day=29; else day=28; else day=31; /* else if (screen=1) if (month12) month+; else month=1;
20、 */ else if(screen=1) if (minute59) minute+; else minute=0; if(pos=2) if (screen=0) if (year9999) year+; else year=2005; else if (screen=1) if (hour23) hour+; else hour=0; break; case 0x01: screen+; break; /换屏 edge_capture=0; year4=year/1000; year3=(year-year4*1000)/100; year2=(year-year4*1000-year3
21、*100)/10; /year2=year-year4*1000-year3*100)/10; year1=year%10; month2=month/10; month1=month%10; day2=day/10; day1=day%10; LCD_Line1(); date0=year4+0x30;date1=year3+0x30; date2=year2+0x30;date3=year1+0x30; date4= ; date5= ; date6=month2+0x30; date7=month1+0x30; date8= ;date9= ; date10=day2+0x30;date
22、11=day1+0x30; date12= ; date13= ; date14= ;date15= ; 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; time0= ;time1= ; time2=hour2+0x30;time3=hour1+0x30; time4= ;time5= ; time6=minute2+0x30;time7=minute1+0x
23、30; time8= ;time9= ; time10=second2+0x30;time11=second1+0x30; time12= ;time13= ; time14= ;time15= ; LCD_Line2(); LCD_Show_Text(time);sum=year4*0x1000000+year3*0x1000000+year2*0x100000+year1*0x10000;sum=sum+month2*0x1000+month1*0x100+day2*0x10+day1;IOWR_ALTERA_AVALON_PIO_DATA(seg7_BASE,sum); else if(screen=0) if(pos=0) date10= ; date11= ; else if(pos=1) date6= ; date7= ; else date0= ; date1= ; date2= ; date3= ; LCD_Line1(); LCD_Show_Text(date); else if(pos=0) time10= ; time11= ; else if(pos=1) time6= ; time7= ; else time2= ; time3= ; LCD_Line2(); LCD_Show_Text(time); -