SOPC技术LED流水灯设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Sopc_LED实验指导一.实验目的:1.掌握NIOSII软核的定制流程。2.掌握NIOSII的开发流程。3.熟识NIOSIIIDE开发环境的使用。4.掌握基本的软件的调试方法。5.掌握通过寄存器形式对硬件进行控制,可以更透彻地看清NIOSII开发过程。二.实验内容:1.PIO模块的构建。2.软件编程,通过寄存器形式对硬件进行控制。3.下载程序并硬件调试。4.扩展实验:程序功能通过SOPC建立的软核来运行程序功能:LED显示控制。通过PIO直接控制8个LED产生流水灯效果三.实验简介:这一节,我将给大家了解第一个与硬件有关的程序,虽然内容简单,却极具代表性。我将采用一种寄存器的操作方案,让大家感受到开发NIOS跟单片机一样的简单,看透NIOSII开发的本质,尽量避免使用NIOSIIIDE提供的API,这样做有很多好处。首先,有单片机开发经验的人应熟悉这种操作方案,其次,它是硬件试验部分的第一课,通过这个简单的实验,可以让你对单片机的操作有一个感官上的了解,可以说意义不同寻常。这一节,我也通过LED实验来带大家进入NIOSII的开发世界,感受NIOS的魅力所在,下面我们开始吧。四.实验内容:1.硬件开发第一步,我们要在软核中加入PIO模块。打开我们上一次建的Quartus工程,如下图红圈所示(如果你没保留上次的工程,需要按照上次指导书重新再做一个下面的。)双击上图的hello_word后进入了SOPCBUILDER界面,如下图所示点击下图所示红圈处PIO(ParallelI/O)点击后,如下图所示,红圈1处是你需要的PIO口的宽度,即你需要几个IO口,这里面我设置为8,即我要控制8个LED,红圈2是选择输出方式,我选择为输出(Output)。接下来,点击Finish,完成PIO模块的构建,然后将其改名为LED,如下图所示接下来,需要自动分配一下基地址,上一次已经讲过,如下图所示接下来,双击cpu,看下图红圈的地址为下图的。点击finish。我们就要开始编译了,点击Generate,耐心的等待编译的结束。接着先保存一下吧,保存好以后,接下来,我们要对工程配置一下了,在左侧边框栏击右键点击hello_word,如下图所示(双击Cyclone:EP1C12Q240C8也可以)点击setting后,如下图所示,点击红圈处DeviceandPinOptions点击后如下图所示,点击红圈处unusedPins。选中ASinputtri-stated.都修改好以后,点击确定,点击OK。需要保存一下,点击save,开始编译。经过一段耐心的等徃,编译成功,如下图所示完成了上面的工作,点击Exit,会出现下面的界面,询问是否需要对Hello_word进行更新,点击“是(Y)”。然后,会出现下面界面,点击OK点击后,如下图:如下图所示,可以看出,还有LED没有管脚相连,我们来建立一个输出管脚,并重命名如果以后会出现下面情况,连线错位,这就需要我们手工来整理一下,将相应的管脚相连接。最后的样子大家可以看到,如下图所示,我们将其命名为LED[7..0],这是quartus中总线的命名方式,大家要注意。一切准备好了,我们需要给他进行引脚分配,按上次试验方式给他进行引脚分配。有不清楚的看上次的指导书和看以前的电子设计自动化实验指导书(附有管脚分配的word文档)。下面,我们开始编译了,又是一次漫长的等待后,看到了下图红圈所示,说明编译成功。2.软件开发:首先打开NIOSII9.0IDE,把工程路径切换到上次做的quartu的工程里面去。File-SwitchWorkSpace-Browse选中你d:projectname/hello_word的工程里面去。(如果你们没有,就新建了工程的,根据你quartus的工程路径,然后切换到那里去)。存储路径不能出现中文,否则会报错的。如果你是用上次的工程文件,则会出现如下图红圈的选中它,点击右键出现了下图的,点击Delect然后选第一个点击yes重复上面的方法删掉另一个文件,只留下(如图):没有上次工程的,就要新建立一个软件工程,操作方案如下图所示,File-New-Project点击后,会出现工程向导界面,如下图所示,选中红圈处的内容,NiosIIC/C++Application,点击Next,会出现下图所示内容,红圈2处是工程名,我将其修改为LED_test,红圈3处是目标硬件文件,点击Browse,找到我们上面生成的NIOS软核的位置,这个文件是以.ptf为后缀的,如果大家跟我的地址一样的话,地址应该是在D:\projectname\hello_word.ptf。在红圈1处选中BlankProject,这个地方是空工程模块。红圈4,这个地方是改变工程所放位置的,如果不修改,软件工程的位置就在Quartus工程目录下得software下面,再这里不需要点击。(按下图选择)点击Next,这里不用修改,点击Finish,完成工程向导.在工程目录区中的LED_test项单击鼠标右键后,点击红圈处的位置SystemLibraryProperties点击后,可看到下图所示界面,(按图选择)按顺序来,红圈1处是标准输入(stdin)、标准输出(stdout)、标准错误(stderr)的位置区,我们在软核中构建了JTAGUART,在此出现效果了吧,如果我们没有构建JTAGUART,那么,这个地方就不会出现jtag_uart选项了。在所红圈2处,这个地方也不需要修改,不过有一个地方需要注意,就是SupportC++,这个库相对SmallClibrary要大,如果大家手中的板子没有FLASH,SDRAM这样大容量存储设备的话,选择SmallClibrary,用FPGA内部的SRAM,也可以跑些小程序。再说红圈3处,这个是一些有关内存的选项,默认就可以,不用修改。点击后,我们看看是什么样子(如下图),这里有两个关键点,一个是红圈1处,这个地方时配置编译器的优化级别,红圈2的地方是调试级别。编译器的优化级别会让你的生成的代码更小,当要求也很高,你的代码如果不严谨,有可能优化以后不好用了,大家要注意。调试级别是你在编译过程中显示编译内容多少,级别越高显示内容的越多,建议将调试级别调到最高。将上面设置好以后,点击Apply,然后点击OK,回到主页面。再添加一个c文件。如图所示:点击后,出现如下图所示,并命名一个点****.c文件*****代表你的c文件名,点击finish。出现如下图将下面程序复制上去,保存一下,在进行编译。(下面的注释不能以文字开头,必须以//开头)#includesystem.h#includealtera_avalon_pio_regs.h#includealt_types.hintmain(void){alt_u8led=0x02;//00000010alt_u8dir=0;//00000000volatileinti;while(1){//程序第一次执行的时候,第一个if语句和第二个if语句都不会执行的。//当led变量的值在else语句里面左移到10000000=0x80的时候,第一个if语句就满足执行的条件//当第一个if语句执行第一次(第寄数)之后,dir的变量值就为1,就满足第二个if语句执行//第二个语句执行的时候led变量值是从10000000右移到00000001if(led&0x81)//led为10000000;或者是00000001的时候这个If语句都会执行{dir=(dir^0x01);//1}if(dir)//1{led=led1;//LED右移动显示led=10000000;}else{led=led1;//LED左移动显示//0000010;}IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,led);//赋值i=0;while(i100000)//延时i++;}return0;}复制好后接着进行编译。编译好以后,大家可以看到下面界面,红圈处说明了,编译完成。(无错误显示0error)③.运行按下图点击下载选中helloword.sof文件下载好后进行下面的操作对于NIOSIDE提供了几种方法来验证,一种是直接硬件在线仿真,一种是软件仿真。我们先说第一种硬件在线仿真,很显然这种方案需要硬件配置,一块开发板,一个仿真器(仿真器就是大家用的USB-BLASTER或者BYTE-BLASTER)。将仿真器与开发板的JTAG口相连。安装好以后,我们进行下面的操作,点击红圈处NiosIIHardware。点击后,可以看观察栏的控制台(Console)。说完第一种硬件在线仿真以后,我们再说说软件仿真。软件仿真不需要硬件,电脑单独运行即可,按下图所示操作,点击红圈处,NiosIIInsructionSetSimulator。点击(yes)双击红圈处,设置断点全速运行,观察下面图的红圈。可看到变化。扩展实验程序:(花样流水灯)//////////////////////////////////////////////////使用的是CPU内部内存//NIOSII的工程路径最好不要有汉字和一些特殊字符,最好用英文////////////////////////////////////////////////#includesystem.h#includealtera_avalon_pio_regs.h#includealt_types.h/*流水灯花样,低电平点亮,注意调用时候用了取反操作*/constalt_u32LED_TBL[]={0x00,0xFF,//全部熄灭后,再全部点亮0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//依次逐个点亮0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,//依次逐个叠加0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,//依次逐个递减0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,//两个靠拢后分开0x81,0xC3,0xE7,0xFF,0xFF,0xE7,0xC3,0x81//从两边叠加后递减};/*********************************************************************名称:main()*功能:控制LED流水显示。********************************************************************/intmain(void){alt_u8i;alt_u32j;while(1){for(i=0;i42;i++){/*流水灯花样显示*/IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,~LED_TBL[i]);j=0;while(j100000)//延时j++;}}return0;}接下来,我们总结一下这节内容。我们来对比一下寄存器操作方式不API之间有什么联系和异同,上面癿程序,如果用NIOSIIIDE提供的API来写,那么如下图所示IOWR_ALTERA_AVALON_PIO是一个宍,在altera_avalon_pio_regs.h中,其定义如下(大家可以按住ctrl键后,用鼠标点击进入定义所在的位置)大家可以看到,它是一个IOWR的宏,而IOWR的具体写法我就在此不详细说了(大家感兴趣的可以去NIOS的源码),反正就是对硬件地址的控制。我的做法就是绕过这个大圈子,直接去控制它的寄存器。大家可能有点纳闷,我们的结构体中定的了四个变量,但却用了DATA一个,在这说明一下原因,首先是DIRECTION。返个是IO的方向,就是说是输入还是输出,或者是双向的。因为在我们构建PIO模块的构成中有了一个选项,如下图所示,红圈2,我们选择了输出(Outputportsonly),也就是我们在底局就已经固定了它的方向,所以在软件中就还需要在定义了。还有两

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功