【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程
Altera SOPC嵌入式系统设计教程
第1章 概述
SOPC(System On Programmable Chip,可编程的片上系统)是Altera公司提出来的一种灵活、高效的SOC解决方案。它将处理器、存储器、I/O口、LVDS、CDR等系统设计需要的功能模块集成到一个可编程器件上,构成一个可编程的片上系统。
1.1 SOPC及其技术
现今,可将SOPC视为是基于FPGA解决方案的SOC。与ASIC的SOC解决方案相比,SOPC系统及其开发技术具有更多的特色,也有多种途径可构成SOPC方案。
1.1.1基于FPGA嵌入IP硬核的SOPC系统
基于FPGA嵌入IP硬核的SOPC系统是指在FPGA中预先植入处理器。目前最常用的嵌入式处理器大多是采用含有ARM32位知识产权处理器核的器件。为了达到通用性,必须为常规的嵌入式处理器集成诸多通用和专用的接口,但这样无疑会增加芯片的成本和功耗。如果将ARM或其他处理器核以硬核方式植入FPGA中,利用FPGA的可编程逻辑资源,按照系统功能需求来添加接口功能模块,既能实现目标系统功能,又能降低系统的成本和功耗。 这样就使得FPGA灵活的硬件设计与处理器的强大软件功能有机地结合在一起,高效地实现 SOPC系统。
1.1.2基于FPGA嵌入IP软核的SOPC系统
将IP硬核直接植入FPGA的解决方案存在以下不足:
(1)由于此类硬核多来自第三方公司,FPGA厂商通常无法直接控制其知识产权费用,从而导致FPGA器件价格相对偏高。
(2)由于硬核是预先植入的,设计者无法根据实际需要改变处理器的结构,如总线规模、接口方式、指令形式,更不可能将FPGA逻辑资源构成的硬件模块以指令的形式嵌入硬件加速模块(如DSP)。
(3)无法根据实际设计需要在同一 FPGA中集成多个处理器。
(4)无法根据需要裁剪处理器硬件资源以降低FPGA成本。
(5)只能在特定的FGPA中使用硬核嵌入式处理器。
如果利用软核处理器,就能有效地弥补上述不足。
目前最有代表性的软核处理器分别是Altera公司的Nios II核,以及Xilinx公司的Mi-croBlaze核。特别是Nios II核,能很好的解决上述五方面问题。
Altera的Nios II核是用户可随意配置和构建的32位嵌入式处理器IP核,釆用Avalon 总线结构通信接口;包含由First Silicon Solution(FS2)开发的基于JTAG的片内设备(OCI) 内核(这为开发者提供了强大的调试功能)。在把Nios II植入FPGA前,用户可以根据设计要求,利用Quartus II和Qsys,对Nios II及其外围设备进行构建,使该嵌入式系统在硬件结构、功能特点、资源占用等方面全面满足用户系统设计的要求。Nios II核在同一FPGA中的植入数量没有限制,只要FPGA资源足够即可。
另外,在开发工具的完备性方面,Nios II具有很大的优势。Altera不仅提供了强大的 HAL系统库支持,还提供了嵌入式操作系统和TCP/IP协议栈的支持。
就成本而言,由于Nios II是由Altera公司直接提供而非第三方厂商产品,故用户通常无须支付知识产权费用,Nios II的使用费用仅仅是其占用的FPGA逻辑资源的费用。因此,用户选用的FPGA越便宜,则Nios II的使用费就越低。
特别值得一提的是,通过Matlab和DSP Builder,用户可以为Nios II处理器设计各类硬件数字处理器,并以指令的形式加入Nios II的指令集。例如,用户可以根据设计项目的具体要求,随心所欲地构建自己的DSP处理器系统,而不必拘泥于其他DSP公司已上市的有限款式的DSP处理器。
1.2 NiosII软核处理器
1.2.1 Nios II软核处理器简介
继第一代可配置嵌人式软核处理器Nios之后,2004年6月,Altera公司又推出了性能更好的Nios II嵌入式软核处理器。它与2000年上市的原产品Nios相比,最大处理性能提髙了3倍,而CPU内核部分的面积最大可缩小1/2。在2013年底,Altera公司又推出了NIOS II嵌入式软核处理器GEN2版本,并将之前的NIOS II嵌入式软核处理器更名为NIOS II Classic。GEN2版本与Classic相比,有相似的尺寸和性能,用户只需要做很小的改动,就能够把Classic版本上的软件移植到GEN2版本上来。
Nios II系列32位RISC嵌入式处理器具有超过200 DMIP的性能,在低成本FPGA中实现成本只有35美分。由于处理器是软核形式,具有很大的灵活性,可以在多种系统设置组合中进行选择,满足成本和功能要求。采用Nios II处理器进行设计,可以帮助用户将产品迅速推向市场,延长产品生命周期,防止出现处理器逐渐过时的情况。
Nios II开发包含有一套通用外设和接口库,部分IP和接口如表1.2所列。
利用Qsys软件中的用户逻辑接口向导,用户还可以生成自己的定制外设,并将其集成在Nios II处理器系统中。使用Qsys,用户可以在Altera FPGA中,组合实现现有处理器无法达到的嵌入式处理器配置,得到用户所需的结果。
Nios II系列嵌入式处理器使用32位的指令集结构(ISA),建立在第一代16位Nios处理器的基础上,定位于广泛的嵌入式应用。Nios II Classic处理器系列包括3种内核:快速的(Nios II/f)、经济的(Nios/e)和标准的(Nios II/s)内核。更新版的Nios II GEN2处理器系列则取消了标准型内核,保留了经济型和快速型。。每一型号都针对价格和性能进行了优化。使用 Altera 的 Quartus II 软件、Qsys 工具以及Nios II集成开发环境(IDE),用户可以轻松地完成基于Nios II处理器的嵌入式系统开发。
表1.3列出了 Nios II系统的3种内核及特性。
表1.4列出了 Nios II处理器的特性。
1.2.2可配置嵌入式软核处理器的优势
嵌入式处理器开发人员面对的一个最大挑战就是如何选择一个满足其应用要求的处理器。现在已有数百种嵌入式处理器,每种处理器都具备一组不同的外设、存储器、接口和性能特性,用户很难做出一个合理的选择:要么为了匹配实际应用所需的外设和接口要求而不得不选择在某些性能上多余的处理器;要么为了保持成本的需求而达不到原先预计的理想方案。
采用Nios II处理器,用户将不会局限于预先制造的处理器技术,而是根据自己的要求定制处理器,按照需要选择合适的外设、存储器和接口。此外,用户还可以轻松集成自己专有的功能(如DSP,用户逻辑),创建一款“完美”的处理器,如图1.1所示,使用户的设计具有独特的 竞争优势。
用户所需要的处理器,应该能够满足当前和今后的设计性能需求。由于今后发展具有不确定性,因此,设计人员必须能够更改其设计,加人多个CPU,定制指令集及硬件加速器,以达到新的性能目标,而Nios II处理器能满足以上要求。
采用Nios II处理器,用户可以根据需要设置功能,在低成本Altera器件中实现。在单个 FPGA中实现处理器、外设、存储器和I/O接口功能,可以降低用户的系统总体成本。
无论是外设、存储器接口、性能特性,还是成本。这些优势的体现都借助于在Altera的FPGA上创建一个定制的片上系统,或者更精确地说,创建一个可编程单芯片系统。
1.提供合理的性能组合
使用Altera Nios处理器和FPGA,用户可以创建一个在处理器、外设、存储器和1/0接口方面的完美方案。选择如下:
Ø 3种处理器内核——Nias II开发人员可以选择一种或以下任意3种内核的组合:具备髙性能的快速的内核(Nios II/f),具备低成本的经济的内核(Nios II/e),性能和尺寸折中的标准的内核(NiosII/s)。
Ø 超过60种Qsys配备的内核——用户可以创建一组适合自己应用的外设、存储器和I/O接口。
Ø 无限制的DMA通道组合——直接存储器存取(DMA)可以连接到任何外设,从而提高系统的性能。
Ø 可配置的硬件及软件调试特性——软件开发人员具有多个调试选择,包括基本的JTAG的运行控制(运行、停止、单步、存储器等)、硬件断点、数据触发、片内和片外跟踪、嵌入式逻辑分析仪。这些强大的工具可以在开发阶段使用,一旦调试通过后就可以去掉。
2.提升系统的性能
在嵌入式开发中,设计人员通常都会选择一个比实际所需的性能要高的处理器(意味着更髙的成本),从而为设计保留一个性能上的安全余量。Nios II系统的性能是可以根据应用来裁剪的,相比固定的处理器,在较低的时钟速率下,具备更高的性能。Nios II的特性可以在以下几个方面来提升系统的性能:
Ø 多CPU内核一Nios II开发者可以选择最快的内核(Nios II/f)以获得高性能,还可以通过添加多个处理器来获得所需的系统性能。
Ø FPGA系列—Nios II处理器可以工作在Altera推出的所有Cyclone系列、MAX10系列、Arria系列和Stratix系列的FPGA上。尤其是在Stratix V器件上,Nios II/f内核超过350 DMIPS的性能,仅占用1800个逻辑单元(LE)。可以说用户几乎是免费得到一个200 DMIPS性能的处理器。
Ø 多处理器系统——开发人员可以在FPGA内部实现多个处理器内核。通过将多个 Nios II/f内核集成到单个器件内,可以获得极高的性能而不用重新设计印刷电路板。Nios II的IDE支持这种多处理器在单一 FPGA上的开发,或多个FPGA共享一条JTAG链。
Ø 定制指令—定制指令是一种扩展处理器指令的方法,最多可以定制256个用户指令 (见图1.2)。定制指令是处理器处理复杂的算术运算和加速逻辑的最佳途径。例如,将一个在64K字的缓冲区实现的循环冗余码校验(CRC)的逻辑块作为一个定制的指令,要比用软件实现快27倍。
Ø 硬件加速—通过将专用的硬件加速器添加到FPGA中作为CPU的协处理器,CPU就可以并发地处理大块的数据。例如上面提到的CRC例子,通过硬件加速器处理一个64K字的缓冲区,比用软件快530倍。Qsys设计工具中包含一个向导,用户可以用此向导来将加速逻辑和DMA通道添加到系统中。
3.降低系统成本
嵌入式设计人员总是坚持不懈地寻找降低系统成本的方法。然而,选择一款处理器,总是存在性能、特性与成本的冲突,最终结果总是以增加系统成本为代价。利用Nios II处理器可以通过以下途径来降低成本:
Ø 更大规模的系统集成—将一个或更多的Nios II处理器组合,选择合适的一组外设、 存储器、I/O接口,这些方法可降低电路板的成本、复杂程度以及功耗。
Ø 优化FPGA/CPU的选择—Cyclone系列的FPGA提供可行的、低成本的嵌入式方案。经济型的内核(Nios II/e)只占用不到35美分的Cyclone器件资源,仅占用600个逻辑单元,给其他片外的器件保留了更多的逻辑资源。Nios II/e内核定位于低成本、需要低处理性能的系统。占用很少的逻辑资源还使得在单个的FPGA芯片上嵌入多个处理器成为可能。
Ø 更好的库存管理—嵌入式系统通常包含了来自多个生产商的多种处理器,以应付多变的系统任务。当一种器件多余而另一种短缺的时候,管理这些处理器的库存便是个问题。但是使用标准化的Nios II软核处理器,库存的管理将会大大简化,因为通过将处理器实现在标准的FPGA器件上,减少了处理器种类的需求。
4.延长产品的生命周期
开发人员希望快速将产品推向市场并保持一个较长的产品生命周期,避免更新换代。基于Nios II的系统在以下几个方面可以帮助用户实现此目标:
Ø 缩短产品的上市时间—FPGA可编程的特性使其具有最快的产品上市速度。许多的设计通过简单的修改都可以被快速地实现到FPGA设计上。Nios II系统的灵活性和快速上市的特性源于Altera提供完整的开发套件、众多的参考设计、强大的硬件开发工具(Qsys)和软件开发工具(Nios II IDE)。用户可以借助Nios II开发套件所带的设计,在几个小时内就完成自己的设计原型。由于将Nios II处理器放置于FPGA内部就可以验证外部的存储器和I/O组件,电路板设计速度显著加快。
Ø 建立有竞争性的优势—维持一个基于通用硬件平台的产品的竞争优势是非常困难的。而包含一个或多个Nios II处理器,具备硬件加速、定制指令、定制的可裁剪的外设等的SOPC系统,具备了竞争的优势。
Ø 延长了产品的生存时间—使用Nios II处理器的SOPC产品带来的一个独特优势就是能够对硬件进行升级。即使产品已经交付给客户,仍可以定期升级。这些特性可以解决很多问题:
l 延长产品的生存时间,随着时间的增加,可以不断将新的特性添加到硬件中。
l 减小由于标准的制定和改变而带来的硬件上的风险。
l 简化了硬件缺陷的修复和排除。
l 避免处理器的过时。嵌入式处理器供应商通常提供一个很宽的配置选择范围以适应不同的客户群。不可避免的是,某个或多个处理器有可能会因为生产计划等原因而停止供应或很难寻找。Nios II设计人员拥有在Altera FPGA上使用和配置基于 Nios II设计的永久许可。一个基于Nios II的设计可以容易地被重新移植到新系列的FPGA器件中,从而保护了对应用软件的投资。
Ø 在产品产量增加的情况下降低成本—旦一个FPGA的设计被选定,并且打算进行大批量的生产,可以选择将它移植到Altera的HardCopy(—种结构化的ASIC系列) 中,从而降低了成本并提升性能。Altera还可以提供Nios II处理器的ASIC制造许可,用户可以将包含Nios II处理器、外设、Avalon交换式总线的设计移植到基于单元的ASIC中。
第2章 SOPC开发流程简介
2.1 SOPC开发流程
SOPC设计包括以Nios II软核处理器为核心的嵌入式系统的硬件配置、硬件设计、硬件仿真、IDE环境的软件设计、软件调试等。SOPC系统设计的基本软件工具包括Quartus II,用于完成Nios II系统的分析综合、硬件优化、适配、配置文件编程下载以及硬件系统测试等;Qsys,它是Nios II软核处理器的开发包,用于实现Nios II系统配置、生成以及与 Nios II系统相关的监控和软件调试平台的生成;ModelSim,用于对Qsys生成的 NiosII的HDL描述语言程序进行系统功能仿真;Matlab/DSP Builder,用于生成Nios II系统的硬件加速器,进而为Nios II系统定制新的指令;Nios II IDE,用于完成基于Nios II系统的软件开发和调试,并可借助其自带的Flash编程器完成对Flash以及EPCS的编程操作,此外Nios II IDE还包括一个指令集成模拟器、Microc/OS - II实时操作系统、文件系统以及小型 TCP/IP 协议栈。
SOPC的开发过程中要使用到Quartus II、Qsys以及Nios II IDE,三者之间关系如图2. 1所示。
SOPC的开发流程通常包括2个方面:基于Quartus II、Qsys的硬件设计,基于 Nios II IDE的软件设计。对于比较简单的Nios II系统,一个人便可执行所有设计;对于比较复杂的系统,硬件和软件设计可以分开进行。
2.1.1硬件开发
硬件开发使用Quartus II和Qsys。硬件设计工作如下:
(1)用Qsys软件从Nios II处理器内核和Nios II开发套件提供的外设列表中选取合适的CPU、存储器以及各外围器件(如片内存储器、PIO、定时器、UART、片外存储器接口等),并定制和配置它们的功能;分配外设地址及中断号;设定复位地址;最后生成系统。用户也可以添加用户自身定制指令逻辑到Nios II内核以加速CPU性能,或添加用户外设以减轻CPU的任务。
(2)使用Qsys生成Nios II系统后,将其集成到整个Quartus II工程中。可以在 Quartus II工程中加入Nios II系统以外的逻辑,大多数的SOPC设计都包括NioslI系统以外的逻辑,这也是SOPC系统的优势所在。用户可以集成自身定制的硬件模块到SOPC设计,或集成从Altera或第3方IP供应商中得到的其它现成知识产权设计模块。
(3)使用Quartus II软件来选取具体的Altera FPGA器件型号;然后为Nios II系统上的各I/O口分配引脚,另外还要根据要求进行硬件编译选项或时序约束的设置;最后编译Quartus II工程,在编译过程中Quartus II将对Qsys生成系统的HDL设计文件进行布局布线,从HDL源文件综合生成一个适合目标器件的网表,生成FPGA配置文件(.sof)。
(4)使用Quartus II编程器和Altera下载电缆(如USB Blaster),将配置文件(用户定制的Nios II处理器系统的硬件设计)下载到目标板上。当校验完当前硬件设计后,可将新的配置文件下载到目标板上的非易失存储器里(如EPCS器件)。下载完硬件配置文件后,软件开发者就可以将此目标板作为软件开发的初期硬件平台进行软件功能的开发验证了。
2.1.2软件开发
软件开发使用Nios II IDE。它是一个基于Eclipse IDE构架的集成开发环境,包括:
Ø GNU开发工具(标准GCC编译器、连接器、汇编器和makefile工具等);
Ø 基于GDB的调试器,包括软件仿真和硬件调试;
Ø 提供用户一个硬件抽象层HAL(Hardware Abstraction Layer);
Ø 提供嵌入式操作系统MicroC/OS-II和LwTCP/IP协议栈的支持;
Ø 提供帮助用户快速入门的软件模板;
Ø 提供 Flash 下载支持(Flash Programmer 和 Quartus II Programmer)
熟悉Linux下GNU开发工具的开发者基本上可以毫无困难地使用Nios II IDE。
使用Nios II IDE,可完成Nios II处理器系统的所有软件开发任务。使用Qsys 生成系统后,可以直接使用Nios II IDE开始设计C/C+ +应用程序代码。Altera提供外设驱动程序和硬件抽象层(HAL),使用户能够快速编写与低级硬件细节无关的Nios II程序。除了应用代码,用户还可以在Nios II IDE工程中设计和使用定制库。
如果没有软件开发的目标板,可以通过Nios II指令集仿真器(ISS)运行和调试代码;ISS 可仿真处理器、存储器和stdin/stdout/stderr流,使用户可以检验程序流和算法正确性。一旦有一个目标板,用户就可以使用下载电缆(如USB Blaster)下载软件到目标板进行调试/ 运行。
2.1.3 SOPC基本幵发流程简介
在开始进行SOPC设计前,让我们先了解一下SOPC系统的基本开发流程。图2.2所示为基于Nios II系统的SOPC开发流程。
参照图2.2说明SOPC基本的开发流程如下:
1) 在进行SOPC开发之前,首先必须确定系统的需求,如应用系统需要的计算性能、带宽和吞吐量、接口类型以及是否需要多线程的软件等。完整的基于Nios II的SOPC系统是一个软硬件复合的系统。在开发时,可分为硬件和软件两个部分,但在实际设计过程中,有时候所需要的功能既可以用软件也可以用硬件来实现。具体采用什么方式,要根据系统设计要求来权衡。一般来说,用软件实现时,在设计上容易修改或者增删,査错也比较容易,又几乎不增加占用的逻辑资源,但执行速度较慢。所以,在设计规划时,在满足性能的前提下,优先考虑软件实现。
2) 每个开发过程开始时都应建立一个工程,Quartus II是以工程的方式对设计过程进行管理的。在工程中建立顶层模块文件.bdf,其将整个工程的各个模块包容在里面,编译的时候就将这些模块整合在一起。这个顶层文件相当于传统电路设计中的电路板(PCB)。
3) 在Qsys中添加需要的功能模块(Nios II及其标准外设模块),完成后生成一个系统模块。如果需要,用户可以定制指令和外设逻辑。由Qsys最终生成的系统模块相当于传统的单片机或ARM。
4) 如果需要,可以使用Altera公司提供的LPM功能模块。Quartus II包含了大量常用功能模块(如计数器、累加器、比较器、译码器等),使用这些模块能大大加快开发的速度。一般来说,一个设计只有很少部分的模块需要自己从零设计。LPM功能模块相当于传统设计中除处理器以外的逻辑芯片(如74系列)。
5) 如果需要,建立自己的功能模块。当设计中现有的模块功能不能满足设计要求时,要求用户自己设计。可以用硬件描述语言,也可以用原理图的输入方法来设计自己的功能模块。设计自己的功能模块时,可以作为一个独立的工程来设计,并生成模块符号(Symbol),然后将源文件(实现该模块的原理图或HDL文件)拷贝到顶层模块所在的工程目录下,这样在顶层模块中就可以使用这个自定义模块的符号。使用自定义功能模块,相当于在传统设计中,市面上买不到某种芯片而去定做芯片。
6) 在顶层模块中,分别将Qsys生成的系统模块、LPM功能模块以及用户自定义功能模块添加到顶层模块中,然后将各个功能模块用连线连起来组成系统功能原理图。这个过程类似传统电路设计中,将所有要使用到的芯片焊接到电路板上,然后通过PCB上的连线将各个芯片连接起来,组成电路系统。
7) 为系统功能原理图选择芯片载体并为各个输入/输出信号分配芯片的引脚。
8) 设置编译选项,从而让编译器按照用户设定来进行编译。
9) 编译系统,生成硬件系统的配置文件.sof和.pof。编译系统是一个非常复杂的过程,包括优化逻辑的组合、综合逻辑、适配FPGA、布线以及时序分析等步骤。
10) 打开Nios II IDE软件进行用户程序开发。当然这1步也可以在Qsys生成系统模块后立即进行。这个过程与传统嵌入式系统的软件开发类似, 唯一的不同在于,软件所运行的嵌入式系统是自己定制的、裁剪过的,因此可能受硬件的局限会小一些。
11) 对用户软件进行编译,生成可执行文件.elf。
12) 可以在IDE的指令集仿真器(ISS)上仿真软件和运行/调试软件。
13) 将配置文件.sof下载到FPGA,将可执行文件.elf下载到RAM(外部或内部)。
14) 在目标板上调试软件,直到硬件和软件设计都达到设计要求。
15) 利用IDE的编程工具将配置文件烧写到FPGA的配置芯片或Flash。将可执行文件 .elf 编程到 Flash。
2.2 简单SOPC实例开发任务及步骤
【任务】建立一个基于NIOS II处理器系统来控制一个LED灯闪烁。
【步骤】根据2.1.3小节,本节指导读者完成SOPC实例开发流程,主要步骤有:
(1) 分析系统需求;
(2) 启动Quartus II软件和新建实例设计工程;
(3) 启动新的Qsys系统;
(4) 在Qsys工具中定义并生成系统;
(5) 集成Qsys系统到Quartus II工程;
(6) 分析和综合系统并分配引脚;
(7) 设置编译选项并编译硬件系统;
(8) 下载硬件设计到目标FPGA;
(9) 使用NIOS II Software Build Tools For Eclipse开发用户程序;
(10) 调试用户程序;
(11) 运行程序;
2.3 分析系统需求
每一个SOPC系统开发之前,都应该仔细分析系统需求。例如:对所设计系统的运行性能 有什么要求?系统要处理的带宽有多大?应用要求哪种类型的接口?应用要求多线程的软件吗?基于这些问题,用户可确定具体的系统要求,例如:
使用哪种Nios II处理器内核:比较小的还是比较快的?
Ø 设计要求什么外设及其数量是多少?
Ø 功耗有何要求?
Ø 使用哪种实时操作系统(RTOS)?
Ø 硬件加速逻辑在哪些方面可大大提髙系统性能?例如:增加一个DMA外设能释放 CPU在进行数据复制时所占用的资源吗?定制的指令能取代DSP算法吗?
本章实例的开发任务是:
Ø 展示可用于控制LED闪烁的简单Nios II处理器系统。
Ø 利用最通用和有效的方法来建立实际的定制Nios II系统。
Ø 整个系统仅使用片内资源,且不依赖于目标板。
Ø 析任务可以知道FPGA内硬件系统组成应包含:
Ø 带有2 KB指令高速缓存的Nibs II/s处理器核;
Ø 2 KB片内ROM存储器(Onchip_ROM)用于存储程序代码以及程序运行空间;
Ø 1 KB片内RAM存储器(Onchip_RAM)用于变董存储(R/W数据)、Heap、stack;
Ø 1位输出I/O (PIO)引脚来控制LED;
Ø 系统识别外围设备(SystemlD)(关于SystemID的功能见4.1.2小节)。
说明:由于控制LED灯闪烁的用户程序代码很小,所以可将代码固化在片内ROM来执行,变量、堆栈 等空间使用片内RAM,而不使用任何片外存储器。使用片内存储器能获得非常高的执行性能。
整个系统的框图如图2. 3所示。
图中,其他逻辑与NiosII系统一样可存在于FPGA中。事实上,大多数带有Nios II系统 的FPGA设计也包括其他逻辑。Nios II系统可与其他的片内逻辑相互作用,这取决于整个系统的需要。为了简单说明,本章的实例设计在FPGA内不包括其他逻辑。
假定读者具有以下的软件:
Ø Altera Quartus II软件版本13.0或更高的版本——软件必须被安装在符合Quartus II 最低要求的Windows计算机上。
Ø Nios II开发套件版本13. 0或更髙的版本。
无论是否拥有一块开发板,读者都可以按照本章所述来进行实例设计。如果没有目标板,
图2.3控制LED闪烁的系统框图
读者仍然可以使用本章所述内容,但不能目睹实例设计在硬件上运行。取而代之,用户将可以在Nios II指令集仿真器(ISS)上仿真软件运行。如果读者拥有开发板以及USB Blaster下载电缆,用户将能目睹实例设计在硬件上运行及LED灯的闪烁。
2.4使用Quartus II建立工程
每个开发过程开始时都应建立一个Quartus II工程,Quartus II以工程的方式对设计过程进行管理,Quartus II工程包括创建FPGA配置文件需要的所有设置和设计文件。
2.4.1 打开Quartus II软件并建立工程
双击Quartus II图标打开Quartus II 15.1软件,如图2.4所示。
选择【file】【New】【New Quartus Prime Project】来新建一项工程。新建工程想到说明对话框如图2.5所示。
在新建工程向导说明对话框中可以了解在新建工程的过程中我们要完成哪些工作,这些
工作包括:
Ø 指定项目目录、名称和顶层实体;
Ø 指定项目设计文件;
Ø 指定该设计的Altera器件系列;
Ø 指定用于该项目的其他EDA工具,如仿真使用的Modelsim工具
Ø 项目信息报告。
任何一项设计都是一项工程(Project),必须首先为此工程建立一个放置与此工程相关的所有文件的文件夹,此文件夹将被Quartus II默认为工作库(Work Library)。通常,不同的设计项目最好放在不同的文件夹中,而同一工程的所有文件都必须放在同一文件夹中。
不要将文件夹设在计算机已有的安装目录中,更不要将工程文件直接放在安装目录中。文件夹所在路径名和文件夹名中不能用中文,不能用空格,不能用括号(),可用下划线“ _”。
图2. 6第一栏用于指定工程所在的工作库文件夹;第二栏用于指定工程名,工程名可以取任何名字,也可以直接用顶层文件的实体名作为工程名(建议使用);第三栏用于指定顶层文件 的实体名。本例工程的路径为E:\easysopc_class\01_CoreCourse_GHRD文件夹,工程名与顶层文件的实体名同名为CoreCourse_GHRD。
这里解释下CoreCourse_GHRD的意思,CoreCourse是芯航线的意思,GHRD叫做黄金设计顶层,GHRD是Altera首先提出的一个基于Qsys的HPS硬件参考设计工程,一般由板商提供的最基本的HPS硬件工程,开发人员可以根据要求在此基础上添加或者删除FPGA端 IP器件,也可以使能或者失能HPS的部分外设,配置HPS DDR3的时钟参数。这里我们将这个概念引入到我们的开发板中,作为我们板子的一个黄金设计顶层。当然,这一个实验中,这个黄金设计顶层只是一个框架,并没有晚上,我们将在后续的实验中逐步完善这个工程,当我们所有实验结束后,整个工程将是一个复杂且完整的,具有参考和实用价值的设计工程,成为真正意义上的黄金设计顶层。
这里为选择创建工程类型,可选项包括创建空工程(Empty Project)和使用工程模版(Project Template),由于工程模版需要在Altera官方网站下载,而且不一定适合我们,因此这里我们直接选择空工程即可。点击进入下一步。
由于是新建工程,暂无输入文件,所以直接单击,进入图2.8所示对话框。要根据实际使用的FPGA来选择目标器件,这里指定为Cyclone IV系列的EP4CE10F17C8。
在图2. 8右边的过滤器选项区域中,设计者可以通过指定封装、引脚数以及器件
速度等级来加快器件査找的速度。 v
指定完器件后,单击进入图2. 9所示对话框,选择EDA工具。
本章所述实例是利用Quartus II的集成环境进行开发,不使用任何EDA工具,基于Verilog的数字逻辑教程中常用的设置仿真工具为modelsim(altera),由于本实验暂不涉及到用户逻辑的开发,无需使用modelsim仿真,因此这里 不作任何设置和改动。
(7) 单击图2. 9中进入图2. 10所示对话框。从图2. 10中,设计者可以看到工程文件配置信息报告。单击按钮(图中未画出),完成新建工程的建立。
当然,工程建立完成后,也是可以根据设计中的实际情况,通过选择【Assignments】【Settings】来对工程进行重新设置。
2.4.2 建立顶层模块
顶层模块用于将整个工程的各个模块包含在里面,Quartus II编译时将这些模块整合在 一起。顶层文件相当于传统电路设计中的电路板(PCB),用于将各种功能的芯片焊接在上面。
顶层文件的实现方式有两种,第一种是比较传统的使用原理图文件(.bdf),将所有的模块生成原理图符号,类似于一个一个的集成电路芯片,然后使用画线的方式将各个模块对应的端口连接起来,另一种是世界使用Verilog或者VHDL语言进行例化,将每个模块在一个Verilog文件中例化并将相关的信号名为相同的名字以实现连接。这两种方式各有优缺点。原理图方式进行顶层工程设计的优势是模块间关系一看便知,逻辑清晰,但是缺点是不易维护,尤其是在需要例化的模块越来越多的时候,这种方式无论是从实现效率和可移植性上,都有非常大的局限性,因此近些年来,使用的人已经越来越少。HDL文件直接例化的方式,虽然在逻辑关系上看着不如原理图方式清晰,但是却拥有无可匹敌的可移植行和便捷的修改特性,因此近些年来,越来越多的工程师开始选择使用HDL文件来设计工程顶层。这里,我们也强烈推荐大家使用HDL的方式来设计顶层文件,尽量不要使用原理图的方式。
依次点击【File】【New】【Verilog HDL File】来创建一个新的Verilog文件,并点击【File】【Save As】将文件保存为CoreCourse_GHRD.v
对话框,如图2. 13所示。
在图2. 13中接受默认的文件名,然后点击保存即可。至此,完成了顶层模块的建立。在2.6.1小节中将讲述怎样将QSYS生成的模块加人到顶层模块中。
2.5 使用 Qsys创建 Nios II 系统
2.5.1 Qsys简介
Qsys包含在Quartus II软件中,它为建立SOPC设计提供了图形化环境,是早期Quartus II软件中SOPC Builder版本的升级,在保持基本功能不变的前提下,增加了系统建设的灵活性。 SOPC由CPU、存储器接口、标准外设和用户自定义的外设等组件组成。Qsys允许选择和自定义系统模块的各个组件和接口。利用Qsys,用户可以很方便地将处理 器、存储器和其它外设模块连接起来,形成一个完整的系统。Qsys中已经包含了 Nios II处理器以及一些常用的外设IP模块,用户也可以设计自己的外设IP。用户在Qsys中定义Nios II系统的硬件特性,例如使用哪个Nios II内核,系统中包括什么外设。 Qsys不定义软件操作,例如存储器中哪里存储指令或哪里发送stderr字符流,这些 工作在Nios II HDE中完成,见2. 9. 2小节。
Avalon总线和外设的配置是在Qsys的图形用户界面(GUI)中指定的。用户 在GUI界面中指定各种参数和选项,这些参数和选项会存入一个系统qsys文件。qsys文件是一个文本文件,它完整地定义了以下内容:
(1) Avalon总线模块结构与功能参数;
(2) 每个外设结构与功能参数;
(3) 每个外设的主/从角色;
(4) 每个外设提供的端口信号;
(5)每个可被多个主端口访问的从端口的仲裁机制。
从内部来看,Qsys包含两个主要部分:图形用户界面(GUI)和系统生成程序。 图形用户界面提供管理IP模块、配置系统和报告错误等功能。用户通过图形用户界面设计系统时,所有的设置都保存在一个以系统命名的qsys文件中,所以图形用户界面实际上就是qsys文件的专用编辑器。用户通过图形用户界面完成设计之后,单击Generate将启动系统生成程序。系统生成程序完成大量的功能,创建了几乎所有的Qsys输出文件(HDL逻 辑文件、C程序的头文件和库文件、模拟仿真文件等)。
qsys文件是图形用户界面和系统生成程序之间的唯一交互渠道。对大部分用户来说,仅仅了解qsys文件是由图形用户界面产生,并且系统生成程序要读取qsys文件的内容就足够 了。髙级用户可以使用文本编辑器来修改qsys文件编辑自己的设计,而不是使用图形用户界面。qsys文件传递给HDL生成器,用来创建系统模块实际的寄存器传输级(RTL)描述。
当用户使用Qsys创建一个新的系统时,Qsys自动生成一个以系统名 命名的系统qsys文件,所有的设计信息都保存在该qsys文件中。当使用Qsys重新打开一个已有的系统时,qsys文件是Qsys工具读取该系统具体设计信息的唯一来源。系统qsys文件的内容随着用户吐信用户界面对系统的编辑而改变。
当Qsys完成一个系统的搭建并生成了系统之后,会在工程文件夹下生成如下若干文件或文件夹。例如将Qsys系统保存为mycpu.qsys,则工程文件夹下将会生成如下的文件或文件夹。
mycpu.qsys:Qsys系统文件(.qsys)——用于描述系统的硬件结构。
mycpu.sopcinfo:Sopc信息文件(.sopcinfo),Nios II IDE使用.sopcinfo文件来信息来为目标硬件编译软件程序。
mycpu文件夹:mycpu下包含了整个Qsys系统生成的各种详细文件,包括整个系统的例化文件(mycpu_inst.v)以及Qsys中使用到的所有组件的硬件描述语言(HDL)文件(在synthesis文件夹中), QuartusII符号模块文件(.bsf)——该文件中的符号(Symbol)用于在使用原理图设计顶层时添加到Quartus II工程顶层文件,使用Verilog设计顶层的方式不使用。
所有Qsys的菜单命令如表2.1所列。:
在下一小节中,将以一个实例来讲述Qsys的使用,读者将执行下列步骤:
1) 启动 Qsys;‘
2) 指定目标FPGA和时钟设置;
3) 增加Nios II内核,片内存储器和其它外设。
4) 指定基地址和中断请求(IRQ)优先级。
5) 指定更多的Nios II设置。
6) 生成 Qsys 系统。 •
Qsys设计过程不需要按固定的顺序进行,本节所述的设计步骤是常用的,便于读者理解。然而,读者可使用不同的顺序来执行Qsys设计步骤。
表2.1 Qsys菜单命令列表
2.5.2 启动 Qsys
打开Quartus II软件。在Quartus II中选择【Tools】->【Qsys】选项来启动Qsys,建议首先新建一个Quartus II工程,然后再打开Qsys,如图2. 14所示。 .. ,
Qsys启动后,将自动创建好一个名为unsaved.qsys的工程,该项目中仅仅包含了一个时钟管理单元,如下图所示:
图 2. 14 启动 Qsys
这个时候我们点击【File】【Save】即可保存当前项目,这里我们将项目命名为mysystem.qsys
图 2. 15 保存项目对话框
在图2.15中输入项目名称。在本例中项目名为mysystem。
特别注意,项目名称不能与2.4. 2小节中建立的顶层HDL文件名同名,否則在后期Quartus II编译该工程时将会报错。
图 2. 16 Qsys 界面
2.5.3指定系统输入时钟频率
Qsys工具打开后,clk_0是自动添加进来的,该元件是用来对输入的时钟和复位信号进行处理的。我们双击该元件的名称(clk_0),将会在右侧弹出时钟设置对话框,这里我们可以设置输入时钟频率,因为系统默认为50MHz,而我们芯航线FPGA开发板上使用的也是50MHz的晶振,即与系统默认一致,因此,这里我们不需要修改。当读者在使用自己的目标板时,就需要根据自己的目标板实际情况进行设置。需要注意的是,所设置的频率一定要与系统实际运行的时钟频率相匹配。否则一些涉及到精确时序参数的外设(定时器、UART、SPI等等)可能无法正常工作。
2.5.4添加Nios II处理器内核
执行下面的步骤,添加Nios II/s内核到系统:
在图2. 16所示IP Catlog栏,搜索框中输入nios,在搜索结果中选中Nios II Processor,双击或者点击Add按钮打开NiOS II 处理器配置窗口。这里分别对该设置窗口中的一些参数进行介绍。
main:选择NIOS II处理器的内核类型。从main选项卡可以看到,Nios II系列支持两种类型的CPU,并给出了其支持的相关功能特性,详细内容见3. 10节所列。根据应用要求和目标FPGA中的器件约束(逻辑资源)条件,选择适合的CPU核。由于芯航线FPGA学习套件上使用的FPGA器件(EP4CE10)的逻辑资源比较充足(10K),因此本实例选择快速型CPU核Nios II/f,如果用户使用的是逻辑资源有限的器件,如EP4CE6,则使用快速型内核比较紧张,建议选择经济型内核。这也是我们选择EP4CE10这款器件的原因,为了给用户学习和使用NIOS II处理器留出相当的逻辑资源。
Vectors:设置CPU的复位向量(Reset Vevtor)、异常向量(Exception Vector)和快速TLB命中异常向量(Fast TLB Miss Exception Vector)。
Reset Vevtor:复位向量用于设置CPU复位后从何处启动,例如我们在调试系统时,为了方便,常设置CPU的复位向量为SDRAM或SRAM,而当我们的系统开发完成后,则将CPU的复位向量设置于FLASH,例如EPCS存储器。这样系统即可上电后自动从FLASH中复制程序代码到内存中并运行。该选项只有当CPU的存储器系统就绪后方可配置,因此,当我们添加NIOS II CPU时,因为此时CPU的存储器组件并未就绪,因此此项无法配置,只有等我们后续为NIOS II添加好存储器组件后,再回头来进行修改。
Exception Vector:异常向量用于存放CPU处理异常事件的代码,例如中断处理代码。在一个典型的系统中,该向量应该指向一个低延迟的存储器,例如SDRAM、SRAM、或者片上存储器(On Chip RAM)。
Fast TLB Miss Exception Vector:快速TLB命中异常向量主要与MMU协作,管理存储器,本书所讲解的知识赞不涉及到MMU方面的内容,因此此部分内容暂不做介绍。
Caches and Memory Interfaces Tab:本选项卡主要设置CPU的数据和指令缓存部件。
Instruction cache:指令缓存用于缓存NIOS II处理器的各种指令,以提高CPU的运行效率。该缓存的大小从512字节到64K字节用户可自定义设置,,当然也可以不使用指令缓存。当选择不使用指令缓存时,NIOS II处理器的指令总线将会被移除,因此,我们必须要包含一个紧耦合型指令存储器(tightly-coupled instruction memory)。关于此部分的深入应用,需要用户扎实掌握NIOS II处理器的知识后,再来深入研究,刚开始接触时,在芯片资源充足的情况下,使用默认设置即可。
Data cache:数据缓存用于存放数据,
Data cache数据缓存选项用于指定缓存的大小。该缓存的大小从512字节到64K字节用户可自定义设置,当然也可以不使用指令缓存。关于此部分的深入应用,需要用户扎实掌握NIOS II处理器的知识后,再来深入研究,刚开始接触时,在芯片资源充足的情况下,使用默认设置即可。
Arithmetic Instructions:该选项卡用来设置NIOS II处理器实现算术指令的方式,这里我们可以通过选择Divide Hardware来设置NIOS II处理器是否支持硬件除法运算。也可以选择乘法、移位等运算的实现方式。
JTAG Debug选项卡
为了方便调试,为CPU加人JTAG调试模块。JTAG调试模块要占用较多的逻辑单元,如果整个系统已经调试完毕了,可以选用取消勾选Include JTAG Debug,以减少系统占用资源。JTAG调试模块根据功能的不同可设置是否使用硬件断点,使用数据触发,跟踪类型和跟踪存储等
其他选项为用户在实际的应用情况中根据自己的需求合理设置,这里不做过多的介绍。
在本实例中,我们选择使用Nios II/f型内核,不使用硬件除法器,指令缓存默认设置为4K字节,数据缓存默认设置为2K字节。Jtag Debug默认,其他设置不变。点击Finish按钮即可完成NIOS II处理器的添加。
添加完成后,系统自动将该NIOS II处理器命名为nios2_gen2_0,我们可以选中改名字,点击鼠标右键选择rename以对处理器进行重命名,这里我们不做改变,使用默认名。
注意,大家在给Qsys中创建的各个组件重命名是,名字最前面应该使用英文字母。能使用的字符只有英文字母、数字和“_”,不能连续使用“_”符号,在名字的最后也不能使用“_”。
2.5.5添加片内存储器
众所周知,处理器系统至少要有一个存储器用于数据和指令。本章实例设计一个4KB 片内ROM存储器(Onchip_ROM),用于存储程序代码以及程序运行空间;4KB片内RAM存 储器(onchip_RAM)用于变童存储(R/W数据)、Heap、stack等。
执行下列步骤来添加存储器:
(1) 如图,在IP Catalog中,输入onchip来进行过滤,在搜索结果中选择并双击On-Chip Memory (RAM or ROM),弹出片内存储器配置向导对话框,如 图2. 21所示。
(2)在Memory Type选项区域中选中ROM (read-only),即指定为ROM型。FPGA内部其实 并没有专用的ROM硬件资源,实现ROM的思想是对RAM赋初值,并保持该初值,使其为只读的。ROM的内容在对FPGA进行配置时,一起写入FPGA。
(3) 在Total Memory Size文本框中输入4096,即指定4 KB的存储容量。
(4) 不要改变其它任何默认设置。
(5) 单击,在激活元件窗口中出现名称为onchip_memory2_0的片内存储器。
(6) 右击激活元件窗口中〇nchip_memory_0,然后选择Rename将onchip_memory_0重命名为onchip_ROM,如图2. 22所示。
(7)更改了ROM的名称后,我们在此双击onchip_ROM以对其参数进行编辑或查看,在最底部可以看到Memory will be initialized from mysystem_onchip_ROM. hex,即onchip_ROM存储器在上电时将使用mysystem_onchip_ROM. hex文件进行初始化。mysystem_onchip_ROM.hex在Quartus II工程目录下,该文件可以由用户编辑生成,也可以由IDE编译生成,见2. 9. 3小节。在本实例中,将使用onchip_rom来存储用户程序,mysystem_onchip_ROM. hex将由IDE编译生成,文件的内容即用户程序。
使用与添加onchip_RAM相同的方法,添加一个4KB的onchip_RAM。添加步骤中不
同之处在于:
(1) 在第(2)步中,Memory Type选项区中选中RAM(writeable),即指定为RAM型;
(2) 在第(3)步中,Total Memory Size文本框中输人4096,即指定4 KB的存储容量。
(3) 在第(6)步中,重命名为onchip_RAM。
2.5.6 添加 PIO
PIO为Nios II处理器系统接收输人信号以 及输出信号提供了一种简易的方法。本实例设计使用1个PIO来驱动1个LED。
执行下列步骤添加PIO:
(1) 如图,在IP Catalog中,输入PIO来进行过滤,在搜索结果中选择PIO (Parallel I/O)并双击弹出PIO配置向导对话框,如 图2. 23所示。
(2) 在Width选项区的文本框中输人1,将 PIO的宽度改为1位;在Direction选项区选择 Output,即仅输出模式。Output Port Reset Value处修改值为1,即设定PIO复位时为1。这里设置为1主要是为了使系统复位后LED处于熄灭状态。
(3) 单击,在激活元件窗口中出现名称为 pio_0 的 PIO。
(4) 右击激活元件窗口中pio_0,选择Rename将pio_0重命名为pio_led。给出硬件外设的描述名称是一种良好的习惯。这样会方便我们在分配引脚和编写软件程序时对外设的理解。
注意:在Nios II IDE的用户程序中,将使用PIO_LED(NIOS II IDE中不论组件名的大小写,统一使用大写字母,无需用户强制使用大写字母命名)这个名称来访问外设,所以在这里推荐将PIO命名为pio_led当然,用户也可以命名为其他的名称,只是要在IDE的用户程序中,使用相应的名称来访问PIO即可,由于考虑到是第一个实例,为了尽量减少学习者的出错几率,这里还是强烈建议大家直接使用PIO_LED或者pio_led来命名。
关于PIO的更多细节,请参见4. 1节。
2.5.7添加系统ID外设
如果系统包括系统ID外设,则当Qsys生成Nios II系统时,将为该Nios II系统生成一个标识符(ID号)。该标识符会被写入SYSTEM ID寄存器中,供IDE编译器和用户辨别所运行的程序是否与目标系统匹配。在IDE中,如果用户程序不是基于对应的Nios II系统的,那么调试时,Nios II IDE将阻止用户下载程序到Nios II系统,当然,我们也可以在调试时选择忽略系统ID的核对来跳过这个校验。具体操作见后续软件开发部分
在IP Catalog中,输入” system id”来进行过滤,在搜索结果中选择System ID Peripheral并双击弹出System ID配置向导对话框,在这里,我们可以在“32 bit System ID”处手动的输入一个ID作为系统标识符,本实例我们设置0x00000008。
单击,在激活元件窗口中出现名称为sysid_qsys_0的System ID Peripheral。
右击激活元件窗口中sysid_qsys_0,选择Rename将sysid_qsys_0重命名为sysid。
关于系统ID外设的更多细节,请见4. 12节。
2.5.8连接各外设到Avalon MM总线上
通过以上步骤,我们完成了添加实现点亮LED灯所需的所有外设组件,然而,这些组件当前都还是各自独立的,与系统核心NIOS II CPU并没有关联起来。因此我们需要使用Avalon MM总线或Avalon ST总线来将这些组件连接起来,因为本实例中不存在数据流组件,因此不涉及到Avalon ST总线的连接。
本系统中,总共涉及到Avalon MM总线的指令总线、数据总线、时钟网络、复位网络和中断网络。一个完整的系统由至少一个主设备和至少一个从设备构成,本实例中NIOS II CPU为主设备,sysid和PIO_LED为从设备。onchip_ROM和onchip_RAM为存储器设备。我们连接时,首先将存储器设备的slave(s1)同时和NIOS II CPU的数据总线(data master)和指令(instruction master)总线连接,然后将pio_led和sysid的slave(s1)与NIOS II CPU的数据总线(data master)相连,不要将s1与指令总线相连接。连接总线的方法很简单,将两个需要连接到一起的总线交叉处的空心圆圈点击一下,即可实现两个网络的连接。
关于什么时候需要连接指令总线,什么时候不需要,这里给出一个连接技巧:凡是不涉及到存储CPU 指令的外设,如串口,定时器,SPI等非存储器外设,只需要将s1连接到CPU的data master即可。而对于需要存储CPU程序指令的存储器,如EPCS、onchip_ROM、SDRAM等,需要将s1和CPU的data master 和instruction master同时连接。当然,一些明确不会存储指令的存储器,也不需要连接instruction master。连接完成的网络如下图所示:
以上完成了所有组件的数据总线和指令总线的连接,接下来还需要完成时钟网络和复位网络的连接。本实例中只有一个时钟网络,因此将所有组件的时钟网络连接到一起即可,连接时钟网络的系统如下图所示:
接下来我们需要连接全局复位网络,连接复位网络有两种方式,第一种方式和连接时钟网络一样,手动一个一个的去点击交叉点连接。第二种方式就是直接点击菜单栏【System】 【Create Global Reset Network】来连接复位网络,这里推荐初次接触Qsys的用户使用第二种方式,以减少出错的概率。
由于本系统中没有添加能够产生中断请求的组件,因此没有中断网络需要连接。关于中断网络的连接和中断号的分配,我们将在后续章节讲解中断的使用的时候进行讲解。
所有总线连接完成后的系统如下图所示。
2.5.9指定基地址和中断请求优先级
在添加和完成组件间的总线网络连接后,我们就需要为每个外设分配基地址和中断请求优先级,由于本实例中所有外设都不含有中断,所以无需进行中断优先级分配。
Qsys提供Assign Base Addresses和Assign Interrupt Numbers命令,如下图所示,这两个命令可以分别简单的实现分配外设基地址和中断优先级。
对于许多系统,包括本实例设计,Assign Base Addresses能满足要求。当然,用户可以自己调整基地址和中断优先级来满足系统的需求。NIOS II处理器的内核可寻址31位地址范围(2G),用户必须分配0x00000000~0x7fffffff之间的基地址。NIOS II程序使用宏定义的符号常量来访问外设,基地址的改变不会造成程序的修改。
由于Qsys只是搭建系统,并不处理软件操作,因此它不能做出关于最好的IRQ分配的有根据猜测,因此建议用户不采用自动分配的方式,而是自己根据系统结构手动分配中断优先级。
这里,我们要分配系统基地址,可以使用自动分配的方式,直接点击【System】【Assign Base Addresses】即可。
2.5.10设置NIOS II复位和异常地址
双击nios2_gen2_0组件,在打开的选项卡中,点击Vectors切换到向量设置选项卡。本实例,系统上电后,从内部ROM开始运行,所以Reset Vector的Reset Vector memory选择onchip_ROM.s1,offset为0x00000000。异常向量表放在内部RAM里面,所以,Exception Address选择onchip_RAM.s1,Offset地址为0x00000020。
注意:Reset Address和Exception Address的Offset只有在多处理器的系统中才进行设置,且其值必须为0x20的倍数,如果地址设置违反规则,信息窗口会给出错误提示。
2.5.11设置需要引出到Qsys系统顶层的信号
在最终形成的FPGA系统中,Qsys所创建的组件是以一个子模块的形式添加到Quartus II工程中的,而作为子模块,就存在相应的输入输出,在Qsys系统中,当系统组件添加完成后,还需要手动的将系统中各个组件对应的信号导出到顶层,这样才能正常的加入到Quartus II工程中。
那么具体有哪些信号是需要导出到模块顶层的呢?在本例中clk_0模块的clk_in和clk_in_reset信号是需要导出到顶层的,但是这两个信号在系统创建之时就自动存在并导出到顶层了,因此不需要我们手动再去操作。
而onchip_ROM、onchip_RAM、systemID等外设仅与CPU进行交互,没有需要导出到系统顶层与其他模块或引脚连接的信号,因此不用连接。pio_led作为一个输出引脚,最终是通过引脚连接到开发板上的LED灯的控制角,因此需要导出到顶层。每一个模块,如果有需要导出到系统顶层的信号,则有一个名为external_connection的总线名,其属性为Conduit。因此,对于刚接触Qsys系统的用户,只需要认准这种属性的信号,即为需要导出到顶层的信号。
导出这个信号,只需要在该信号的export一栏双击,并输入你希望命名的信号名称即可。例如,本实例中,我们双击Double-click to即可输入信号名,这里我们双击并经信号名修改为pio_led即可。如下图所示:
至此,我们整个系统就搭建完成了,接下来点击【File】->【Save】保存当前系统,然后即可开始生产该系统对应的HDL文件了。
2.5.12 生成NIOS II系统
使用Qsys生成NIOS II系统,执行以下步骤:
1、 点击【Generate】->【Generate HDL】打开Generation对话框。
2、 默认输出路径不变
3、 点击Generate按钮,系统生成开始。
在系统生成过程中,Qsys会执行一系列操作,Qsys会为添加的所有部件生成Verilog HDL源文件,并生成每个硬件部件以及连接部件的片内总线结构、仲裁和中断逻辑。Qsys会为系统生成NIOS II IDE软件开发所需的硬件抽象层(HAL)、C以及汇编头文件。这些头文件定义了存储器映射、中断优先级和每个外设寄存器空间的数据结构。这样的自动生成过程有助于软件设计者处理硬件潜在的变化性。如果硬件改变了,Qsys会自动更新这些头文件。Qsys也会为系统中现有的诶个外设生成定制的C和汇编函数库。如果添加了片内存储器,Qsys还将为片内ROM、RAM生成其初始化所使用的HEX文件(空白文件)。在生成阶段的最后一步,Qsys创建适合于系统部件的总线结构,并把所有部件连接在一起。
生成过程时间随计算机的性能而不同,一般需要几分钟。生成结束后,显示Finished: Create HDL design files for synthesis,点击Close即可。然后关闭Qsys工具。
这时,在Quartus II工程中会弹出以下窗口提示,点击OK即可。此时,我们一个基于NIOS II处理器的系统就搭建完成了。
NIOS II系统生成后将产生下列文件:
Qsys系统文件:mysystem.sopcinfo,它定义了Qsys生成完整系统必须的详细信息,该文件存储NIOS II系统的硬件内容,NIOS II IDE需要使用该文件信息来为目标硬件编译软件程序。详细内容见2.9.1小节。
硬件描述语言(HDL)文件——mysystem.v以及各外设的HDL文件,这些文件是描述NIOS II系统硬件设计文件。Quartus II软件将使用这些HDL文件来编译整个FPGA设计。这些文件位于E:\easysopc_class\01_CoreCourse_GHRD\mysystem\synthesis路径下。
至此,已经完成NIOS II处理器系统的创建。生成系统结束后,要将系统集成到Quartus II硬件工程并使用NIOS II IDE来开发软件,可以先使用NIOS II IDE进行软件开发,也可以先将系统集成到Quartus II。当然,如果是多人合作开发,两者可同时进行。
2.6集成NIOS II系统到Quartus II工程
在2.4.2小节中已经建立好了Quartus II顶层模块,本节的内容是将刚生产的NIOS 系统添加到顶层模块中。
2.6.1添加NIOS II系统模块到Quartus II顶层模块
添加NIOS II系统模块到Quartus II顶层模块,需要先将生成的.qsys文件添加到工程中。
点击【Project】->【Add/Remove Files in Project】
在打开的窗口中点击浏览文件按钮,选择mysystem.qsys文件,然后点击Add添加。最后点击【Apply】【OK】即可。
接着将NIOS II系统例化到工程顶层文件中,这里可以直接打开E:\easysopc_class\01_CoreCourse_GHRD\mysystem目录下的mysystem_inst.v文件,然后复制其中的内容,粘贴到顶层文件CoreCourse_GHRD.v中。
最后我们完成完整顶层文件的其他部分设计。首先编写端口列表,本实例系统比较简单,仅有时钟(clk)、复位(reset_n)两个输入以及一组LED输出。因此编写端口列表如下:
接着我们将NIOS II系统的各个信号连接到整个系统的输入输出管脚上。clk_clk连接clk50M,reset_reset_n连接reset_n,pio_led_export连接到连接如下所示:
最终,整个顶层文件的代码如下所示:
2.6.2选择器件型号
每种型号的FPGA芯片的引脚可能都不相同,因此在进行引脚分配之前,都应该选择相应目标FPGA芯片新号。这一步其实在2.4.1小节中已经完成,这里只是让读者了解,在Quartus II工程创建好后仍然可以选择并修改器件型号。
在Quartus II菜单栏中依次点击【Assignments】->【Device】打开器件选择对话框,如下图所示。在该对话框中,指定所需的目标器件型号,本实例为芯航线FPGA学习套件主板上使用的FPGA芯片EP4CE10F17C8。
2.6.3分配FPGA引脚
本实例中各引脚的命名以及与目标FPGA板卡上对应功能引脚标号如下表所示,注意,此处要根据不同的目标板进行调整。一般板卡商都会提供相应的引脚分配说明表。
分配FPGA引脚的位置,执行下面步骤:
要进行引脚分配,需要先对工程进行分析和综合,当分析和综合完成后,将会自动的分析得到工程中的各个端口信号。点击键盘组合键Ctrl + K,对工程启动分析和综合。
分析和综合完成后,在Quartus II菜单栏中依次点击【Assignments】->【Pin Planner】打开引脚分配对话框,如下图所示。
可以看到,引脚分配窗口中已经自动从我们的工程中提取出了需要分配引脚的信号。
按照下表,在Location栏中输入对应的引脚名称即可。
最终引脚分配结果如下图所示:
其中前四个信号为Jtag接口相关信号,仅在针对JTAG接口有特殊应用时才需要进行引脚分配,一般情况无需分配。
分配完成后,直接关闭引脚分配对话框即可(关闭即自动保存)。
2.7编译系统
通过Quartus II编译器,可以检查设计错误,综合逻辑,并且为模拟、时序分析及器件配置生成输出文件。
2.7.1设置编译选项
在下图中,可以通过选择相应的设置选项进行设置。来决定对当前工程的各种编译选项。本实例采用默认的编译设置,不进行任何修改。若要进行编译选项设置,请参考Altera的Quartus II Handbook。
2.7.2编译硬件系统
在编译过程中,编译器定位并处理所有工程文件,生成与编译相关的消息与报告,创建SOF文件及任何可选配置文件。
选择Processing—>Start Compilation进行全编译,也可以直接点击按钮或者直接按键盘组合键Crtl + L来启动全编译。在编译系统是,状态窗口显示整个编译进程及每个编译阶段所用的时间。编译结果显示在Compilation Report窗口中,整个编译时间为几分钟到几十分钟,具体耗时取决于计算机性能以及编译选项设置。
在编译过程中,如果添加了内部存储器,会使用onchip_ROM.hex文件对onchip_ROM进行初始化。
在编译过程中,可能产生很多警告信息,但这些不会影响设计结果。
2.7.3查看编译报告
编译结束后,在Compilation Report窗口显示编译结果,包括编译报告,综合报告,适配报告,时序分析报告等。由于本设计比较简单,器件适配,静态时序等情况很容易满足要求,所以在此不详细分析这些报告。
2.8下载硬件设计到目标FPGA
成功编译硬件系统后,将产生CoreCourse_GHRD.sof的FPGA配置文件输出。本节简单介绍将 SOF文件下载到目标FPGA器件的步骤9
(1)通过USB Blaster下载电缆连接目标板和主计算机,接通目标板电源。
(2)在Quartus II软件中选择【Tools】->【Programmer】,打开编程器窗口并自动打开配置文件(CoreCourse_GHRD.sof),如下图所示。如果没有自动打开配置文件,则须添加需要编程的配置文件,点击Add File,然后选择output files文件夹下的CoreCourse_GHRD.sof文件,选择open即可。
(3)确保编程器窗口的Hardware Setup栏中硬件已经安装。
(4)确保Program/Configure下的方框选中。
(5)单击Start 按钮,开始使用配置文件对FPGA进行配置,Progress栏显示配置进度
本节只讲述了将配置文件下载到FPGA中,掉电后FPGA中的配置数据将丢失,可以将配置文件写人掉电保持的EPCS器件。在上电时使用EPCS对FPGA进行配置,详细内容见《芯航线FPGA数字系统设计教程+实例解析》中第一部分“十一、芯航线FPGA学习套件配置文件固化教程”内容。
2.9 使用NIOS II IDE建立用户程序
本节中,将启动Nios II集成开发环境来建立和编译一个简单的LED灯闪烁的C语言程序。
针对NIOS II软核,要开发一个能够正常运行在目标板上的程序,需要同时具备用户应用工程(Application Project)和板级支持包工程(BSP Project)。
其中板级支持包工程(BSP Project)是一个与硬件系统紧密联系的工程,其使用我们创建Qsys系统时生成的.sopcinfo文件。BSP工程创建时会根据.sopcinfo文件中定义的NIOS II系统的硬件信息,生成对应的设备驱动(drivers)、HAL库(HAL)以及硬件信息头文件(System.h)。
2.9.1创建一个新的C/C+ +应用工程
启动一个新的C/C++应用工程时,Nios II IDE需要使用Qsys系统文件 (.sopcinfo)。在目标硬件上运行和调试应用工程之前,软件设计者需要先使用FPGA配置文件(.sof)配置FPGA。
IDE可产生下面列出的几个输出,但不是所有的工程都要求这些输出。
> System.h文件——为系统中的硬件信息进行宏定义,帮助软件设计者处理硬件潜在的变化性,软件设计者可以使用这些宏定义而不是具体的硬件信息(如地址值、中断号等)。该文件也可用于査阅系统中的硬件。创建一个新板级支持包(BSP)工程时,1DE自动生成该文件。
>可执行的连接文件(.elf)—是编译C/C+ +应用工程的结果,可直接将它下载到 Nios II处理器。
>存储器初始化文件(.hex)——如果添加的片内存储器,片内存储器可在上电时预定义存储器的内容。IDE可生成片内存储器的初始化文件,该存储器支持初始化的内容。
> Flash编程数据——IDE包括Flash编程器,利用IDE的Flash编程器可以写程序到 Flash存储器。用户也可以使用Flash编程器来写任意二进制数据到Flash存储器。
本章仅讨论直接下载.elf文件到Nios II系统。关于使用IDE中Flash编程器进行编 程的详细内容请参考本书相关章节(待定)。
执行下面的步骤来创建一个新的C/C+ +应用工程:
(1) 在Quartus II软件菜单栏中,依次点击【Tools】->【Nios II Software Build Tools for Eclipse】启动Nios II IDE。
(2)在弹出的Workspace Launcher对话框中,单击按钮,设置工作空间为Quartus II工程的文件夹(E:\easysopc_class\01_CoreCourse_GHRD),如图2.41所示,这样便于管理。然后点击OK进入Nios II IDE编辑界面。
(3)在该界面中选择 File—New—Nios II Application and BSP from Template(图 2. 42),打开新建工程向导,如图2.43所示。
图2. 42打开新建C/C+ +工程向导
(4)单击SOPC Information File name选项区中的.按钮,打开选择文件对话框,选择当前工程目录下的mysystem.sopcinfow文件,(注意,一定要核对当前sopcinfo文件的路径是否正确,软件会默认记录上次打开的sopcinfo文件路径,如果不注意这一点,会经常容易出错)。选择完成后,软件会自动识别当前硬件系统中的CPU名称,如下图所示:
图2.44选择硬件目标文件
(5)选择Project Template 列表框中的 Hello World。并在Project Name 栏中输入hello_led_0,选中Use Dafault Location复选框,单击按钮,完成工程创建。
向导中的Select Project Templates—栏中是已经设计好的软件工程,用户可以选择其中的一个,把它当作模板来创建自己的工程。当然也可以选择Blank Project(空白工程),完全由 用户写所有的代码。本例中选取了 Hello World工程,然后在此基础上进行适当的修改,一般情况下这比空白工程更加容易,也更方便。
图2.45完成设置后的工程向导
创建工程后,在Nios II IDE主界面左侧的C/C++ Projects选项卡中显示两个新的工程:hello_led_0 和 hello_led_0_BSP。hello_led_0 是 C/C+ +应用工程,而 hello_led_0_BSP是描述CoreCourse_GHRD系统硬件细节的系统库。
Nios II IDE中每个工作界面都包括一个或多个窗口,每个窗口都有其特定的功能。在工作界面中包括的主要窗口有编辑器窗口和一个或多个浏览器。编辑器可用于打开并编辑一个工程。浏览器用于对编辑器提供各种支持,可由用户根据需要进行选择。
用户可以同时打开多个编辑器,但在同一时刻只能有一个编辑器处于激活状态。在工作界面上的主菜单和工具条的各种操作只对处于激活状态的编辑器起作用。在编辑区中的各个
标签上是当前被打开的文件名,带有“*”号的标签表示这个编辑器中的内容还没有被保存。
在编译工程前,要养成先对各文件进行保存的好习慣。
未完待续…………………………