DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

 

今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过程失败。因此特地记录下来,以防日后忘记。

 

第一步:建立Quartus II工程

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

  1. 器件选择为EP5CSEMA5F31C6N;
  2. 工程路径中不得出现非法字符(空格和中文字符);
  3. 开发工具选择Quartus II 13.1及以上,这里我选择的版本为Quartus II 14.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。

 

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

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

 

第五步:在Qsys中添加SDRAM

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

添加完成后,修改其名字为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。

 

第八步:连线和导出端口

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

其中,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。

 

第九步:设定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中的代码选中并复制,如下图中红线圈起来的内容:

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

 

第十五步:添加锁相环

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

 

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

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

在弹出的窗口中,找到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
[12:0]sdram_addr;

output
[1:0]sdram_ba;

output sdram_cas_n;

output sdram_cke;

output sdram_cs_n;

inout
[15:0]sdram_dq;

output
[1:0]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

 

第十八步:分析和综合;

第二十步:分配引脚

    引脚分配如下表所示:

    

refclk

Input

PIN_AF14

rst_n

Input

PIN_AA14

sdram_addr[12]

Output

PIN_AJ14

sdram_addr[11]

Output

PIN_AH13

sdram_addr[10]

Output

PIN_AG12

sdram_addr[9]

Output

PIN_AG13

sdram_addr[8]

Output

PIN_AH15

sdram_addr[7]

Output

PIN_AF15

sdram_addr[6]

Output

PIN_AD14

sdram_addr[5]

Output

PIN_AC14

sdram_addr[4]

Output

PIN_AB15

sdram_addr[3]

Output

PIN_AE14

sdram_addr[2]

Output

PIN_AG15

sdram_addr[1]

Output

PIN_AH14

sdram_addr[0]

Output

PIN_AK14

sdram_ba[1]

Output

PIN_AJ12

sdram_ba[0]

Output

PIN_AF13

sdram_cas_n

Output

PIN_AF11

sdram_cke

Output

PIN_AK13

sdram_clk

Output

PIN_AH12

sdram_cs_n

Output

PIN_AG11

sdram_dq[15]

Bidir

PIN_AJ5

sdram_dq[14]

Bidir

PIN_AJ6

sdram_dq[13]

Bidir

PIN_AH7

sdram_dq[12]

Bidir

PIN_AH8

sdram_dq[11]

Bidir

PIN_AH9

sdram_dq[10]

Bidir

PIN_AJ9

sdram_dq[9]

Bidir

PIN_AJ10

sdram_dq[8]

Bidir

PIN_AH10

sdram_dq[7]

Bidir

PIN_AJ11

sdram_dq[6]

Bidir

PIN_AK11

sdram_dq[5]

Bidir

PIN_AG10

sdram_dq[4]

Bidir

PIN_AK9

sdram_dq[3]

Bidir

PIN_AK8

sdram_dq[2]

Bidir

PIN_AK7

sdram_dq[1]

Bidir

PIN_AJ7

sdram_dq[0]

Bidir

PIN_AK6

sdram_dqm[1]

Output

PIN_AK12

sdram_dqm[0]

Output

PIN_AB13

sdram_ras_n

Output

PIN_AE13

sdram_we_n

Output

PIN_AA13

 

第二十一步:全编译

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

 

第二十二步:配置

    将生成的SOF文件配置到DE1-SOC开发板中。

 

第二十三步:打开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。

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

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

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

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

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

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

若1处和2处无内容,则点击3处的Refresh Connections,直到1和2中出现我们的Cable和Device为止。选中4处的两个选项。然后点击5处的apply,最后点击6处的Run,则系统将启动软件烧写过程,并在烧写完成后启动FPGA中的Nios II处理器。此时,我们在Eclipse的Nios II Console窗口中便能看到Nios II处理器通过串口发送到PC上的内容,如下图所示:

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

关于这个模版例程中相关代码的解释,我也是跟着特权的大神的博客才看懂的。这里,也再次向大众偶像特权同学致敬。具体软件代码的分析,大家可以看特权博客中的内容,当然,相信很多做软件大神也能分析的更加透彻。

    参考内容:http://www.eefocus.com/ilove314/blog/12-08/284486_7e6a4.html

 

小梅哥

2015年4月21日于北京至芯科技

