helloworld:基于Qsys的第一个Nios II系统设计

一、平台说明及设计目标

  • 软件平台:Quartus II13.0(64bit)及 Nios II 13.0 Software Build Tools for Eclipse
  • 硬件平台:Altera Cyclone III EP3C16F484C6
  • 设计目标:实现FPGA平台上的“Hello World”

二、实现步骤

1、新建工程

  • 打开quartus新建一个工程:File -> New Project Wizard…工程路径使用英文,不要含有空格等,否则后面会出现问题
    helloworld:基于Qsys的第一个Nios II系统设计_第1张图片
  • 添加文件:无添加文件,点击Next即可
  • 器件设置:根据自己使用选择即可,此处选择Cyclone III EP3C16F484C6
    helloworld:基于Qsys的第一个Nios II系统设计_第2张图片
  • EDA工具设置:由于此工程不进行仿真等,故不进行设置,如果需要进行ModelSim仿真,则在Simulation行中,选择Tool Name 为ModelSim-Altera(这里根据所安装的ModelSim版本进行选择),Format(s)选择为Verilog HDL(这里也是根据所掌握的硬件描述语言进行选择)。点击 Next
  • Summary页面:单击 Finish 完成即可。

2、新建原理图bdf文件

  • File -> New..,选择Design Files 中的Block Diagram/Schematic File,单击OK即可,出现block1.bdf文件
    helloworld:基于Qsys的第一个Nios II系统设计_第3张图片

3、硬件部分设计

  • 启动Qsys工具:单击 Tools -> Qsys ,进入Qsys设置界面

  • 系统已经默认添加了时钟模块,名称为 clk_0 ,这里选中 clk_0,右击,选择Rename,将其名称去掉_0更改为clk,下面添加的模块也进行类似名称更改。

  • 左面Component Library,是系统提供的元件库,里面有一些构成处理器的常用模块。右面是已经添加到系统的模块,也就是说,Nios II 软核处理器是可以定制的,根据具体需要来。

  • 接着添加软核处理器的各部分模块:总共需要添加Nios II Processor、On_ChipMemory(RAM or ROM)、JTAG UART、System ID Peripheral这4个模块。

  • 添加软核Nios II Processor:在Component Library中搜索Nios II Processor,双击即可进行配置。首先需要选择的是Nios II 核心的类型。Nios II 软核的核心共分成三种,为e型、s型以及f型。e型核占用的资源最少 600-800LEs,功能也最简单,速度最慢。s型核占用资源比前者多一些,功能和速度较前者都有所提升,f型核的功能最多,速度最快,相应的占用资源也最多,选择的时候根据需求和芯片资源来决定,这里我们选择s核。下面的 Reset Vector 是复位后启动时的Memory 类型和偏移量, Exception Vector 是异常情况时的 Memory 类型和偏移量。现在还不能配置,需要 SDRAM 和 FLASH 设置好以后才能修改这里,这两个地方很重要。最后单击 Finish,结束当前配置。

  • 添加片内存储器:在元件库中搜索 On Chip Memory,双击进行设置。主要设置Size中的Data width(数据位宽)为16位和Total memoy size(片内资源大小,根据芯片资源进行合理设置)为10240 bytes。单击 Finish,结束当前配置。

  • **添加Jtag下载调试接口:**JTAG UART 是实现PC和nios ii 系统间的串行通信接口 ,它用于字符的输入输出,在NIOS II 的开发调试中扮演重要角色。在元件库中搜索 jtag uart。双击进行设置,选择默认配置即可。单击 Finish,结束当前配置。

  • 添加系统ID模块:系统ID是系统与其他系统区别的唯一标识,类似校验和的这么个东西,在你下载程序之前或者重启之后,都会对他进行检验,以防止quartus和nios程序版本不一致的错误发生。在元件库中搜索 system id peripheral,双击进行设置,选择默认即可。单击 Finish,结束当前配置。

  • 连线:将右面 Connections栏目中的相关线通过设置节点进行连接。首先所有模块的clk和复位reset需要连接起来。然后片内存储器On-Chip Memory的s1和处理器nios2_qsys的data_master和instruction_master相连。JTAG调试模块jtag_uart的avalon_jtag_slave和处理器nios2_qsys的data_master相连。系统ID模块sysid_qsys的control_slave和处理器nios2_qsys的data_master相连。最后,处理器nios2_qsys的中断和jtag_uart的中断相连接。最终的完成效果图如下所示。
    helloworld:基于Qsys的第一个Nios II系统设计_第4张图片

  • 进行软核的相关设置

    • 双击nios2_qsys,进入处理器设置模块。在Core Nios II栏目下,将Reset vector memory 和 Exception vector memory 设置为onchip_memory.s1。

    • 单击 System -> Assign Base Addresses,这时候我们会发现下部Messages窗口中原先的错误全部没有了,变为0 Errors,0 Warnings。如果不是这个结果,返回去按步骤检查。

    • 单击 File -> Save,进行保存,这里我们保存文件名为nios_qsys(文件类型为.qsys)。

    • 选择Generation选项卡,设置Create simulation model为None,然后单击下面的Generate,进行生成。时间较长,大家耐心等待。生成完成后单击close即可,然后关闭Qsys回到Quartus II界面。

  • 双击Block1.bdf的空白处,打开Symbol对话框。单击左下角的MegaWizard Plug-In Manager…,进入宏模块调用界面,选择Creat a new custom megafunction variation,单击 Next> 进入下一步,在What name do you want for the output file下面的地址后面添加输出文件的名称,如原来内容为E:/ADS-B/wtq20170407/NIOS_demo/NIOS_helloworld/,
    添加后为E:/ADS-B/wtq20170407/NIOS_demo/NIOS_helloworld/pll_nios。然后在右侧搜索框中搜索ALTPLL,选中即可,这一步主要为系统添加时钟模块,然后单击 Next>进入下一步。
    helloworld:基于Qsys的第一个Nios II系统设计_第5张图片

  • 弹出ALTPLL设置对话框,这里我们在 General栏目的What is the frequency of the inclk0 input?地方,将时钟更改为50MHz,然后连续单击 Finish完成操作,这时会弹出一个Quartus II IP Files对话框,单击Yes完成即可,不需要进行任何操作。然后单击Symbol对话框中的OK即可,最后将模块放在Block1.bdf中即可。
    helloworld:基于Qsys的第一个Nios II系统设计_第6张图片
  • 双击Block1.bdf的空白处,再次打开Symbol对话框。选择左侧的Libraries -> Project –> nios_qsys,然后单击OK即可,将nios_qsys放置在空白处。同样方法在空白处放置两个输入input和两输入与门and2,按下图连线。
    helloworld:基于Qsys的第一个Nios II系统设计_第7张图片
  • 单击File -> Save,进行文件保存,名称默认即可,如helloword.bdf。

  • 单击 Project -> Add/Remove Files in Project…,单击File name后面的浏览按钮,选择.qsys文件(IP核文件),单击Add将其添加进来,然后单击OK。(如果没有这一步会出现错误Error:Node instance”xx”instantiates undefined entity”xx” vhdl ,意思是你的部分vhd文件包括IP核等没加入工程)

  • 预编译 Processing -> Start -> Start Analysis & Synthesis,然后分配管脚:单击Assignments –> Pin Planner,如下图(这里复位管脚用的是button按钮,不能是拨码开关,否则后面RUN AS Nios II hardware时会报错)
    这里写图片描述

  • 也可以通过tcl脚本的方式分配管脚:新建tcl文件,内容格式:set_location_assignment PIN_G21 -to CLK,然后Tools–>tcl scripts,选中tcl文件,run。

  • 单击Processing -> Start Complilation 进行编译,并把sof文件下载到板子里,硬件部分到此结束。

