【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

时间:2021-06-19 20:04:14

SOPC开发流程之NIOS II 处理器运行 UC/OS II

这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程。

第一步:建立 Quartus II 工程

建立 Quartus II 工程时需要注意以下几点

1、 器件选择为 EP4CE10F17C8N;

2、 工程路径中不得出现非法字符(空格和中文字符);

3、 开发工具选择 Quartus II 11.0及以上,这里我选择的版本为 Quartus II 15.1。

4、 由于我们最终的软件工程也是建立在 Quartus II 工程目录下的,而软件工程有一个最让人崩溃的地方就是,软件工程在建立时,很多包含文件是以据对路径存在的,如果你更改了工程路径,那么当你再次编译工程时,就会报错。所以这里我在建立工程时,直接在 E 盘根目录下建立了一个 mysystem 的文件夹,并将工程建立在此文件夹中。这样可以避免路径太深,以后切换电脑时,只需要将工程直接拷贝到新的电脑的 E 盘下即可。只要 QII 软件安装位置相同,再次编译软件工程就不会报错。

第二步:打开 Qsys 工具

在 Quartus II 软件中,依次点击 tools/Qsys,以打开 Qsys 工具。

第三步:在 Qsys 系统中添加 NIOS II 处理器

在左侧的 IP Catalog 的搜索框中,输入 nios,在搜索结果中,选择并添加 NIOS II(Classic) Processor 到右侧的 System Contents 中来。添加时,选择 NIOS II/f 型 CPU。添加完成后,在

System Contents 中修改其名字为 mycpu。

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

添加完成后,会报如下错误

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

这个是因为目前只添加了CPU,还没有添加对应的存储器,因此会报错。这里不用理会,在后面的步骤中,只要按照操作来,这些错误最好都会消失的。后续操作中如果遇上其他错误也不要惊慌,最后只要系统搭建完成,错误都是会消失的。

第四步:在 Qsys 中添加 UCOS 系统所需定时器

在左侧的 IP Catalog 的搜索框中,输入 timer,在搜索结果中,选择并添加 Interval timer 到右侧的 System Contents 中来。添加时,将 timeout period 设定为 10ms。添加完成后,修改其名字为 ucosii_timer。

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

第五步:在 Qsys 中添加 SDRAM

在左侧的 IP Catalog 的搜索框中,输入 sdram,在搜索结果中,选中并双击 SDRAM Control,在打开的参数配置选项卡中,按照如下图所示的配置进行设置:

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

添加完成后,修改其名字为 sdram。

第六步:在 Qsys 系统中添加 JTAG_UART

在左侧的 IP Catalog 的搜索框中,输入 uart,在搜索结果中,选择并添加 JTAG UART 到右侧的 System Contents 中来。添加时,所有参数默认即可。添加完成后,修改其名字为 JTAG_ UART_0。

第七步:在 Qsys 系统中添加 sysid

在左侧的 IP Catalog的搜索框中,输入 sys,在搜索结果中,选择并添加 System ID Peripheral 到右侧的 System Contents 中来。添加时,设定 32bit system id 为自定义值,我这里设定为0x00000002。添加完成后,修改其名字为 sysid0。

第八步:连线和导出端口

自此,所有的外设添加就已经完成了,接下来,需要将每个模块的端口连接到对应的总线上,这里不一一介绍,详情请参看下图:

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

其中,clk_100M 模块的 clk_in 和 clk_reset,以及 sdram 模块的 wire 需要 export。 将 ucosii_timer 和 jtag_uart_0 的 irq 连接到 mycpu 的 d_irq 上,在右侧的 IRQ 一栏中, ucosii_timer 的中断号设置为 0,jtag_uart_0 的中断号设置为 1。 注意,在Quartus II13.0及以前的版本中,所有部件第二列name栏中并不会有d_irq或irq这样一个信号,这个无需在意,只是没显示而已。只需要直接点击右侧的IRQ一栏中的空心圈并输入序号即可完成中断的分配,如下图所示:

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

第九步:设定 sdram 基地址

在 Base 一栏中,将 sdram 模块的起始地址设置为 0,然后点击地址前面很小的那个锁的符号,使其变为锁定状态。

第十步:自动分配所有模块地址

在 Qsys 系统中,依次点击菜单栏中的 sysytem/Assign Base Address,系统即可自动为我们分配各个模块的基地址。由于 sdram 的基地址本身处于锁定状态,所以在此过程中,可能其他模块的基地址会因为自动修改而发生变化,但是 sdram 的基地址将保持不变。

第十一步:设定 CPU 的复位向量地址和异常向量地址

双击 mycpu 模块,在打开的参数设置中,将 Reset Vector 和 Exception Vector 都选择为 sdram.s1。

以上,我们就完成了完整 Qsys 系统的搭建,接下来,我们就可以生成 Qsys 系统的 RTL 代码了。

第十二步:保存设计

点击 file/save,将我们的系统保存,我这里命名为“cpu”。

第十三步:生成 Qsys 系统的 HDL 代码

在 Qsys 系统中,依次点击 Generate/Generate HDL,在弹出的窗口中,点击 Generate 来完成 HDL 代码的生成。此过程根据电脑配置的不同,大约需要 3 到 5 分钟。

