转载出处:http://www.cnblogs.com/kingst/archive/2010/03/24/1694070.html 前言 废话少说,我们马上进入正题。今天是第一节,我首先说一下学习NIOS都需要哪些前提条件。听到 这,初学者可以会有些害怕了,难道学习NIOS还要条件?是的,需要条件,不过这些条件并不是很高,只要大家努力,这些条件都不是问题。 具有一定的单片机基础; 就这么多,大家觉得难么?首先说说第一条,具有一定的单片机基础,这个条件是要有的。单片机的基础在NIOS II学习中体现在它的寄存器操作方式上,这种操作方式是通用的,不管是ARM,DSP,还是51都是一样的,你只要有一种单片机的实践经验就没问题了。再 说第二条,这一条没什么可争议的,NIOS的开发完全是用C语言的,如果你没有C语言的基础,我建议你还是先学习一下C语言再考虑学习NIOS吧。第三条 呢,有最好,如果没有的话也可以,我在以后的文章中都会涉及到,大家跟着学就可以了。第四条也不是必须的,不过学习NIOS不像学习 Verilog/VHDL,通过仿真看看也行,NIOS的学习跟单片机很相似,最好是亲手操作硬件,这样对你的学习有更好的效率和效果。在这里推荐一下我 的FPGA黑金开发板,不仅仅是广告哦,因为我以后的讲解都是以我的黑金板为基础的,大家学习起来也很方便的。 简介 软件版本:本教程基于Quartus II 9.0,NIOS IDE 9.0编写 建立工程 接下来,建立一个工程File->New Project Wizard 第一行是工程的路径,你选择你放置的路径即可。 第二,第三行都是是工程名,写好以后如下 点击 Next, 这个不用动,接着点击Next 在这里,Family里选择Cyclone II,在 Available devices中选择EP2C5Q208C8(具 体内容根据你的芯片所定)。如上图所示。 接着点击 Next,不用动,点击Finish,显示如下图所示。 到此为止, 工程已经建立完成。接下来,需要建立一个Block Diagram/Schematic File,点击File->New,如下图所示 点击OK, 完成建立,工程中出现了一个Block1.bdf文件 建立NIOS II软核 点击以后,SOPC Builder运行,界面如下图示 System Name中输入软核的名字:我将其命名为KERNEL。点击OK后,如下图所示 按图中标注 的,clk_0为时钟名称,50.0为时钟值(单位为MHz),我们可以对他们进行修改。用鼠标点击50.0,将其改为100.0。这时候,我们的软核时 钟就为100.0MHz了。这是软核建立的第一步,接下来,我们要建立Nios II Processor。 建立CPU 点击后,将出现下图 这一步我们 来选择软核的类型。这里给我们提供了三种类型,Nios II/e占用资源最少600-800LEs,功能也最简单,速度最慢。Nios II/s占资源比前者多一些,功能也多了,速度也快一些Nios II/f占资源最多,功能也最多,速度就快。选择的时候要根据你的需求和你的芯片资源来决定。在这里,我选择Nios II/s,功能和速度都可以得到满足。下面的Reset Vector是复位后启动时的Memory类型和偏移量, Exception Vector是异常情况时的Memory类型和偏移量。现在还不能配置,需要SDRAM和FLASH设置好以后才能修改这里,这两个地方很重要。接下来连续点击Next,一直到下图为止 这里设置 JTAG Debug Module,即JTAG调试时所用到的功能模块。功能越多,需要的资源越多,这里,我们选择Level 1即可,不需要过多其他的功能。点击Finish,结束Nios II Processor的建立后,如下图所示 建立SDRAM模块 点击后,如下图所示 在 Presets中选择第一项Custom,在 Bits中选择16,其他项不动,点击Next, 点击Finish,完成SDRAM控制器的设置。在这里之所以选择16,是因为我们用的SDRAM(HY57V641620)是16位的。 建立Avalon三态桥 点击后,如下图所示 点击Finish后,完成三态桥的建立。 建立CFI模块 点击后,如下图所示 其中Presets,我们选择Custom,Address Width(bits)是地址线宽度,我们选择21,Data Width(bits)数据线宽度,我们选择8位。这些的选择都是根据芯片和电路设置决定的,我们的FLASH(AM29LV1602)可以选择为8位模 式和16位模式,我在设计电路的时候将其配置为8位模式,所以在此数据线宽度选择为6位,地址线宽度选择为21位。设置好以后,点击Next,出现下图所示 这里,我们需要设置三个量,Setup,Wait,Hold,我们分别将其设置为40,160,40如上图所示。这些量都是根据FLASH的芯片决定的, 各个芯片都不一样,在此不具体讲了。点击Finish后,完成Flash Memory Interface(CFI)的建立。到此为止,我们已经建立了CPU,SDRAM,FLASH模块,接下来,我们还要添加一些必要的模 块,System ID,JTAG UART。 建立SYSTEM ID 点击后下图 所示 点击 Finish,完成System ID的建立。 建立JTAG UART 点击后,如下图所示 什么都不用修改,直接点击Next->Finish完成 JTAG UART模块的建立。到此为止,最基本的NIOS系统模块就建立完成了,如下图所示
空心圆变成了实心圆,这就完成了cfi_flash与三态桥的连接,大家亲手试试吧。接 下来我们需要对cpu进行设置一下,双击cpu,Reset Vector处的Memeory选择cfi_flash,Exceptioni Vector选择sdram,其他不变,如下图所示出现下图所示 点击Finish,完成cpu设置。 接下来,我们需要对FLASH地址进行锁定,保证FLASH的起始地址为0x00000000,因为FLASH是系统重启后的起始位置,这样做的好处就是 有利于我们操作,系统重启后从0x00000000开始也是我们的思维习惯。点击系统所示的红圈处 点击,奇迹又出现了,看看下图吧 开着的锁合上了,ALTERA还真逗啊。 最后一步设置就是对地址自动分配,这样做是为了不浪费空间,如果有特殊要求的,也可以手动设置,点击相应的地址,就可以手动修改了,大家自己试试吧。地址自动分配操作如下,点击下图所示红圈处,SYSTEM->Auto-assign Basic Addresses 点击后,大家可以发现,各个模块的地址都有相应的变化,但CFI_FLASH基地址还是0x00000000,锁定的还算成功啊,呵呵!接下来是中断的自动分配,和地址自动分配一样,SYSTEM-> Auto-assign IRQs,如果有什么特殊需要,可以手动更改中断的优先级。之所以要自动分配一下,是因为这个软件还不够智能,当模块建好以后,有出现重复中断号的现象, 编译的过程就会出现问题,自动分配了以后就不从上自下按顺序排列了。你还会发现,图片上出现的红叉也都消失了。展现我们的劳动成果最后的样子,红叉没有了吧,这时候我们就可以编译了。 点击 Next,出现下图,如果需要仿真的,点击红圈处,将其选中,我一般不进行仿真,此处就不选了。 点击 Generate,我们就开始编译了。想休息的赶紧休息一下,想去WC也快去吧,时间还充裕,呵呵……经过漫长的等待以后,我们的程序终于编译好,请看下 图红圈处,看到successful了么?只要看到他就没问题了,软核已经好编译好了,点击Exit,回到了Quartus界面。 分配管脚 放好以后,如下图所示 在NIOS 软核KERNEL上点击右键后点击Generate Pins for symbol ports,这一步作用就是生成管脚,通过命名以后分配真实的引脚。 点击后,如下图所示, 建立锁相环PLL模块 出现下图所示,用鼠标选中红圈1所在的位置ALTPLL,在红圈2所在的位置处,加上PLL,目的是将我们所要建立的锁相环命名为PLL。 一切弄好以后,点击Next,如下图所示,将红圈处设置为20,即我们输入的晶振为20MHz 设置好以后,点击Next,将下图中选中的地方去掉后, 连续点击Next,等出现下图以后,将红圈处设置为5,这是c0输出的频率就设置为了100MHz,可以从Actual settings处看出来。 设置好以后点击Next,出现下图,将红圈1处选中,红圈2处修改为5,红圈3处修改为-75。这部分是给SDRAM提供时钟,我们利用锁相环PLL的 c1来提供,时钟频率设置为100MHz,偏移量为-75deg(这个地方影响到SDRAM是否正常运行,我们将在以后具体讲述他的设置,在这里不详述了)。 设置好以后,连续点击Next,中间没有需要修改的,最后点击Finish,完成PLL的建立,然后点击OK,回到Quartus界面,将我们建好的 PLL放到空白处。接下来的工作就是将PLL连接到NIOS软核上。如下 图所示(连线方式很简单,大家自己研究一下,我就不具体说了) 接下来我们要给SDRAM的时钟分配引脚,这个就由c1完成了。首先是加一个output引脚,方法很简单,在空白处双击,出现下图,在Name处输入 output,一个回车,OK了。假如你要加入input,即输入引脚,你就在Name处输入input,还有双向引脚的是bidir,常用的就这几个, 大家记住了就可以了,很简单。 将其放到下图红框所示位置,连好线就OK了 调整FLASH引脚 那么,我们就来修改一下,修改结果如下图所示 这里,需要注意红圈处的改动,将软核输出命名为F_A_T[20..0],F_A[19..0]连接的是F_A_T[20..1],F_ALSB连接的是 F_A_T[0],不知大家是否能看的懂。这个地方命名方式是这样的,点击想命名的线,当被选中后,直接输入你想输入的网络标号即可,大家自己试试吧,很 简单。大家要注意一下,网络标号的颜色跟线的颜色是一样的,而文字的颜色是绿色的,大家要区分开,如下图所示 TCL脚本文件 我们要命的名字就是后面那部分,PIN_*是FPGA硬件上的引脚,S_DB 我们可以看到,CLOCK是对应PIN_23,我们再来看原理图 我们可以看到,下面的原理图中20MHz晶振X1接的就是FPGA的23脚 这回大家知道是怎么回事了吧,我将会提供给大家写好的TCL文件,到时候大家根据我给大家的TCL文件,将相应的管脚命名即可。下面我就将其他的管脚重命名,这是个繁琐的工作,很无趣。修改好以后,我们来看如何执行TCL脚本文件,按下图所示操作 点击以后,出现下图,我们选择第一个(前提是你将kingst.tcl放到工程文件下) 选中后点击 Run,如下所示,又看见Successfully了吧,这说明我们脚本文件运行成功了。 配置工程 点击 setting后,如下图所示,点击红圈处Device and Pin Options 点击后,如下图所示 点击后如下图所示,点击红圈处Configuration 点击后,如下图所示,将红圈处改为EPCS1,然后点击Dual-Purpose Pins 点击后,如下图所示,将红圈处改为Use as regular I/O 都修改好以 后,点击确定,点击OK。接下来就开始了又一个漫长的编译过程了,大家又可以休息一会了。点击下图所示红圈处的按钮,开始编译。 经过了漫长的编译过程,如果没有问题,编译成功后将出现下面的对话框 点击确定,编译过程全部结束。我们可以通过编译报告来看看我们用了多少资源,如下图所示,红圈处可以看出,我们这个系统,用了66%的TLE。 最后,我们需要检查一下,是否每个引脚都已经分配好了,以免有个别没有分配的,影响后面的实验。回到SOPC_T.bdf,看一看是不是每个引脚都有个小 “尾巴”,如下图所示 有的,说明这个引脚已经分配好了,仔细检查好每一个引脚,如果没有问题,就可以把程序下载到硬件里面了。 下载程序 点击后,进入下图所示界面,红圈1是模式选择,红圈2是下载器的选择,红圈3加入相应的文件。如果你通过JTAG口下载程序,就要将下载线接到JTAG 口,选择JTAG模式,将*.sof文件加入到这里面。如果你通过AS口下载程序,你就要将下载线接到AS口,选择AS模式,将*.pof文件加入到这 里,大家自己试试吧。最后点击Start,开始下载。现在市面上的下载线以USB-BLASTER为主,价格各有不同,贵的有200多的,便宜的50多块 钱,我觉得可以用就行,贵的未必好,自己的看法啊,大家自行选择吧。 到这里,我们有关硬件开发的部分就高一段落了,如果对以上内容有问题,请大家留言,我将尽快给大家解决。 下一节,我将给你讲解NIOS II软件开发部分内容,敬请关注…… |
个人疑惑:
cfi_flash配置中的 Actual setup time, Actual wait-state time, Actual hold time 是怎么根据数据手册确定的设置值?
锁相环PLL的c1给SDRAM提供的时钟频率为什么是100MHz,偏移量为-75deg,偏移量怎么确定的?
文章评论(0条评论)
登录后参与讨论