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日于北京至芯科技

  • 相关阅读:
    hdu 1455 N个短木棒 拼成长度相等的几根长木棒 (DFS)
    hdu 1181 以b开头m结尾的咒语 (DFS)
    hdu 1258 从n个数中找和为t的组合 (DFS)
    hdu 4707 仓鼠 记录深度 (BFS)
    LightOJ 1140 How Many Zeroes? (数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3652 B-number (数位DP)
    HDU 5900 QSC and Master (区间DP)
    HDU 5901 Count primes (模板题)
    CodeForces 712C Memory and De-Evolution (贪心+暴力)
  • 原文地址:https://www.cnblogs.com/xiaomeige/p/4449408.html
Copyright © 2011-2022 走看看