第十四步:在 Quartus II 系统中添加并例化 QSYS 系统

在 Qsys 系统中,依次点击 Generate/HDL Example,在打开的界面中,将 HDL Example 中的代码选中并复制,如下图中红线圈起来的内容:

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

回到 Quartus II 工程中,新建一个 Verilog HDL 文件,将刚刚复制的内容粘贴进去,将文件保存,命名为 mysystem。

第十五步:添加锁相环

在 Quartus II 软件中,依次点击 tools/IP Catalog,在右侧弹出的窗口中,在搜索栏输入 pll,然后双击打开搜索结果中的 Altera PLL,在打开的窗口中,选择 Verilog 格式,并保存名为 sys_pll。然后点击 OK。等待大于 10 秒钟左右,会弹出 PLL 的配置窗口,在配置窗口中,按下图所示的内容进行配置:

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

第十六步:添加 Qsys 系统到 Quartus II 工程中

第十四步中,只是完成了 Qsys 系统的例化,实际并没有将 Qsys 系统添加到 Quartus II 工程中来。这里,我们双击 Quartus II 软件中 Project Navigator 窗口中 Files 选项卡中的 Files

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

在弹出的窗口中,找到 E:\mysystem\cpu\synthesis 路径下的 cpu.qip 文件,加入到工程中。

第十七步:完善 mysystem.v 模块

将 mysystem.v 中的内容完善如下:

module mysystem(
refclk,
rst_n,
sdram_addr,
sdram_ba,
sdram_cas_n,
sdram_cke,
sdram_cs_n,
sdram_dq,
sdram_dqm,
sdram_ras_n,
sdram_we_n,
sdram_clk
);
input refclk;
input rst_n;
output [:]sdram_addr;
output [:]sdram_ba;
output sdram_cas_n;
output sdram_cke;
output sdram_cs_n;
inout [:]sdram_dq;
output [:]sdram_dqm;
output sdram_ras_n;
output sdram_we_n;
output sdram_clk; wire cpu_clk;
wire sdram_clk;
wire cpu_reset_n;
wire pll_locked; assign cpu_reset_n = pll_locked; cpu u0 (
.clk_clk (cpu_clk), // clk.clk
.reset_reset_n (cpu_reset_n), // reset.reset_n
.sdram_addr (sdram_addr), // sdram.addr
.sdram_ba (sdram_ba), // .ba
.sdram_cas_n (sdram_cas_n), // .cas_n
.sdram_cke (sdram_cke), // .cke
.sdram_cs_n (sdram_cs_n), // .cs_n
.sdram_dq (sdram_dq), // .dq
.sdram_dqm (sdram_dqm), // .dqm
.sdram_ras_n (sdram_ras_n), // .ras_n
.sdram_we_n (sdram_we_n) // .we_n
; sys_pll_0002 sys_pll_inst (
.refclk (refclk), // refclk.clk
.rst (~rst_n), // reset.reset
.outclk_0 (cpu_clk), // outclk0.clk
.outclk_1 (sdram_clk), // outclk1.clk
.locked (pll_locked) // locked.export
); endmodule

第十八步:分析和综合;

第十九步:分配引脚

引脚分配如下表所示:

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

第二十步:全编译

此过程大约需要 6 到 10 分钟左右;

第二十一步:配置固件到FPGA芯片中

将生成的 SOF 文件配置到芯航线开发板中。

第二十二步:打开 NIOS II EDS 软件

在 Quartus II 软件中,依次点击 tools/NIOS II software Buil tools for Eclipse,在打开的

Workspace Launcher 中,设定 Workspace 为 E:\mysystem,然后点击 OK。

第二十三步:建立 UC/OS II 模版工程

在打开的开发环境中,点击 File/New/Nios II Application and BSP from Template。

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

在打开的窗口中,按下图所示的内容进行选择:

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

然后系统便能为我们自动生成完整的系统,生成后的界面如下所示:

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

第二十四步:编译软件工程

此时,我们按下键盘上的组合键“ctrl + B”,就能够对软件工程全编译。

第二十五步:下载并运行

编译完成后,点击 Run/Run Configurations,在打开的窗口中,

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

双击 Nios II Hardware,在弹出的界面中,选择 Project Name 为 myucosii(注:图中我的工程名为 myucos,只是工程名字不同而已,无其他影响)。

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

选择完成后,切换到 Target_Connection 选项卡中,如下图:

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

若 1 处和 2 处无内容,则点击 3 处的 Refresh Connections,直到 1 和 2 中出现我们的 Cable 和 Device 为止。选中 4 处的两个选项。然后点击 5 处的 apply,最后点击 6 处的 Run,则系统将启动软件烧写过程,并在烧写完成后启动 FPGA 中的 Nios II 处理器。

此时,我们在Eclipse 的 Nios II Console 窗口中便能看到 Nios II 处理器通过串口发送到 PC 上的内容,如下图所示:

【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

自此,整个在芯航线FPGA上搭建 NIOS II 处理器并运行 UC/OS-II 系统告一段落。

本文主要通过一个最简单的例子介绍了常见的SOPC简单开发流程,后续详细的SOPC开发教程敬请关注小梅哥后续视频教程。