SOPC课程设计实验报告万年历的设计.docx
- 文档编号:11315467
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:32
- 大小:579.29KB
SOPC课程设计实验报告万年历的设计.docx
《SOPC课程设计实验报告万年历的设计.docx》由会员分享,可在线阅读,更多相关《SOPC课程设计实验报告万年历的设计.docx(32页珍藏版)》请在冰豆网上搜索。
SOPC课程设计实验报告万年历的设计
摘要
本次设计从系统硬件出发(CPU,系统总线,RAM,外接设备等)以此来构成SOPCBuilder的硬件系统,再通过NiosIIIDE开发的嵌入式软件,编写且嵌入SOPCBuilder的硬件中,实现万年历的整体开发。
通过应用SOPCBuilder开发工具,设计者可以摆脱传统的、易于出错的软硬件设计细节,从而达到加快项目开发、缩短开发周期、节约开发成本的目的。
Abstract
Thedesignofthesystemhardwarefromstarting(CPU,RAM,bus,externalequipment)constitutetheSOPCBuilderhardwaresystem,andthen,through,theNiosIIIDEdevelopmentofembeddedsoftware,andhardwareoftheembeddedSOPCBuilderrealizetheintegraldevelopmentofthecalendar.ThroughtheapplicationSOPCBuilderdevelopmenttools,designerscangetridofdetailsoftraditionalandeasytogowrongthedesignofthesoftwareandhardware,soastospeeduptheprojectdevelopment,toshortenthedevelopmentcycle,savethepurposeofdevelopmentpays.
关键词:
SOPCBuilder嵌入式硬件开发
一、设计要求
用NiosIIDE2开发板的LCD显示电子钟的日期和时间。
LCD分两行显示,第一行显示年月日(例如显示:
20120602),第二行显示时、分、秒(例如显示:
083059)。
用输入按钮BUTTON[0]来控制行的修改,同时让NiosIIDE2开发板上的绿色二极管LEDG0来控制亮与灭来表示这个选择。
当BUTTON[0]按下一次后,LEDG0亮,可以修改年、月、日的数字;再按下一次BUTTON[0]后,LEDG0灭可以修改时、分、秒的数字。
另外用输入按钮BUTTON[3]来控制日期和时间的修改,当处于日期的修改方式时,每按动一次BUTTON[3]按钮,依次更换“年、月、日”的修改。
当处于时间修改方式时,每次按下BUTTON[3]按钮,依次更换“时、分、秒”的修改。
修改后的对象呗选中后,按下BUTTON[2]输入按钮可以增加显示数字;按下BUTTON[1]输入按钮可以减少显示的数字。
二、设计内容
1、构建的模型
2、设计的主要内容
1)确定按键对应的信息
BUTTON[3]:
换行,BUTTON[2]:
加1
BUTTON[1]:
减1,BUTTON[0]:
换列
LEDG0:
制亮与灭来表示这个选择
2)SOPCBuilder建立
SOPCBuilder是QuartusII里的SOPCBuilder进行的,而且不同的DE2开发板,所选择的的器件的型号完全不同吗,在SOPCBuilder的元器件的池有各种我们需要的硬件,本次试验需要添加硬件有CPU,jtag_uart,RAM,LCD显示,PIO,有Button按键,LEDG的,还有LCD_ON(LCD驱动的硬件)。
3)QuartusII处理建立好的硬件
硬件会自动建立一个顶层模块,通过建一个原理图来对对应的硬件进行输入输出的添加,我们可以把SOPC中建立好的硬件系统直接调用到QuartusII,然后通过软程序自动锁定引脚,编译调试工程,下载我们所需要的硬件。
4)NiosII嵌入软件编写
在NiosII里建立工程,选择相应的模块,把相应的模块添加到我们的工程中去,建立工程,编写需要嵌入的程序,添加缺少的头文件对应的宏定义,编译调试工程,进行软件下载,在观察结果,进行对应错误的修改。
三、设计步骤
第一步:
硬件部分设计
1.在自己的文件目录下(如E:
\edatest\)建立一个wnl文件夹,注意目录中不能有空格或中文;
2.打开QUARTUSII,点击FILE菜单下的NewProjectWizard…会弹出相应的对话框:
3.然后输入工程存放目录,或点击工程路径右面的按钮设置工程存放目录,在第二栏中输入工程名称,我们这里输入为wnl;之后点击Finish,对话框消失,此时已经建立好了WNL工程文件;
4.点击Assignment菜单中的Device,选择芯片为CycloneII系列的EP2C35F672C6。
5.确认后。
点击Tools下拉菜单下的SOPCBuilder工具,出现相应的对话框:
6.在系统名称(SystemName)填写为nios_led,选择语言后点击OK,在DeviceFamily中选择所要使用芯片的系列,我们所用的CycloneII,系统频率设为50MHz,在Board中暂时先不做选择,使用UnspecifiedBoard。
7.在左边元件池中选择元件:
我们这个设计工程需要使用NIOS32BITCPU、调试串口、ledPIO、RAM,首先选择如Niosprocessor,这个是NIOS处理器,双击会弹出相应的对话框:
在JTAGDebugModule栏中选择Level1,点击Finish按钮后返回SOPCBuilder窗口,将CPU_0重新命名为CPU。
注意:
对模块命名要遵循如下规则:
*名字最前面应该使用英文;
*能使用的字符只有英文字母、数字和“_”;
*不能连续使用“_”符号,在名字的最后也不能使用“_”。
8.添加JTAGUARTInterface:
此接口为NIOSII系统嵌入式处理器新添加的接口元件,通过它可以在PC主机和SOPCBuilder系统之间进行串行字符流通讯,主要用来调试、下载数据等,也可作为标准输出、输入来使用;
①选择Communication->JTAGUART加入,会出现设置向导。
②保持默认选项,单击Finish,返回SOPCBuilder窗口。
③将jtag_uart_0重新命名为jtag_uart。
9.添加内部RAM:
RAM为程序运行空间,类似于电脑的内存,此空间越大越有利;在EP2C35F672C6这个元件中建议使用4Kbytes;
①选择Memory->On-ChipMemory,双击加入,会出现相应的设置向导:
②设置后如上图所示,点击Finish,返回到SOPCBuilder窗口,重新命名为RAM;
10.加入ledg:
此元件为I/O口,和单片机中的I/O口类似,用户可以根据需要配置选项;
1选择Other->PIO,双击加入,会出现如相应的设置向导:
②将Widths位宽改为4bits;
③选择Outputportsnoly,点击Finish,重新命名为ledg。
再按上述步骤不所需要的,button,LCD添加进去。
11.指定基地址和分配中断号:
SOPCBuilder会给用户的NIOSII系统模块分配默认的基地址,用户也可以更改这些默认地址;
*选择System下拉菜单中的Auto-AssignBaseAddress;
*选择System下拉菜单中的Auto-AssignIRQs;
12.系统设置:
选择More“CPU”Settings,对系统进行设置:
13.生成系统模块:
*选择SystemGeneration栏,如图2-12所示:
*在SystemGeneration中选中HDL选项,如果安装了Modelsim软件并需要仿真设计,可以选择Simulation选项。
*点击Generation,SOPCBuilder根据用户设定不同,而在生成过程中所执行的操作不同,在系统生成后点击“Exit”退出SOPCBuilder。
14.将刚才生成的模块以图标形式添加到BDF文件中:
在SOPCBuilder生成的过程中,会生成系统模块的图标(Symbol),可以将该图标像其它QUARTUSII图标一样添加到当前项目的BDF文件中。
步骤如下:
*单击File->New,弹出如下图2-13所示的对话框:
*选择BlockDiagram/SchematicFile,如上图所示,点击OK;
*在图中单击右键,选择Insert->Symbol。
*在如下图2-15所示的弹出对话框中选择Project->wnl,双击加入;
点击保存,系统会自动命名为led,不要对此文件名再作更改;
*将模块与输入输出接口相连。
*锁定管脚:
新建引脚锁定命令文件,File->New->OtherFiles->TclScriptFile,
文件的格式和内容如下:
#Setup.tcl
#Setuppinsetting
set_global_assignment-nameRESERVE_ALL_UNUSED_PINS"ASINPUTTRI-STATED"
set_global_assignment-nameENABLE_INIT_DONE_OUTPUTOFF
set_location_assignmentPIN_N2-toclk
set_location_assignmentPIN_AE22-toled[0]
set_location_assignmentPIN_W26-toKEY[3]
set_location_assignmentPIN_P23-toKEY[2]
set_location_assignmentPIN_N23-toKEY[1]
set_location_assignmentPIN_G26-toKEY[0]
set_location_assignmentPIN_K4-toLCD_RW
set_location_assignmentPIN_K3-toLCD_EN
set_location_assignmentPIN_K1-toLCD_RS
set_location_assignmentPIN_L4-toLCD_ON
set_location_assignmentPIN_J1-toLCD_DATA[0]
set_location_assignmentPIN_J2-toLCD_DATA[1]
set_location_assignmentPIN_H1-toLCD_DATA[2]
set_location_assignmentPIN_H2-toLCD_DATA[3]
set_location_assignmentPIN_J4-toLCD_DATA[4]
set_location_assignmentPIN_J3-toLCD_DATA[5]
set_location_assignmentPIN_H4-toLCD_DATA[6]
set_location_assignmentPIN_H3-toLCD_DATA[7]
写好之后,点击保存按钮。
假如保存的文件名为Tcl_script1.tcl,需要放到当前的工程目录下。
然后选择Tools->TclScripts,会弹出如图2-19所示的对话框,选择Tcl_script1.tcl,然后点击RUN,管脚约束与锁定就会自动加入了。
*编译工程:
选择Process->StartCompilation命令对工程进行编译;
15.配置FPGA:
接上实验板电源、连上USB下载线,将编译生成的SOF文件下载到目标板上,选择Tools->Programmer目标文件夹下载,选择USB-Blaster模式,通过JTAG口对FPGA进行配置。
第二步:
软件部分设计
1.打开NIOSIIIDE,会弹出工作环境路径选择,点击右边的Browse按钮选择自己的工程所在的文件夹。
2.选择菜单File->New->Project,会弹出相应的对话框:
3.选择C/C++Application,如上图所示,点击Next,会弹出相应的对话框:
4.在SelectProjectTemplate中选择count_bianry;在SOPCBuilderSystem中选择我们刚才建立好的工程,CPU栏会自动选择,如上图所示,点击Finish,系统会自动生成一个循环点亮WNL的软件工程。
5.右键单击工程,选择BuildeProject,会弹出相应的信息,表示正在进行工程编译。
6.选择RUN->RUN…,系统会自动探测到JTAG连接电缆,并弹出相应的对话框:
如果在Configurations栏中的NiosIIHardware前面没有“+”号,就用鼠标左键双击NiosIIHardware进行电缆自动探测;成功后如下图所示:
7.在Main列表中的Project中选择我们刚才建立的工程count_bianry,在TargetConnection中选择所要使用的电缆,如本实验板使用的USB-Blaster,如下图所示:
8.其它部分使用默认选项,点击RUN后,目标板上的灯就会出现逐个点亮的状态。
9.如何要使用Debug进行单步、断点等调试,选择RUN->Debug…,其它步骤类似于上面的RUN->RUN…操作过程。
四、运行情况
基本运行的很好,但是按键不是很灵活,而且在调试的过程中,没有直观的显示调试所在的位置,所以需要进行改进。
此外,LCD的亮度很差,在室内调试可能还好一点,如果在室外很难看的清楚。
最要的是,在运行的过程中会出现一些年份和月份加减法会出错,比如2在2006年01月01日的情况下,居然出现日加到然后又跳回到01,这不仅仅是个别,还有很多的这样的情况,我没发现而已。
综上所述,程序存在瑕疵,但基本可以运行。
五、问题分析与解决的方法
问题一,在第一进行引脚锁定的时候,不管怎么样都无法锁定,一直报错,而且引脚锁定程序没有任何错,既没有空格的错误也没有分号的错。
错误提示,是找不到相应的文件工程,其实这只是一个我们很容易忽略的错误,前面提到了工程文件不能出现中文和空格,但是却在一次习惯性的出现了这种错误。
问题二,硬件原理图在编译的时候报错,其实这是很常见的错误,我这次所出现的错误就在引脚连线的时候,没有联好,只需要把线删掉,再重新连接一遍,或者多变就可以解决错误,但是每一次的编译太耗费时间。
问题三,在进行C语言编译的时候还是出现了一些原来学C语言出现的问题,比如说丢了分号,少了大括号,中英文混合,这些错误很常见也很常犯,只要小心即可。
六、心得体会
我主要是对比单片机说一些我的想法。
首先,我是抄写课本上的程序的,在试验的过程中,我发现这个程序首先存在丢行的错误,这是很低级的错误。
最最主要的是这个程序在设计的时候就存在重大缺陷,(建议下一届不要用这个程序)这个程序的核心思想就是把所有可能出现的情况全部罗列出来,比如闰年、大小月等,这种思路简单,但是容易考虑不全,在本次试验中,显然就没有考虑全面,出现了很多硬伤的错误,很难找的出来。
其次,这个试验的程序非常的不人性化,因为当我们再调试时候,我们很难判断我们呢到底是调试哪一行,是在调试哪一个数字,而在,我们以前做的单片机中,可以把需要调试的内容,直接闪烁,这样便于我们更加直观的判断所调试的内容,再者,所调试的按键的灵敏性非常的差,不知道是程序的问题还是开发板硬件的问题。
最后我就单片机和FPGA做一个简单的比较。
单片机属于CPU类型的,FPGA是数字电路。
FPGA则是操控层次更低,所以自由度更大的芯片,对FPGA的编程在编译后是转化为FPGA内的连线表,相当于FPGA内提供了大量的与非门、或非门、触发器(可以用与非门形成吧)等基本数字器件,编程决定了有多少器件被使用以及它们之间的连接。
它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。
它是作EPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
FPGA在抗干扰,速度上有很大优势。
但是,FPGA在生成内核的时候,非常的麻烦和复杂,一不小心就容易出错,而且错误很难找出来,而且FPGA需要很多的知识储备,不容易入门,而且硬件开发板非常昂贵,而且在市场的书籍也大部分是需要对应开发板来进行编写的,灵活很小,不利于大规模的推广。
单片机可以理解为集成在单一芯片上的微型计算机系统,麻雀虽小可是五脏俱全,也有运算器、控制器、存储器、总线及输入输出设备,采用也是存储程序执行的方式,对单片机的编程就是对其中的ROM写入程序,在加电后ROM中的程序会像计算机内存中的程序一样得到逐条的执行。
单片机计算速度和性能有限,但在一些基本控制上搓绰绰有余。
FPGAFPGA的使用非常灵活,同一片FPGA通过不同的编程数据可以产生不同的电路功能。
FPGA在通信、数据处理、网络、仪器、工业控制、军事和航空航天等众多领域得到了广泛应用。
随着功耗和成本的进一步降低,FPGA还将进入更多的应用领域。
价格有十几块钱,也有几十块钱的。
单片机是诸如通讯接口、定时器,实时时钟等外围设备。
而现在最强大
的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块
芯片上。
产品可选范围大、低成本、高可靠、高安全、易于编程、低功耗。
价格大概在5-8块钱左右。
总结起来,用单片机要消耗时间,用FPGA要占用空间;用单片机就是用软件,用FPGA就是用硬件。
FPGA在时钟上要比单片机灵活得多。
参考文献:
张志刚,《FPGA与SOPC设计教程:
DE2实践》,西安:
西安电子科技大学出版社,2007
夏宇闻、黄然,《VerilogSOPC高级实验教程》,北京:
北京航空航天大学出版社,2009
侯建军、郭勇,《国家电工电子教学基地系列教材•SOPC技术基础教程》,北京:
清华大学出版社,2008
杨军、李彤,《基于FPGA的SOPC实践教程》北京:
科学出版社2010
汤书森、张北斗、安红心等,《嵌入式FPGASoPC技术实验与实践教程》北京:
清华大学出版社,2011
窗体底端
杨军、张伟平、赵嘎、王小军,《面向SOPC的FPGA设计与应用》北京:
科学出版社2012
王建校、危建国,《SOPC设计基础与实践》,西安:
西安电子科技大学出版社,2006
蔡伟纲,《Nios2软件架构解析》,西安:
西安电子科技大学出版社2007
江国强,《SOPC技术与应用》,北京:
机械工业出版社2006
赫建国、倪德克、郑燕,《基于NiosII内核的FPGA电路系统设计》,北京:
电子工业出版社,2010
王晓迪、张景秀,《SOPC系统设计与实践》,北京:
北京航空航天大学出版社,2008
窗体底端
徐敏、孙恺、潘峰,《开源软核处理器OpenRisc的SOPC设计》,北京:
北京航空航天大学出版社,2008
附件:
运行程序
#include"alt_types.h"
#include
#include
#include"system.h"
#include"sys/alt_irq.h"
#include"altera_avalon_pio_regs.h"//通用I/O口与高层软件之间的接口
#include
#include"count_binary.h"
#include
#include"LCD.h"
#include
volatileintedge_capture;
alt_u8flag;
voidLCD_Init()
{
//LCD初始化
lcd_write_cmd(LCD_16207_0_BASE,0x38);//8位总线2行显示
usleep(2000);
lcd_write_cmd(LCD_16207_0_BASE,0x0C);//关闭显示,光标闪烁
usleep(2000);
lcd_write_cmd(LCD_16207_0_BASE,0x01);//清显示屏幕
usleep(2000);
lcd_write_cmd(LCD_16207_0_BASE,0x06);//光标移动前,不允许调整
usleep(2000);
lcd_write_cmd(LCD_16207_0_BASE,0x80);//显示指针初始位置
usleep(2000);//lcd初始化
}
voidLCD_Show_Text(char*Text)
{
//LCD输出格式
inti;
for(i=0;i { lcd_write_data(LCD_16207_0_BASE,Text[i]); usleep(2000); } }//lcd显示 voidLCD_Line1() { //向LCD写命令 lcd_write_cmd(LCD_16207_0_BASE,0x80); usleep(2000); } voidLCD_Line2() { //向LCD写命令 lcd_write_cmd(LCD_16207_0_BASE,0xC0); usleep(2000); } staticvoidhandle_key_interrupt(void*context,alt_u32id)//按键子函数 { volatileint*edge_capture_ptr=(volatileint*)context; *edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(KEY_PIO_BASE); //存储按钮的值到边沿捕获寄存器 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_PIO_BASE,0); //复位边沿捕获寄存器 } staticvoidinit_key_pio()//按键中断 { void*edge_capture_ptr=(void*)&edge_capture; IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_PIO_BASE,0xf); //开放全部4个按钮的中断 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_PIO_BASE,0x0); //复位边沿捕获寄存器 alt_irq_register(KEY_PIO_IRQ,edge_capture_ptr, handle_key_interrupt); //登记中断源 } voiddelay(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SOPC 课程设计 实验 报告 万年历 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)