zoukankan      html  css  js  c++  java
  • DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

    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:mysystemcpusynthesis路径下的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日于北京至芯科技

  • 相关阅读:
    算法导论 第二部分——排序和顺序统计量
    算法导论——第一部分——基础知识
    liunx中的进程与线程
    vector中pair的排序方法
    sql 入门经典(第五版) Ryan Stephens 学习笔记 第五部分: 性能调整
    sql 入门经典(第五版) Ryan Stephens 学习笔记  第四部分:建立复杂的数据库查询/
    Object C学习笔记1-基本数据类型说明
    Objective-C(生命周期)
    从 React 的组件更新谈 Immutable 的应用
    React性能优化总结(转)
  • 原文地址:https://www.cnblogs.com/xiaomeige/p/4449408.html
Copyright © 2011-2022 走看看