一、基本说明
1、软件平台:Quartus II 13.0(64-bit)
Nios II 13.0 Software Build Tools for Eclipse
2、硬件平台:Altera Cyclone II EP2C8Q208C8N
二、设计目标
完成FPGA平台上的流水灯的实现,实现方式:基于Qsys的Nios II系统设计,同时将硬件配置程序和软件程序固化到EPCS中,上电后自动配置FPGA,将程序加载到SDRAM中,实现流水灯的功能。
三、具体步骤
1、打开Quartus II 64-Bit软件,新建工程。单击File -> New Project Wizard,打开New Project Wizard对话框,单击Next>,在what is the working directory for this project?中设置工作目录的位置,如F:/FPGAandCPLD/Demo/NIOS/LED,这里强烈建议大家习惯使用全英文目录,且目录中不要包含空格等。然后设置工程的名称(What is the name of this project?),如LED。最终完成效果如图1所示。
图 1 Directory,Nmae,Top-Level Entity
2、单击Next->,我们没有文件需要添加到当前工程中,所以继续单击Next>进入下一步。这里我们设置器件,使用的Cyclone II系列的EP2C8Q208C8N,先在Family中选择Cyclone II,然后在Available devices中选择EP2C8Q208C8,然后单击Next>进行下一步即可。这里进行EDA Tool设置,由于我们没有进行仿真,所以Simulation行中全部选择为。然后单击Finish完成工程建立。
3、我们单击菜单栏的Tools -> Qsys,使用Qsys工具进行NIOS II软核的设置。首先在左侧的Component Library中搜索Nios II Processor,双击,进入设置,在Core Nios II标签下的Select a Nios II Core栏中选择Nios II/s,至于这三种内核的区别前面的文章中有简单介绍,同时网上也有这方面的介绍,这里就不在赘述。然后针对内核的设置暂时到这,等后面的模块添加完成后在进行进一步设置,先单击Finish完成。
4、下面我们添加JTAG UART,方法同步骤3,双击打开后不用进行任何设置,直接Finish完成即可。
5、下面我们添加System ID Peripheral,同上,双击打开后在Parameters中设置我们希望的系统ID即可,如设置为123,单击Finish完成设置。
6、下面我们添加SDRAM Controller,这里我们使用的SAMSUNG的SDRAM芯片,大小为64M
图 2 SDRAM设置
7、下面我们添加EPCS/EPCQx1 Serial Flash Controller,这里我们不用进行任何设置,直接单击Finish完成即可。
8、最后我们添加PIO。双击打开后,根据实际需要选择位宽(Width)和方向(Direction),这里我们使用的是3个LED,所以Width设置为3,Direction设置为Output。单击Finish完成设置。
9、至此,所有系统需要的模块已经添加完成,这里我们更改一下各个模块的名称,依次选择各个模块,右击,选择Rename进行名称更改。然后进行连线。然后设置输出名称,同时将右侧的IRQ依次连上,最后在epcs_flash_control后面的小锁单击,将其锁上。具体完成效果图如图3所示。
图 3 重命名、连线等完成效果图
10、继续对Nios II内核进行设置。双击打开nios2_qsys,在Core Nios II标签下,Reset vector memory设置为sdram.s1,Exception vector memory设置为epcs_flash_controller.epcs_control_port,然后单击Finish完成设置。
11、下面我们单击菜单栏的System -> Assign Base Addresses,这时我们会发现下面Message中的错误全部消失,然后单击File -> Save进行保存,保存名称为led_nios,然后选择Generation选项卡,单击左下角的Generate进行生成即可。生成时间较长,大家耐心等待。
12、生成完成后,发现会有3 Warnings,这里的警告不影响我们随后的操作,随意我们忽略这3个警告,单击Close后关闭Qsys对话框回到Quartus II主界面。
13、单击菜单栏中的Project -> Add/Remove Files in Project…,选择Files标签,然后在File name中找到我们工程所在文件夹下的led_nios.qsys文件,然后单击Add,将其添加到我们的工程文件中。最后单击OK返回。
13、单击菜单栏的File -> New…,新建一个Block Diagram/Schematic File。然后双击新建的文件的空白处,选择左侧Libraries中的Project中的led_nios,单击OK将其添加到我们工程中。
14、下面添加PLL模块,系统需要两路时钟,一路供给内核,另一路供给SDRAM,同时这两路时钟需要有一定的相位差。双击空白处,打开Symbol对话框,单击MegaWizard Plug-In Manager…,选择Create a new cunstom megafunction variation,单击Next>进行下一步配置。左侧我们搜索ALTPLL,然后选中,右侧在What name do you want for the output file?中后面添加PLL模块的名称,如PLL,完成效果为F:/FPGAandCPLD/Demo/NIOS/LED/PLL。然后单击Next>进行进一步设置。
15、在What is the frequency of the inclk0 input?中设置为50MHz,单击Next>,去掉Create an 'areset' input to asynchronously reset the PLL前面的勾。单击Next>,不进行任何设置,单击Next>,不进行任何设置,单击Next>。勾选use this clock,Clock phase shift设置为-60,然后单击Finish完成设置即可。这是弹出一个Quartus II IP Files对话框,不需要进行任何设置,直接单击Yes即可。回到Symbol对话框,单击OK将其添加。
16、双击空白处,打开Symbol对话框,在Name中搜索input,单击OK添加。同样操作,共添加1个两输入与门(and2)、1个双向接口(bidir)、2个输入接口(input)、10个输出接口(output)。具体连接方式和命名方式如图4所示。
图 4 引脚连接方式及命名
17、然后单击File -> Save对文件进行保存,命名为LED.bdf。然后单击File -> New,新建一个TCL Scrtipt File,进行引脚分配,具体分配内容见附录一。然后进行保存,命名为pinset.tcl。然后单击Tools -> Tcl Scripts…,选择pinset.tcl,单击Run,然后弹出对话框,单击OK结束。然后回到LED.bdf文件,可以看到现在引脚已经与标号对应起来。然后我们单击Processing -> Start Compilation,进行编译。编译时间较长,耐心等待。编译无误后进入下一步。
18、单击菜单栏Assignments -> Device…,单击Device and Pin Options…,选择Configuration标签,Configuration scheme选择Active Serial(can use Configuration Device),Configuration device中选择EPCS4;然后选择Unused Pins,Reserve all unused pins选择As input tri-stated,然后选择Dual-Purpose Pins,nCEO设置为Use as regular I/O。然后单击OK完成设置。然后重新编译工程。
至此,硬件部分设计完成,下面进行软件方面的设计。
19、单击菜单栏Tools -> Nios II Software Build Tools for Eclipse,启动Nios II软件开发环境。首先选择Workspace位置,我们定位到和Nios软核共同的文件夹中,即定位到F:\FPGAandCPLD\Demo\NIOS\LED。单击OK继续进行。
20、单击File -> New -> Nios II Application and BSP from Template,在SOPC Information File name中选择我们已经生成的软核信息,即led_nios.sopcinfo。注意,一定要选择对应文件夹下的软核信息,否则由于软硬件不对应导致错误。稍等片刻之后,系统完成对信息的读取,然后自动填写CPU name。下面我们填写Project name,如LED,然后Project template选择Hello word。单击Finish即可完成。
21、右击LED目录下的hello_world.c文件,选择Rename…,这里将名称改为led.c,单击OK完成。然后双击打开该文件。
22、编写代码,具体内容见附录二。
23、右击LED目录,单击Nios II -> BSP Editor,弹出Nios II BSP Editor对话框,然后选择Settings,右侧的设置如图5所示。
图 5 Nios II BSP Editor设置
24、单击右下角的Generate,进行生成。生成完成后退出即可。
25、右击LED目录,选择Build Project,进行工程编译,首次编译时间较长,大家耐心等待。编译无误后,即可进行下一步。
至此,软件设计完成,下面进行硬件配置和软件程序的下载,我们统一下载到EPCS中。
26、返回Quartus II,单击Tools -> Programmer,如果Hardware Setup…后面没有显示出下载线,单击Hardware Setup…进行设置,这里就不在多说。然后Mode选择Active Serial Programming。单击右侧的Add File…,进入output_files中,选择LED.pof文件,勾上Program/Configure,单击Start进行下载。注意,这时下载线要接在AS接口上,而不是Jtag接口上。下载完成后关闭即可。
27、返回Nios II。右击Run As -> Nios II Hardware,打开Run Configurations对话框,然后选择Target Connection,单击Refresh Connections,然后找到下载器后单击Apply,最后单击Run,将程序下载到FPGA。注意:不要以为到此结束,这一步并没有将程序下载到EPCS中,而是将程序下载到SDRAM中,如果掉电后程序仍然不存在。
28、单击Nios II -> Flash Programmer,打开Nios II Flash Programmer,单击File -> New…,打开New Flash Programmer Settings File,选择Get flash programmer system details from BSP Settings File,然后BSP Settings File Name选择对应文件夹下的settings.bsp,然后系统读取信息,自动填写其他相关信息,然后单击OK进入下一步。
29、如果Hardware connection中没有任何东西,则单击Connections进行设置,否则直接进行第29步。进入Hardware Connections后,单击右侧的Refresh Connections,进行下载器的自动连接。注意,这时下载线要接在Jtag接口上,而不是继续接在AS接口上。检测出来后,单击System ID Properties…,进行系统ID检测,便于判断是否是我们之前设置的系统。判断无误后关闭Hardware Connections即可。
30、单击Files for flash conversion后面的Add..,先添加.sof文件,即硬件描述文件LED.sof,然后再添加.elf文件,即软件描述文件LED.elf,注意,这两个顺序不能错误,因为FPGA上电后先加载硬件描述文件,配置软核,然后将程序拷贝到SDRAM中,最后执行SDRAM中的程序,所以顺序不能错误。最终添加完成的后的效果如图6所示。注意比对File Generation command和File programming command中的内容。
30、单击Options,将Generate Files、Program Files、Erase Flash Before Programming以及Run From Reset After Programming前面的勾选上,然后单击Staging Directories…对生成的几个文件的位置进行设置,如果有默认位置直接关闭即可,否则需要进行指定。确认无误后,单击Start进行下载即可。
图 6 .sof和.elf文件添加完成后的效果
至此,本次试验所有操作全部结束,重新上电后,可以看到流水灯在哗哗的跑。
附录一
#系统时钟引脚
set_location_assignment pin_28
#系统复位引脚
set_location_assignment pin_112 -to reset_n
#SDRAM引脚
set_location_assignment pin_192 -to sdram_dq[0]
set_location_assignment pin_193 -to sdram_dq[1]
set_location_assignment pin_195 -to sdram_dq[2]
set_location_assignment pin_197 -to sdram_dq[3]
set_location_assignment pin_198 -to sdram_dq[4]
set_location_assignment pin_15
set_location_assignment pin_30
set_location_assignment pin_31
set_location_assignment pin_208 -to sdram_dq[8]
set_location_assignment pin_207 -to sdram_dq[9]
set_location_assignment pin_206 -to sdram_dq[10]
set_location_assignment pin_205 -to sdram_dq[11]
set_location_assignment pin_203 -to sdram_dq[12]
set_location_assignment pin_201 -to sdram_dq[13]
set_location_assignment pin_200 -to sdram_dq[14]
set_location_assignment pin_199 -to sdram_dq[15]
set_location_assignment pin_44
set_location_assignment pin_45
set_location_assignment pin_46
set_location_assignment pin_47
set_location_assignment pin_14
set_location_assignment pin_13
set_location_assignment pin_12
set_location_assignment pin_11
set_location_assignment pin_10
set_location_assignment pin_8
set_location_assignment pin_43
set_location_assignment pin_6
set_location_assignment pin_40
set_location_assignment pin_41
set_location_assignment pin_4
set_location_assignment pin_48
set_location_assignment pin_3
set_location_assignment pin_33
set_location_assignment pin_35
set_location_assignment pin_39
set_location_assignment pin_37
set_location_assignment pin_34
#led
set_location_assignment pin_179
set_location_assignment pin_176
set_location_assignment pin_175
附录二 软件代码
#include
#include "system.h"
#include "unistd.h"
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"
int main()
{
}