nios ii step by step - pudn. nios nios ii ii step step by by step step nios nios ii ii step step by

Download Nios II Step By Step - pudn. Nios Nios II II Step Step By By Step Step NIOS NIOS II II Step Step By

Post on 24-Feb-2020

11 views

Category:

Documents

2 download

Embed Size (px)

TRANSCRIPT

  • NiosNiosNios

    Nios

    IIIIII

    II

    StepStepStep

    Step

    ByByBy

    By

    StepStepStep

    Step

    NIOSNIOSNIOS

    NIOS

    IIIIII

    II

    StepStepStep

    Step

    ByByBy

    By

    Step(1)---NIOSStep(1)---NIOSStep(1)---NIOS

    Step(1)---NIOS

    IIIIII

    II

    自定义指令

    可编程软核处理器最大的特点是灵活,灵活到我们可以方便的增加指令,这在其他SOC系 统中做不到的,增加用户指令可以把我们系统中用软件处理时耗 费时间多的关键算法用硬逻辑

    电路来实现,大大提高系统的效率,更突出的一点是:我们通过下面的逐步操作会认识到,这

    是一个听起来高深,其实比较容易实现的 功能(我们站在EDA工具这个巨人肩上,风光无限 啊:),通过这一文档的介绍可以增强我们掌握 NIOS II所有的技术手段的信心,这也是我把 NIOS II 用户指令放在最前面的用意。

    用户指令就是我们让NIOS II软核完成的一个功能,这个功能由电路模块来实现,这个电路 模块是用HDL语言描述的。它被连接到NIOS II软核的算术逻辑部件上,下面就是示意图:

    用户指令分多种,有组合逻辑指令、多周期指令、扩展指令等等,学明白一个,也就举一反三

    了, Altera提供了用户模块HDL的模板,通过裁减就 可以适应多种指令类型了。下面就是这个 模版的Verilog形式,很简单吧,我想看到这里很多人会说:oh,that's easy。模块里面的内容不 要 我说了,也说不尽,是你智慧表演的舞台了,八仙过海,各显神通的机会来了:)

    //Verilog Custom Instruction Template module __module_name(

  • clk, // CPU's master-input clk reset, // CPU's master asynchronous reset clk_en, // Clock-qualif ier start, // True when this instr. issues done, // True when instr. completes dataa, // operand A datab, // operand B n, // N-field selector a, // operand A selector b, // operand b selector c, // result destination selector readra, // register file index readrb, // register file index writerc,// register file index result // result ); input clk; input reset; input clk_en; input start; input readra; input readrb; input writerc; input [7:0] n; input [4:0] a; input [4:0] b; input [4:0] c; input [31:0]dataa; input [31:0]datab; output[31:0]result; output done;

    // Port Declaration

    // Wire Declaration // Integer Declaration // ConcurrentAssignment //Always Construct endmodule

    下面两张图和表可以帮助我们更深入的理解和总结:

  • 万事开头难,那我们就挑个软的捏,来做一条组合逻辑指令吧,下面就是模块示意图:

  • 这个模块只有两个输入,A,B,都是32BIT的,输出也是32BIT的。你可以让他们是C=A+B, 也可以C=A+1。我们给出一个HDL范例: //Verilog Custom Instruction Template module test_custom_instruction( dataa, // operand A datab, // operand B result // result ); input [31:0]dataa; input [31:0]datab; output[31:0]result;

    assign result=dataa+1;

    endmodule

    上面的模块实现A+1,很简单。

    其他指令类型也就是增加了PORT口,里面处理更复杂一点。下面是多周期指令的块图:

    有了以上概念,和HDL 模块的准备,我们可以进入实际操作了,打开 QUARTUS II,建一个工

  • 程,再进入 SOPCBUILDER,建好相关的 SOPC 环境,下图是 FreeDev2.1 EP1C12+100M开发 板的一个配置

    双击 CPU项就进入 CPU配置,设置用户指令我们要选最后一个表单(Custom Instructions TAB)。 见下图

  • 在该表单中我们点击 IMPORT,来加入我们的 HDL 模块,见下图:

  • 在IMPORT操作窗口上,点击ADD增加用户指令模块,点击read port list from files显示模块PORT。 最后点击Add to System完成用户指令的添加。

    在SOPC BUILDER 中生成系统,并在QUARTUS II中重新编译整个工程,并program编程开发板 器件,这样硬件部分就完成了。下面我们就可以在NIOS II IDE中来编程使用我们的指令了。

    由于我们在SOPC BUILDER 中增加了用户指令,SOPC BUILDER 生成的PTF文件中包含 了相关信息,我们在 NIOS II IDE 中增加新软件工程项目编译时,系统根据SOPC BUILDER生 成的PTF文件生成了硬件系统描述的system.h。在该头 文件中系统已经为用户指令生成了相关 的宏,我们以上定制的用户指令在system.h中相关部分如下:

    /* * custom instruction macros * */

    #define ALT_CI_TEST_CUSTOM_INSTRUCTION_N 0x00000000

    #define ALT_CI_TEST_CUSTOM_INSTRUCTION(A,B) __builtin_custom_inii(ALT_CI_TEST_CUSTOM_INSTRUCTION_N,(A),(B))

    注意__builtin_custom_inii是Altera 移植GCC后的built_in Function。

    最后,我们创建一个Hello World工程,稍微改动一下:

    #include #include

    int main()

    { int a,b,c;

    a=1;

    c=ALT_CI_TEST_CUSTOM_INSTRUCTION(a,b); printf("c=%d\n",c);

    return 0; }

    主要把system.h头文件包含进来。

    好了,马上可以进行调试了。

    NIOSNIOSNIOS

    NIOS

    IIIIII

    II

    StepStepStep

    Step

    ByByBy

    By

    StepStepStep

    Step

    2--2--2--

    2--

    理解HALHALHAL

    HAL

    前一讲我们实现了一个简单的用户指令,在本系列文档中我们假定用户已经正确安装Nios II IDE开发环境并能创建和调试程序,对Nios II IDE开发环境不再介绍。

    目前Nios II 的开发都是在HAL(hardwareabstraction layer)的基础上进行的。在进一步介绍其

  • 他内容之前有必要介绍HAL。 HAL系统库是一个轻量级的运行环境,提供了简单的和硬件通讯的设备驱动程序。HAL API集 成了ANSI C标准库,这些API允许你用标准C函数(例如:printf,fopen,fwrite等等)去存取设备。 HAL类似于ARM系统中的BSP(board-support package),提供了一个一致的设备存取界面。由 于SOPC Builder和 NIOS II IDE紧密的集成,在SOPC Builder生成硬件系统以后,NIOS II IDE 能 够自动生成对应的客户HAL系统库。更新硬 件系统设置以后,NIOS II IDE能自动更新HAL的 驱动设置。在创建软件项目的时候,NIOS II IDE自动生成并管理HAL系统库。

    HAL体系结构:

    HAL系统库提供了下列系统服务: 1、 集成newlib。一个ANSI C标准库。(许多人都要求提供NIOS II中C库的说明,具体

  • 可以参考 http://sources.redhat.com/newlib)

    2、 设备驱动。这些设备驱动程序提供了常用设备的驱动。同时也是我们学习设备驱动 程序开发的范例。

    3、 HAL API。提供了一个一致的设备存取、中断处理以及ALARM等工具。 4、 系统初始化。在main执行前完成相关的初始化任务。注意这里包含了BOOTLOAD 以及程序重定位等工作。所以NIOS II开发中没有象ARM系统开发中涉及BOOTLOAD等问题。 5、 设备初始化。在main前分配设备空间,并初始化设备。

    在NIOS II软件系统开发中,程序员划分为应用程序开发和设备驱动开发,从而为提高开发效率 给出一条途径(实际开发中并不一定如此划分,实际我们都身兼数职披挂上阵J)。

    1、 应用开发人员使用HAL API去完成开发工作 2、 设备驱动开发人员完成设备驱动的开发并融合到HAL体系中,供应用开发人员使用

    设备类型:

    在以后的文档中我们会给出 NIOS II HAL设备被组织加入到双向设备链表中(在我的 BLOG:http://www.pld.com.cn/blog/blog?name=jhljs中有设备组织的分析文挡)。并不是所有的设 备被添加到同一个设备链表中而是分成了几个类型:

    1、 字符模式设备 2、 时间模式设备 3、 文件系统设备 4、 以太网设备 5、 DMA设备 6、 FLASH设备 不同的设备有大体一致的模式,但内提供的设备驱动函数不同类型不一致。

    在NIOS II 安装完毕以后,NIOS II IDE 中提供了上述类型的外设和相应的驱动程序。我们在 以后的文档中会分析这些设备驱动程序,从而为开发自己的设备驱动提供有力的支持和坚实的

    基础。

    OK,HAL就介绍这些了。点到为止,革命尚未成功,同志仍需努力。

    http://sources.redhat.com/newlib http://www.pld.com.cn/blog/blog?name=jhljs

  • NiosNiosNios

    Nios

    IIIIII

    II

    StepStepStep

    Step

    ByByBy

    By

    StepStepStep

    Step

    3--Nios3--Nios3--Nios

    3--Nios

    IIIIII

    II

    中的DMADMADMA

    DMA

    有了上一讲HAL的基础,我们来关注一下DMA在NIOS 中的实现和编程。DMA是个老问题 了,从8086/8088一直到现在,完成不需要CPU参与的数据搬家,源和目标可以是内存也可以是 设备,在NIOS II中通过基于HAL编程完成。

    下图是三中基本的DMA传输:

    在NIOS II的HAL DMA设备模式中,DMA传输被分为两类:transmit 和 receive。NIOS提供两 种设备驱动实现 transmit channels和receive channels,transmit channels把缓冲区数据发送到目标 设备, receive channels读取设备数据存放到缓冲区。

    为了适应大家不同的开发环境,下面我们完成一个相对简单的DMA操作,复制SDRAM内存

Recommended

View more >