DE1-SOC开发板上搭建NIOS II处理器运行UCOS II的更多相关文章

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

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  2. FS210开发板上Qt4.7.0移植过程

    作者:冯老师,华清远见嵌入式学院讲师. 1. 搭建Qt开发环境平台 1.开发环境:ubuntu 12.04 2.交叉编译链:arm-cortex_a8-linux-gnueabi 3.开发板:FS21 ...

  3. 交叉编译环境以及开发板上-/bin/sh: ./hello: not found 转载自 http://blankboy.72pines.com

    交叉编译环境以及开发板上-/bin/sh: ./hello: not found 目标板是S3C2440.至于交叉编译环境的搭建就不多说了,网上很多教程. 搭建好了交叉编译环境后,第一件事就是传说中的 ...

  4. 使用Xilinx SDSoc在Xilinx zcu102开发板上编程HelloWorld

    关于Xilinx SDSoc的介绍我就不再复述了,我理解的也不一定准确,可以阅读官方文档了解SDSoc,你可以把它理解为一个集成开发环境 (IDE),通过SDSoc我们能够简单快速的对Xilinx的开 ...

  5. 在秉火STM32F429挑战者开发板上移植Huawei LiteOS指南

    昨天在B站上突然看到了一个短视频,是在正点原子的战舰V3开发板上移植华为的Huawei LiteOS操作系统,就是这个视频:看完鸿蒙OS发布会,试用华为的物联网操作系统Lite OS(B站),于是呢, ...

  6. python调用c++/c 共享库,开发板上编译的一些坑!

    1.对于python,ctypes只能load动态库,但现在我的对象是一个静态库,而且我没有源代码,静态库在编译过程中没有加--fPIC参数,所以我也没办法将其编译为动态库,有没有什么方法在pytho ...

  7. easycwmp在开发板上的配置

    原创作品,转载请注明出处 copyright:weishusheng   2015.3.18 email:642613208@qq.com 平台: Linux version 2.6.32-279.e ...

  8. 开发板上使用core文件调试

    转载:http://www.nginx.cn/1521.html 如果开发板的操作系统也是linux,core调试方法依然适用.如果开发板上不支持gdb,可将开发板的环境(依赖库).可执行文件和cor ...

  9. [转载]在iTOP-4412开发板上调试helloworld应用

    本文转自迅为论坛:http://www.topeetboard.com 1.安装ADB驱动 在开发板上调试 Android 应用,首先要安装 ADB 驱动. 通过“SDK Manager.exe”来安 ...

随机推荐

  1. thinkphp扩展 根据前端批量建立字段

    /*批量添加字段辅助*/ function add_colum($tabel){ foreach ($_POST as $key=>$value){ $array[] = "add & ...

  2. ApplicationContext.xml文件详解

    想必用过Spring的程序员们都有这样的感觉,Spring把逻辑层封装的太完美了(个人感觉View层封装的不是很好).以至于有的初学者都不知道Spring配置文件的意思,就拿来用了.所以今天我给大家详 ...

  3. Windows网络共享权限设置

    文件共享权限有两种权限设置,只要理解这两种权限设置就可以在域控灵活运用. 第一种是网络共享权限 共享权限是控制用户通过网络访问共享文件夹的手段,共享权限仅当用户通过网络访问时才有效,本地用户不受此权限 ...

  4. InitializingBean afterPropertiesSet

    package org.test.InitializingBean; import org.springframework.context.support.ClassPathXmlApplicatio ...

  5. MQ集群测试环境搭建(多节点负载均衡,共享一个kahaDB文件(nas方式))

    1. os ubuntu12.04 基础环境准备 干掉不好用的vim重新装 sudo apt-get remove vim-common sudo apt-get install vim 如果需要使用 ...

  6. getch()函数

    这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性! 中文名 无 外文名 getch 头文件 co ...

  7. Snapchat面经(师兄的)

    给一个LinkedList环,给其中任一个节点的reference,求删去LinkedList中所有value=k的点 我的想法:假设给定的点事ListNode oneNode, 设置ListNode ...

  8. SQL null值 查询null

    select * from emp;

  9. Maven2的配置文件settings.xml(转)

    当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使用settings.xml中的settings元素来确定这些配置.这包含了本地仓库位置 ...

  10. @Responsebody与@RequestBody

    前台发送请求后台用什么接收-->@RequsetMapping 何时使用@ResponseBody-->一般在异步获取数据时使用,后台传的数据切成ison传给前台 @Responsebod ...