您的位置:首页 > 移动开发 > IOS开发

[FPGA]基于Qsys的Nios II流水灯系统设计

2014-04-01 16:01 531 查看
一、基本说明

1、软件平台:Quartus II 13.0(64-bit)

Nios II 13.0 Software Build Tools for Eclipse

2、硬件平台:Altera Cyclone
II EP2C8Q208C8N

             EPCS4SI8

             SAMSUNG K4S641632K-UC60

二、设计目标

完成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
4000
标签下的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      B
= 1M x 16Bit x 4Banks,具体的其他内容大家可以查看其datesheet。这里的具体配置如图2所示。然后单击Finish完成即可。





图 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  -to sys_clk

#系统复位引脚

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  -to sdram_dq[5]

set_location_assignment pin_30  -to sdram_dq[6]

set_location_assignment pin_31  -to sdram_dq[7]

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  -to sdram_addr[0]

set_location_assignment pin_45  -to sdram_addr[1]

set_location_assignment pin_46  -to sdram_addr[2]

set_location_assignment pin_47  -to sdram_addr[3]

set_location_assignment pin_14  -to sdram_addr[4]

set_location_assignment pin_13  -to sdram_addr[5]

set_location_assignment pin_12  -to sdram_addr[6]

set_location_assignment pin_11  -to sdram_addr[7]

set_location_assignment pin_10  -to sdram_addr[8]

set_location_assignment pin_8   -to sdram_addr[9]

set_location_assignment pin_43  -to sdram_addr[10]

set_location_assignment pin_6   -to sdram_addr[11]

set_location_assignment pin_40  -to sdram_ba[0]

set_location_assignment pin_41  -to sdram_ba[1]

set_location_assignment pin_4   -to sdram_cke

set_location_assignment pin_48  -to sdram_clk

set_location_assignment pin_3   -to sdram_dqm[1]

set_location_assignment pin_33  -to sdram_dqm[0]

set_location_assignment pin_35  -to sdram_cas_n

set_location_assignment pin_39  -to sdram_cs_n

set_location_assignment pin_37  -to sdram_ras_n

set_location_assignment pin_34  -to sdram_we_n

#led

set_location_assignment pin_179  -to led[0]

set_location_assignment pin_176  -to led[1]

set_location_assignment pin_175  -to led[2]

 

附录二 软件代码

#include

#include "system.h"

#include "unistd.h"

#include "alt_types.h"

#include "altera_avalon_pio_regs.h"

 

int main()

{

  printf("Hello from Nios II!\n");

 

  alt_u8 led = 0;

 

  while(1)

  {

           usleep(1000000);

           led = led + 1;

           IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,led);

  }

 

  return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: