1、本节讲述开发一个定制的 SOPC Builder 元件的设计流程,从创建定制外设、集成外设到 系统中,最后将其下载到硬件。讲述定制外设的开发流程之后,以Altera 公司提供的一个设计实例作为练习。该实例展示了开发一个只具有Avalon 从接口的外设。用户使用 Altera 提供的 HDL 设计,将其打包到成一个SOPC Builder 元件,然后在系统中例化它。然后将工程编译下载到开发板上。最后介绍怎样共享用户定制外设,这样用户设计的外设可以为其它的系统和设计者使用。 SOPC Builder 提供元件编辑器使用户可以创建和编辑自己的 SOPC Builder 元件。 典型地,一个元件有下面
2、的部分构成: 硬件文件:描述元件硬件的 HDL 模块。 软件文件:定义元件寄存器映射的 C 语言的头文件,元件的驱动程序。 元件描述文件(class.ptf):定义元件的结构,提供给 SOPC Builder 将该元件集成到系统中必要的信息。元件编辑器根据用户提供的软件和硬件文件以及用户在元件编辑器的图形用户界面指定的参数自动产生这个文件。 在创建完描述元件的硬件和软件文件之后, 用户使用元件编辑器将这些文件打包成一个 SOPC Builder 元件。如果用户更新了硬件或软件文件,用户还可以使用元件编辑器对这个元件进行再次的编辑。 8.2.1 元件开发流程 本节介绍元件开发流程,包括硬件和软件
3、两方面,这里介绍只有一个Avalon 从接口的元件设计流程, 而其设计流程的步骤可以很容易地推广到具有主端口的元件或者多个主端口和从端口的元件。 从外设的典型的设计顺序包括如下的步骤: 1. 指定硬件功能。 2. 如果微处理器要控制该元件,指定访问和控制该硬件的应用程序接口 (API) 。 3. 根据硬件和软件的要求,定义一个 Avalon 接口,该接口要提供: a. 正确的控制机制。 b. 足够的吞吐量性能。 4. 采用 Verilog 或者 VHDL 编写硬件设计。. 5. 单独测试元件的硬件,验证操作的正确性。 6. 编写 C 头文件,为软件定义硬件层次的寄存器映射。 7. 使用元件编辑
4、器将硬件和软件文件打包成一个元件。 8. 例化元件为一个 SOPC Builder 系统的模块。 9. 使用 Nios II 处理器来测试对元件的寄存器级的访问,用户可以执行硬件的测试,或者是进行 HDL 仿真。 10.如果微处理器要控制该元件,编写元件的驱动程序。 11. 根据元件的在系统的行为,反复改进元件的设计: a. 硬件的改进和调整。 b. 软件的改进和调整。 c. 使用元件编辑器更新元件。 12.编译完整的含有一个或多个该元件的 SOPC Builder 系统。 13. 执行系统级的验证,如果必要进行进一步的反复改进。 14. 完成元件的设计,发布该元件,其他设计者可以重用该元件。
5、 主外设的设计的过程与之类似,只是软件开发方面有所差异。 8.2.2 硬件设计 同任何的逻辑设计过程一样,SOPC Builder 元件的硬件开发在需求分析阶段之后开始。当用户根据需求说明编写和验证 HDL 逻辑时,其过程是一个迭代的过程。 典型元件的结构包括下面的功能模块: 任务逻辑(Task Logic) 任务逻辑实现元件基本的功能。任务逻辑是和设计相关的。 寄存器文件(Register File) 寄存器文件为任务逻辑内部的信号同外部通信提供了一条通路,反之亦然。寄存器文件映射内部的节点为可寻址的地址偏移量,Avalon 接口可对其进行读写访问。 Avalon 接口 Avalon 接口提
6、供标准的寄存器文件的 Avalon 前端。接口可以使用任意的 Avalon 信号类型,以访问寄存器文件和支持任务逻辑所需要的传输。下面的因素影响 Avalon 接口: 要传输的数据宽度是多少? 数据传输需要的吞吐量的要求是多少? 该接口主要是为了控制还是数据? 即传输是零星的,还是连续的突发传输? 硬件相对系统中其它的元件是快速还是低速元件? 图 8-16 为一个具有一个 Avalon 从端口的典型元件的原理图。8.2.3 软件设计 如果用户想要微处理器来控制用户的元件,用户则必须提供软件文件,软件文件定义了该元件的软件视图。在最小化的软件设计中,用户必须定义每个从端口的寄存器映射,以便处理器
7、可以访问。元件编辑器允许用户将 C 语言的头文件和元件打包在一起以定义硬件的软 件视图。典型情况下,头文件声明读和写元件寄存器的宏函数,寄存器的地址相对于分配给元件的符号化的基地址。 下面的例子是从 Altera 提供的用于Nios II 处理器的 UART 元件的寄存器映射摘录的一部分。 例:元件的寄存器映射 #include #define IOADDR_ALTERA_AVALON_TIMER_STATUS(base) _IO_CALC_ADDRESS_NATIVE(base, 0) #define IORD_ALTERA_AVALON_TIMER_STATUS(base) IORD(ba
8、se, 0) #define IOWR_ALTERA_AVALON_TIMER_STATUS(base, data) IOWR(base, 0, data) #define ALTERA_AVALON_TIMER_STATUS_TO_MSK (0x1) #define ALTERA_AVALON_TIMER_STATUS_TO_OFST (0) #define ALTERA_AVALON_TIMER_STATUS_RUN_MSK (0x2) #define ALTERA_AVALON_TIMER_STATUS_RUN_OFST (1) #define IOADDR_ALTERA_AVALON_
9、TIMER_CONTROL(base) _IO_CALC_ADDRESS_NATIVE(base, 1) #define IORD_ALTERA_AVALON_TIMER_CONTROL(base) IORD(base, 1) #define IOWR_ALTERA_AVALON_TIMER_CONTROL(base, data) IOWR(base, 1, data) #define ALTERA_AVALON_TIMER_CONTROL_ITO_MSK (0x1) #define ALTERA_AVALON_TIMER_CONTROL_ITO_OFST (0) #define ALTERA
10、_AVALON_TIMER_CONTROL_CONT_MSK (0x2) #define ALTERA_AVALON_TIMER_CONTROL_CONT_OFST (1) #define ALTERA_AVALON_TIMER_CONTROL_START_MSK (0x4) #define ALTERA_AVALON_TIMER_CONTROL_START_OFST (2) #define ALTERA_AVALON_TIMER_CONTROL_STOP_MSK (0x8) #define ALTERA_AVALON_TIMER_CONTROL_STOP_OFST (3) 软件驱动程序抽象了
11、元件的硬件细节,所以软件可以在一个高的层次上访问元件。驱动函数,提供给软件访问硬件的 API。软件的要求根据元件的需要而有不同。最普遍的函数类型初始化硬件、读数据和写数据。驱动程序和目标处理器是相关的,元件编辑器允许用户方便地打包软件驱动程序到 HAL,Nios II 处理器开发工具将使用 HAL。提供驱动程序给其它的处理器,用户必须满足目标处理器的开发工具的需要。 为 Nios II HAL 编写驱动程序的更多信息,参阅 Nios II Software Developers Handbook。查看 Altera 提供的元件的软件文件也是很有帮助的。Nios II 开发包提供很多元件,用户可
12、以用作参考。路径为/components/ 8.2.4 验证元件 当用户完成越来越多的设计,用户可以以增量方式验证元件。通常,用户首先以一个单元来验证硬件逻辑(这可能包括很多小的验证阶段),然后在系统中验证元件。单元验证 单独测试任务逻辑模块,用户使用喜欢的验证方法,如行为级或寄存器传输级(RTL)的仿真工具。类似地,用户使用自己擅长的验证工具来验证所有的元件逻辑,包括寄存器文件和 Avalon 接口。在使用元件编辑器将 HDL 文件打包成一个元件之后,Nios II 开发包提供一个易用的方法来仿真元件的读和写的操作。使用 Nios II 处理器的强大的仿真环境,用户可以编写 C 代码让 Ni
13、os II 处理器向用户的元件发起读写传输。结果可以在 ModelSim 仿真器或是硬件上看到, 如 Nios 开发板。 读者可以参阅 AN351: Simulating Nios II Embedded Processor Designs 获取更多的信息。 系统级的验证 当用户将 HDL 文件打包成一个元件之后,用户可以在系统中例化该元件,并且验证整个系统模块的功能。 SOPC Builder 对 RTL 仿真器系统级的验证提供支持, 如 ModelSim。 当 SOPCBuilder 为系统级验证产生一个测试平台,仿真环境性能主要取决于系统中包含的元件。 8.2.5 设计实例:脉宽调制器从
14、外设 本节介绍脉冲宽度调制器(PWM)的设计实例,来介绍在系统中创建和例化元件的步骤。 该元件只有一个 Avalon 从端口。 下面将介绍如下的步骤: 安装设计文件。 查看设计实例的说明。 将设计文件打包成一个 SOPC Builder 元件。 在硬件上例化元件。 在 Quartus II 中编译硬件设计,然后下载设计到目标板上。 使用 Nios II 软件测试硬件。 1. 安装设计文件 首先安装 Nios II 开发工具,并且从 Altera 网站下载 PWM 设计实例。本节中使用的硬件设计是基于 Nios II 开发工具包中的 standard 硬件设计实例。当安装设计文件时,不要在目录名
15、中使用空格。如果路径包含有空格,SOPC Builder 可能不能访问设计文件。 建立设计环境要做如下的工作: 1. 解压 PWM 压缩文件到一个目录。本节用目录来表示该目录。 2. 在用户的本地计算机文件系统中,进入目录:/examples/standard。每个开发板都有 VHDL 和 Verilog 版本的设计。 3. 拷贝 standard 目录到一个新的位置。 这样可以避免, 破坏原始的设计。 本节通过 目录来指代该目录。 2. 查看设计的说明 本部分讨论 PWM 设计实例的设计说明,会给出如下主题的细节: PWM 设计文件。 功能说明。 PWM 任务逻辑。 寄存器文件。 Avalo
16、n 接口。 软件 API。 典型的设计流程中,是由设计者来制定元件的行为。 PWM 设计文件 表 8-4 列出了目录中提供的内容。功能说明 PWM 元件输出调制占空比的方波,基本的脉宽波形如图 8-17。本例中的 PWM 的功能有如下的要求: 任务逻辑按照一个单时钟同步工作。 任务逻辑使用 32 位的计数器提供 PWM 周期和占空周比的一个合适的范围。主处理器负责设置 PWM 周期和占空比的值。 这就需要对控制逻辑有一个读/写接口。 寄存器单元来保存 PWM 周期和占空比。 主处理器可以使用使能控制位来停止 PWM 的输出。 PWM 任务逻辑 PWM 的任务逻辑具有如下的特征: PWM 任务逻
17、辑包含一个输入时钟(clk),一个输出信号(pwm_out),一个使能位,一个 32bit 的模 n 的计数器,一个 32 位的比较器。 clk 驱动 32 位的模 n 计数器建立 pwm_out 信号的周期。 比较器比较模 n 计数器的当前值与占空比来决定 pwm_out 的输出。 当计数器的当前值小于或等于占空比的值,pwm_out 输出逻辑 0;否则输出逻辑 1。 图 8-18 给出了 PWM 任务逻辑的结构寄存器文件提供对使能位、模 n 的值和占空比的值的访问。如图 8-18。 设计将每个寄存器映射到一个 Avalon 从端口地址空间中唯一的偏移地址。每个寄存器具有读和写访问,这意味着
18、软件可以读取之前写入寄存器中的值。这种选择是以牺牲硬件资源为代价来获得软件上的便利。用户也可以设计寄存器为只是可写的,这会节省片上的逻辑资源,但是软件就不能读取寄存器的值。表 8-5 给出了寄存器文件和偏移量映射。为了支持 3 个寄存器,要求两位的地址编码。这将导致第四个寄存器为保留。要读写寄存器只需要一个时钟周期,这影响 Avalon 接口的等待周期。 Avalon 接口 PWM 元件的 Avalon 接口需要一个从端口,使用了 Avalon 信号中的一个小的信号集合来处理寄存器的读和写的传输。元件的 Avalon 从端口具有如下的特性: PWM 从端口是与 Avalon 从端口时钟同步的。
19、 PWM 的从端口是可读和可写的。 PWM 从端口的读写传输具有零等待周期, 因为寄存器能够在一个时钟周期内相应传输。 PWM 的从端口读写传输没有建立时间和保持时间的要求。 PWM 从端口没有读延迟的要求,因为所有的传输可以在一个时钟周期内完成。 PWM 从端口使用本地地址对齐方式,因为从端口是连接到寄存器而不是存储设备。 表 8-6 列出了实现传输属性需要的信号类型,也列出了在 HDL 文件中定义的信号名软件 API PWM 设计实例提供定义寄存器映射的头文件和 PWM 在 Nios II 处理器系统中的驱动程序。表 8-4 列出了这些文件,表 8-7 给出了驱动函数。3. 打包设计文件为
20、 SOPC Builder 元件 这部分,用户使用 SOPC Builder 元件编辑器将设计文件打包成一个SOPC Builder 元件。用户要执行如下的操作: (一)打开 Quartus II 工程,启动元件编辑器。 (二)配置元件编辑器每个页面的设置。 (三)保存元件。 (一)打开 Quartus II 工程,启动元件编辑器。执行如下的步骤: 1. 启动 Quartus II 软件。 2. 打开目录中的 standard.qpf 文件。 3. 选择 Tools 菜单中的 SOPC Builder。出现 SOPC Builder 图形用户界面,显示一个现成的包含一个 Nios II 处理器
21、和一些元件的设计实例。 4. 在 File 菜单中选择 New Component。 元件编辑器的图形用户界面出现, 显示的是 Introduction 页,如图 8-19。在 Introduction 页面中,介绍了元件编辑器的工具,创建元件需要的文件,将元件用于其它工程的方法,以及获得元件编辑器更多细节的方法。(二)配置元件编辑器每个页面的设置。 aHDL 文件页面 这部分是将 HDL 文件同元件联系起来。执行下面的步骤: 1. 在图 8-19 中点击 HDL Files 页,出现图 8-20 的页面。元件编辑器的每个页面上都提供在屏幕的信息,介绍怎样使用每一个页面。点击页面左上角的三角形
22、来查看使用指导。 2. 点击 Add HDL File。 3. 切换到/pwm_hw 目录。三个 Verilog 的 HDL 文件存放这个目录。 4. 选中这三个 HDL 文件,点击 Open。 返回 HDL Files 页。元件编辑器立即分析每一个文件,从每个文件读取 I/O 信号和参数信息。 5. 确保所有文件的 Simulation 和 Synthesis 复选框都已被选中,如图 8-21。这表示每个文件都适于仿真和综合的设计流程。 6. 选择 pwm_avalon_interfave.v: pwm_avalon_interface 在 Top Level Module 下拉框中,来指定
23、顶层模块,如图 8-21。此时,元件编辑器图形用户界面会显示错误消息,暂时忽略这些信息,后面的步骤会解决这些问题。b. 信号页面 对于顶层 HDL 模块中的每个 I/O 信号,用户必须将其信号名映射到一个有效的 Avalon 信号类型。这些工作在 Signals 页中进行。元件编辑器自动填写其在顶层 HDL 文件中发现的信号信息。如果一个信号名同 Avalon 信号类型同名(如 write 或 address),则元件编辑器自动分配信号的类型。如果元件编辑器不能判断信号类型,则将信号分配成 export 类型。执行如下的步骤进行元件I/O 信号的定义: 1. 点击 Signals 页,顶层 HDL 模块 pwm_avalon_interface 中的所有 I/O 信号自动出现。 2. 如图 822 所示来分配所有信号的类型。要改变某个值,点击 Signal Type单元格,显示一个下拉列表,选择一个新的信号类型。在图 8-22 中,将pwm_out 信号分配为 export 类型,因为它不是 Avalon 信号。它是 SOPC Builder 系统的一个输出信号。当正确地分配每个信号类型之后,错误信息就应该消失了。