图1 带Avalon从端口的自定义外设组成框图
从图中可以看出,一个典型的自定义外设主要由下列功能模块组成:
① 任务逻辑。任务逻辑实现外设的基本功能,是必不可少的组成部分。
② 寄存器文件。寄存器文件部分提供任务逻辑和外界交换信息的桥梁。有了寄存器文件,用户就可以通过Avalon接口采用“基地址+地址偏移量”的方法来访问外设内部的各个寄存器。
③ Avalon接口。Avalon接口为寄存器文件提供了一个标准的Avalon前端。该模块使用Avalon规定的信号来访问寄存器文件,并且支持任务逻辑的传输类型。
1.2 CRC32自定义外设的实现
CRC32校验可以由软件或硬件来实现。现多采用超大规模集成电路芯片以硬件方式实现。例如:
图3 CRC验证硬件平台
特别注意的是,在该硬件平台中,要加入一个时间标记服务定时器high_res_timer(也就是经常说的“时间戳”)。该服务可以帮助设计人员查找出耗时最长的功能函数,定位优化目标,检测某个功能部件的运行情况。在这里,主要是利用该“时间戳”来测量CRC32不同方式的执行时间,为分析各种方式的性能差异奠定基础。
3.2 软件开发
在NiosII IDE开发环境中,分别使用自定义外设、自定义指令和软件的方式来实现CRC32。
① 软件实现方式:数据的读取、处理、保存等全部由软件来实现。
② 用户自定义指令方式:处理过程使用CRC32自定义指令来完成。
③ 用户自定义外设方式:使用DMA通道完成数据的读取、保存,NiosII处理器控制外设完成CRC32的处理。
完成上面的工作后,编译工程,下载到SOPC开发板中。从NiosII控制台中,可以看到如下输出信息,如图4所示。