4、软件部分设计

  • 打开Nios II 13.0 Software Build Tools for Eclipse,首先,需要进行Workspace Launcher(工作空间)路径的设置,接触过Eclipse的朋友都熟悉,自己设定即可,需要注意的是路径中不要含有空格等,然后单击OK即可。

  • 新建工程。单击File -> New -> Nios II Application and BSP from Template,弹出Nios II Application and BSP from Template对话框。先选择对应的SOPC系统,单击SOPC Information File name后面的浏览按钮,选择我们之前硬件部分做好的软核文件,后缀名为.sopcinfo,这里一定要注意,选择的文件一定要对应起来,否则会因为软硬不匹配导致系统失败。我这里选择的nios_qsys.sopcinfo,然后系统会自动读取CPU name,我们不用再进行设置,下面填写Project name,这里我们填
    写为helloword,工程模板(Project template)使用默认的即可。然后单击Finish完成即可。这时候会在左侧的Project Explorer中生成两个工程文件,如图所示。
    helloworld:基于Qsys的第一个Nios II系统设计_第8张图片
    helloworld:基于Qsys的第一个Nios II系统设计_第9张图片

  • 双击打开helloword工程下面的hello_word.c文件,就可以看到c语言代码,我们添加一句printf(“Hello word! \n”);
    helloworld:基于Qsys的第一个Nios II系统设计_第10张图片
  • 右击helloword工程,选择Nios II -> BSP Editor,进入Nios II BSP Editor配置界面。主要在main选项卡下hall中进行配置,具体配置内容见下图。然后单击Generate,生成BSP库。生成完成后,单击Exit退出即可。
    helloworld:基于Qsys的第一个Nios II系统设计_第11张图片
  • 编译helloword工程:右击选择Build Project。

  • 编译完成后,右击工程,选择Run As -> Nios II Hardware,弹出Run Configurations对话框,默认Project选项卡中Project name和Project ELF file name应该都是有内容的,没有的选一下。然后进入Target Connection选项卡,Connections中如果没有东西的话,单击右侧的Refresh Connection来查找我们的下载器,查找后我们单击System ID Prroperties…,进行系统ID检测,检查是否是我们之前设置的ID号,无误后点击Apply,然后再点击Run,这是程序会被自动下载,最终在Nios II Console选项卡中会显示下载完成后程序运行的结果,即发回两句话,具体效果下图所示。
    这里写图片描述

四、出现的问题及解决方法

  • 在软件设计最后一步编译完helloworld工程,进行Run As -> Nios II Hardware时,弹出“Run Configurations”对话框,提示“Connected system ID hash not found on target at expected base address”

  • 我所犯的错误时,原理图bdf文件中,复位管脚的分配,最开始是用的SW,改成BUTTON之后,重新编译工程。在Nios eclipse中重新生成BSP文件,再compile all。错误消失,得到正确实验结果。

  • 问题就出现在复位开关上,需要说明的是这里是开关,而不是按键:复位信号低电平有效,当复位信号处于高电平时,是没有问题的。而复位信号处于低电平时则会出问题,产生该错误。所以估计此时开关使处于低电平状态,故拨动开关,此时电平应是高电平。再次再次运行,ID检测问题解决。

  • 参考博文,文中对这一错误进行了总结:

      1) unused pin没有设置,可能会收到外部信号的干扰;设置未用引脚为As input tri-stated with weak pull-up.

      2) 系统时钟信号没有约束,或者SDRAM等存储设备的时钟没有配置正确;

      3) 系统复位信号没有连接外部复位开关;

      4) 可能某些PIN分配了错误管脚;逐一检查设计PIN的分配。

      5) SOPC系统中没有添加system ID组件。

你可能感兴趣的:(Quartus,NIOS)