本节讲述开发一个定制的SOPC Builder元件的设计流程,从创建定制外设、集成外设到 系统中,最后将其下载到硬件。讲述定制外设的开发流程之后,以Altera公司提供的一个设计实例作为练习。该实例展示了开发一个只具有Avalon从接口的外设。用户使用Altera提供的HDL设计,将其打包到成一个SOPC Builder元件,然后在系统中例化它。然后将工程编译下载到开发板上。最后介绍怎样共享用户定制外设,这样用户设计的外设可以为其它的系统和设计者使用。 4 P2 Q. r3 S3 T5 W3 l# w. v
SOPC Builder提供元件编辑器使用户可以创建和编辑自己的SOPC Builder元件。 * `: n7 C- c5 a) h6 N! q- m
- 典型地,一个元件有下面的部分构成:
- 硬件文件:描述元件硬件的HDL模块。
- 软件文件:定义元件寄存器映射的C语言的头文件,元件的驱动程序。
元件描述文件(class.ptf):定义元件的结构,提供给SOPC Builder将该元件集成到系统中必要的信息。元件编辑器根据用户提供的软件和硬件文件以及用户在元件编辑器的图形用户界面指定的参数自动产生这个文件。 - F5 f1 ?7 N, H1 Y6 `: C4 E2 m! _8 t5 D
在创建完描述元件的硬件和软件文件之后, 用户使用元件编辑器将这些文件打包成一个SOPC Builder元件。如果用户更新了硬件或软件文件,用户还可以使用元件编辑器对这个元件进行再次的编辑。 8 p i* b7 ^8 @) O5 [) Y8 \1 x
8.2.1 元件开发流程
. d, `2 F0 m/ T' W. ] 本节介绍元件开发流程,包括硬件和软件两方面,这里介绍只有一个Avalon从接口的元件设计流程, 而其设计流程的步骤可以很容易地推广到具有主端口的元件或者多个主端口和从端口的元件。
+ F3 L: f1 H3 C8 t) G从外设的典型的设计顺序包括如下的步骤: # D3 J. G% F9 c* P9 C# x
1. 指定硬件功能。
! |+ p# H3 F$ n+ _0 l! K2. 如果微处理器要控制该元件,指定访问和控制该硬件的应用程序接口 (API) 。
7 u! U9 w$ z1 D Q4 b; g3. 根据硬件和软件的要求,定义一个Avalon 接口,该接口要提供: 8 s) p; r' ?) s9 n% m1 U2 L! q8 E: Y
a. 正确的控制机制。 1 ]* s; m8 s2 t. ~# X% C7 c- \$ W
b. 足够的吞吐量性能。 5 r, y, Q* `3 S0 Q3 \$ J" U
4. 采用Verilog或者VHDL编写硬件设计。. % w( k( X8 ]" e. {
5. 单独测试元件的硬件,验证操作的正确性。
) d; V% S& C$ h$ ~6. 编写C头文件,为软件定义硬件层次的寄存器映射。 9 K0 ^" Q7 {# h6 h
7. 使用元件编辑器将硬件和软件文件打包成一个元件。
% L6 J) T. d% \5 N8 r+ W8. 例化元件为一个SOPC Builder系统的模块。
" l* E' O- R1 L- ]9. 使用Nios II处理器来测试对元件的寄存器级的访问,用户可以执行硬件的测试,或者是进行HDL仿真。
& u8 L* ]! }* F. o) A0 R _4 ]10.如果微处理器要控制该元件,编写元件的驱动程序。 ( i! X$ k [/ X# j9 s% W: q+ |
11. 根据元件的在系统的行为,反复改进元件的设计: 8 h6 _4 M% |) ], m" }
a. 硬件的改进和调整。 $ V6 P: [) u# q7 o
b. 软件的改进和调整。
. v; h# N" N5 n, {+ i c. 使用元件编辑器更新元件。 ' Z. z8 _% t8 a! ? e$ K
12.编译完整的含有一个或多个该元件的SOPC Builder系统。
) E' I; C9 \5 N/ ]9 h9 I9 j13. 执行系统级的验证,如果必要进行进一步的反复改进。
0 E3 V7 h" V$ R4 f- s# V* H) C' ]14. 完成元件的设计,发布该元件,其他设计者可以重用该元件。 : u9 t* A9 _6 |
主外设的设计的过程与之类似,只是软件开发方面有所差异。
4 {1 U. s2 l8 ?- I2 J/ V' S8.2.2 硬件设计 5 }% e- a* a- G7 T$ j
同任何的逻辑设计过程一样,SOPC Builder元件的硬件开发在需求分析阶段之后开始。当用户根据需求说明编写和验证HDL逻辑时,其过程是一个迭代的过程。
9 |) `3 e7 V: M典型元件的结构包括下面的功能模块: $ t8 p& c/ b c' |5 P q
p9 b2 Z: \' a
- 任务逻辑(Task Logic)——任务逻辑实现元件基本的功能。任务逻辑是和设计相关的。
- 寄存器文件(Register File)—— 寄存器文件为任务逻辑内部的信号同外部通信提供了一条通路,反之亦然。寄存器文件映射内部的节点为可寻址的地址偏移量,Avalon接口可对其进行读写访问。
- Avalon 接口—— Avalon接口提供标准的寄存器文件的Avalon前端。接口可以使用任意的Avalon信号类型,以访问寄存器文件和支持任务逻辑所需要的传输。下面的因素影响 Avalon接口:
要传输的数据宽度是多少? / E7 [% W( f/ k( h2 K7 J, l, C
数据传输需要的吞吐量的要求是多少? 8 O& U( R6 I- g- k( m
该接口主要是为了控制还是数据? 即传输是零星的,还是连续的突发传输?
8 r2 ]! }! `! F: U/ H 硬件相对系统中其它的元件是快速还是低速元件? + J! Q5 u- E; l6 k- P1 z6 m
图8-16为一个具有一个Avalon从端口的典型元件的原理图。
$ E, u2 E. [* `0 c$ T7 T8.2.3 软件设计
4 \/ k/ V" P1 h' u- B 如果用户想要微处理器来控制用户的元件,用户则必须提供软件文件,软件文件定义了该元件的软件视图。在最小化的软件设计中,用户必须定义每个从端口的寄存器映射,以便处理器可以访问。元件编辑器允许用户将C语言的头文件和元件打包在一起以定义硬件的软
+ u; F1 N J' h9 Y. {件视图。典型情况下,头文件声明读和写元件寄存器的宏函数,寄存器的地址相对于分配给元件的符号化的基地址。 下面的例子是从Altera提供的用于Nios II处理器的UART元件的寄存器映射摘录的一部分。 8 i8 ]8 V! C: e) n
例:元件的寄存器映射 4 t& r; K! `/ ]# j5 {# n" X2 d
#include <io.h>
; |8 n2 _3 T" ^9 |6 b7 v; T5 p#define IOADDR_ALTERA_AVALON_TIMER_STATUS(base) __IO_CALC_ADDRESS_NATIVE(base, 0)
3 Z" Z& _ B8 N- W2 G#define IORD_ALTERA_AVALON_TIMER_STATUS(base) IORD(base, 0)
5 \/ Y' S8 c/ R+ }#define IOWR_ALTERA_AVALON_TIMER_STATUS(base, data) IOWR(base, 0, data) ) s+ q7 H3 x9 v. o3 G7 L
#define ALTERA_AVALON_TIMER_STATUS_TO_MSK (0x1)
% D5 E% @8 z/ m* R+ Y#define ALTERA_AVALON_TIMER_STATUS_TO_OFST (0) 3 S$ f: n8 y+ B6 q) Q: }
#define ALTERA_AVALON_TIMER_STATUS_RUN_MSK (0x2)
( h9 U* W4 X, r# B; |2 @; U& g7 I: ?#define ALTERA_AVALON_TIMER_STATUS_RUN_OFST (1) 4 I3 l5 S( r4 G0 H( N. |6 k
#define IOADDR_ALTERA_AVALON_TIMER_CONTROL(base) __IO_CALC_ADDRESS_NATIVE(base, 1)
+ h0 }+ S$ [6 Z1 ^#define IORD_ALTERA_AVALON_TIMER_CONTROL(base) IORD(base, 1)
7 c6 D$ D' E% Q$ U#define IOWR_ALTERA_AVALON_TIMER_CONTROL(base, data) IOWR(base, 1, data)
$ R) `6 m; o- }' v+ V3 _#define ALTERA_AVALON_TIMER_CONTROL_ITO_MSK (0x1) 5 x# O1 {" V- L/ b, m- t* A
#define ALTERA_AVALON_TIMER_CONTROL_ITO_OFST (0)
' g2 b; V# F( \* E; `, D#define ALTERA_AVALON_TIMER_CONTROL_CONT_MSK (0x2)
8 N" c1 [. B: g/ p* E" L; n* L' C#define ALTERA_AVALON_TIMER_CONTROL_CONT_OFST (1)
: V' V) B h# p$ O#define ALTERA_AVALON_TIMER_CONTROL_START_MSK (0x4)
# r5 @2 Z6 R' Y+ {#define ALTERA_AVALON_TIMER_CONTROL_START_OFST (2)
( h3 A/ h( V* G' s5 w% O, a#define ALTERA_AVALON_TIMER_CONTROL_STOP_MSK (0x8) 6 I* k9 @! n+ q$ m- \8 `
#define ALTERA_AVALON_TIMER_CONTROL_STOP_OFST (3)
; @ H/ y. H1 _ 软件驱动程序抽象了元件的硬件细节,所以软件可以在一个高的层次上访问元件。驱动函数,提供给软件访问硬件的API。软件的要求根据元件的需要而有不同。最普遍的函数类型初始化硬件、读数据和写数据。驱动程序和目标处理器是相关的,元件编辑器允许用户方便地打包软件驱动程序到
9 \# W7 I) X2 b1 IHAL,Nios II 处理器开发工具将使用HAL。提供驱动程序给其它的处理器,用户必须满足目标处理器的开发工具的需要。 3 J" D% ]2 U6 w
为Nios II HAL编写驱动程序的更多信息,参阅Nios II Software Developer's Handbook。查看Altera提供的元件的软件文件也是很有帮助的。Nios II开发包提供很多元件,用户可以用作参考。路径为<Nios II kit path>/components/
0 R+ n6 |' T# p5 F M8.2.4 验证元件 ! V! t5 z* U9 C8 }& F N
当用户完成越来越多的设计,用户可以以增量方式验证元件。通常,用户首先以一个单元来验证硬件逻辑(这可能包括很多小的验证阶段),然后在系统中验证元件。
9 ^$ e9 ~; \" m6 i6 V& i! N单元验证 - c$ t6 [2 S+ ?( F
单独测试任务逻辑模块,用户使用喜欢的验证方法,如行为级或寄存器传输级(RTL)的仿真工具。类似地,用户使用自己擅长的验证工具来验证所有的元件逻辑,包括寄存器文件和Avalon接口。在使用元件编辑器将HDL文件打包成一个元件之后,Nios II开发包提供一个易用的方法来仿真元件的读和写的操作。使用Nios II处理器的强大的仿真环境,用户可以编写C代码让Nios II处理器向用户的元件发起读写传输。结果可以在ModelSim仿真器或是硬件上看到, 如Nios 开发板。 读者可以参阅AN351: Simulating Nios II Embedded Processor Designs获取更多的信息。 # g: t% D* E) D3 s8 M
系统级的验证 ! `0 D& x- T: r* `# u
当用户将HDL文件打包成一个元件之后,用户可以在系统中例化该元件,并且验证整个系统模块的功能。 SOPC Builder对RTL仿真器系统级的验证提供支持, 如ModelSim。 当SOPCBuilder为系统级验证产生一个测试平台,仿真环境性能主要取决于系统中包含的元件。
; j. m; d: Y4 d, V3 ^8.2.5 设计实例:脉宽调制器从外设
& p. M. l$ V7 ] 本节介绍脉冲宽度调制器(PWM)的设计实例,来介绍在系统中创建和例化元件的步骤。
+ S! X0 |8 U3 z: k; f% E该元件只有一个Avalon从端口。
. r* E0 O1 G+ [3 c* [9 Q: m下面将介绍如下的步骤: ; Y, X1 u- T. r ^
- \1 H! [ {6 }6 ?/ }+ ^" p' N
- 安装设计文件。
- 查看设计实例的说明。
- 将设计文件打包成一个SOPC Builder元件。
- 在硬件上例化元件。
- 在Quartus II中编译硬件设计,然后下载设计到目标板上。
- 使用Nios II软件测试硬件。
1. 安装设计文件 3 o2 q( Y! y7 }( l% I
首先安装Nios II 开发工具,并且从Altera网站下载PWM设计实例。本节中使用的硬件设计是基于Nios II开发工具包中的standard硬件设计实例。当安装设计文件时,不要在目录名中使用空格。如果路径包含有空格,SOPC Builder可能不能访问设计文件。 . [) h8 q9 q$ D" o$ a( ^
建立设计环境要做如下的工作: ! C+ ^5 _3 j+ i
1. 解压PWM 压缩文件到一个目录。本节用<PWM design files>目录来表示该目录。 " x8 H- B- Q8 Z/ F! A" O& L
2. 在用户的本地计算机文件系统中,进入目录:<Nios II kit path>/examples/<verilog or vhdl>/<board version>/standard。每个开发板都有VHDL和Verilog版本的设计。 2 R6 l O# b( L( T L
3. 拷贝standard目录到一个新的位置。 这样可以避免, 破坏原始的设计。 本节通过<Quartus II project> 目录来指代该目录。 3 M' K* n3 E. r+ T& |
2. 查看设计的说明
3 e' w% D9 Z7 ]本部分讨论PWM设计实例的设计说明,会给出如下主题的细节:
9 T- Y8 C, V: U) ]6 `; Y% o" B- N0 g5 s' G
- PWM 设计文件。
- 功能说明。
- PWM任务逻辑。
- 寄存器文件。
- Avalon接口。
- 软件API。
典型的设计流程中,是由设计者来制定元件的行为。
' @, ^0 P- X' D. J* TPWM设计文件 3 {2 x% W% q% g! \5 |, u0 R- }: O
表8-4列出了<PWM design files>目录中提供的内容。
# q0 d8 {- K6 ^) q功能说明 8 b3 W+ k! E: \. S z
PWM元件输出调制占空比的方波,基本的脉宽波形如图8-17。 本例中的PWM的功能有如下的要求:
; B" V! [; u, A+ Z# l+ Q1 j& w - 任务逻辑按照一个单时钟同步工作。
- 任务逻辑使用32位的计数器提供PWM周期和占空周比的一个合适的范围。 主处理器负责设置PWM 周期和占空比的值。 这就需要对控制逻辑有一个读/写接口。
- 寄存器单元来保存PWM周期和占空比。
- 主处理器可以使用使能控制位来停止PWM的输出。
PWM 任务逻辑
5 y9 G' @) l8 `; f+ P - PWM的任务逻辑具有如下的特征:
- PWM任务逻辑包含一个输入时钟(clk),一个输出信号(pwm_out),一个使能位,一个32bit的模n的计数器,一个32位的比较器。
- clk驱动32位的模n计数器建立pwm_out信号的周期。
- 比较器比较模n计数器的当前值与占空比来决定pwm_out的输出。
- 当计数器的当前值小于或等于占空比的值,pwm_out输出逻辑0;否则输出逻辑1。
图8-18给出了PWM任务逻辑的结构
! V& D, c* Q$ l# ~7 j. Z' n 寄存器文件提供对使能位、模n的值和占空比的值的访问。如图8-18。 设计将每个寄存器映射到一个Avalon从端口地址空间中唯一的偏移地址。 & Z2 e2 y4 l" I+ A* B7 ^6 ]
每个寄存器具有读和写访问,这意味着软件可以读取之前写入寄存器中的值。这种选择是以牺牲硬件资源为代价来获得软件上的便利。用户也可以设计寄存器为只是可写的,这会节省片上的逻辑资源,但是软件就不能读取寄存器的值。表8-5给出了寄存器文件和偏移量映射。为了支持3个寄存器,要求两位的地址编码。这将导致第四个寄存器为保留。
要读写寄存器只需要一个时钟周期,这影响Avalon接口的等待周期。 : x7 V8 |0 A! i" D) i3 i
Avalon接口 : r* J/ e* K6 {3 C+ v2 q' ?- s$ n
PWM元件的Avalon接口需要一个从端口,使用了Avalon信号中的一个小的信号集合来处理寄存器的读和写的传输。元件的Avalon从端口具有如下的特性: * z* `9 q; J2 t6 w/ z4 K
- PWM从端口是与Avalon从端口时钟同步的。
- PWM的从端口是可读和可写的。
- PWM从端口的读写传输具有零等待周期, 因为寄存器能够在一个时钟周期内相应传输。
- PWM的从端口读写传输没有建立时间和保持时间的要求。
- PWM从端口没有读延迟的要求,因为所有的传输可以在一个时钟周期内完成。
- PWM从端口使用本地地址对齐方式,因为从端口是连接到寄存器而不是存储设备。
表8-6列出了实现传输属性需要的信号类型,也列出了在HDL文件中定义的信号名 软件API & _+ A5 [" b }. f# J2 G
PWM设计实例提供定义寄存器映射的头文件和PWM在Nios II 处理器系统中的驱动程序。表8-4列出了这些文件,表8-7给出了驱动函数。 3. 打包设计文件为SOPC Builder元件
& t! c& R; c9 w& a; y 这部分,用户使用SOPC Builder元件编辑器将设计文件打包成一个SOPC Builder元件。用户要执行如下的操作: 8 C+ p% }! ^, ^5 `1 r
(一)打开Quartus II 工程,启动元件编辑器。 ( m; [: e+ P9 g7 Y, m$ {
(二)配置元件编辑器每个页面的设置。
0 @- P2 c0 j. d/ A& d(三)保存元件。
7 T J+ J5 Y( V* @: T6 t(一)打开Quartus II 工程,启动元件编辑器。执行如下的步骤: 1 k2 y' Q2 D4 t4 I' j( B
1. 启动Quartus II软件。 3 }. b2 `0 B' D: L# n; X0 j( r( Q
2. 打开<Quartus II project>目录中的 standard.qpf文件。
" \2 e$ F7 y, I" o' ~( @8 H3. 选择Tools菜单中的SOPC Builder。出现SOPC Builder图形用户界面,显示一个现成的包含一个Nios II处理器和一些元件的设计实例。
( H% [9 F4 f9 c$ B( Q' o4. 在File菜单中选择New Component。 元件编辑器的图形用户界面出现, 显示的是Introduction页,如图8-19。在Introduction页面中,介绍了元件编辑器的工具,创建元件需要的文件,将元件用于其它工程的方法,以及获得元件编辑器更多细节的方法。 (二)配置元件编辑器每个页面的设置。
, P- ~4 ~! [! v0 F q: I# Ya.HDL文件页面
5 q3 L: W& V" Z, Z5 k 这部分是将HDL文件同元件联系起来。执行下面的步骤: - H% u, h$ \# \6 I# W7 s+ _7 W9 M% x
1. 在图8-19中点击HDL Files页,出现图8-20的页面。元件编辑器的每个页面上都提供在屏幕的信息,介绍怎样使用每一个页面。点击页面左上角的三角形来查看使用指导。
1 f7 R" a3 h3 o/ }3 u/ [: r2. 点击Add HDL File。 & u0 `4 @) H, C* o" `9 q
3. 切换到<PWM design files>/pwm_hw目录。三个Verilog的HDL文件存放这个目录。 : }2 I7 g5 M" P2 P, @, T
4. 选中这三个HDL文件,点击Open。 返回HDL Files页。元件编辑器立即分析每一个文件,从每个文件读取I/O信号和参数信息。 t0 K% l+ C, f+ h! v! w* X! M
5. 确保所有文件的Simulation和Synthesis复选框都已被选中,如图8-21。这表示每个文件都适于仿真和综合的设计流程。
1 i5 d" N. `3 i/ {* ?3 d6. 选择pwm_avalon_interfave.v: pwm_avalon_interface在Top Level Module下拉框中,来指定顶层模块,如图8-21。此时,元件编辑器图形用户界面会显示错误消息,暂时忽略这些信息,后面的步骤会解决这些问题。
9 a% I \" q. q- y b. 信号页面
" @& V" U! L1 ^" d* J 对于顶层HDL模块中的每个I/O信号,用户必须将其信号名映射到一个有效的Avalon信号类型。这些工作在Signals页中进行。元件编辑器自动填写其在顶层HDL文件中发现的信号信息。如果一个信号名同Avalon信号类型同名(如write或address),则元件编辑器自动分配信号的类型。如果元件编辑器不能判断信号类型,则将信号分配成export类型。执行如下的步骤进行元件I/O信号的定义:
U$ F; u/ C- ]# _. J1. 点击Signals页,顶层HDL模块pwm_avalon_interface中的所有I/O信号自动出现。 ' O/ V) J( N% \% O9 v' C
2. 如图8–22所示来分配所有信号的类型。要改变某个值,点击Signal Type单元格,显示一个下拉列表,选择一个新的信号类型。在图8-22中,将pwm_out信号分配为export类型,因为它不是Avalon信号。它是SOPC Builder系统的一个输出信号。当正确地分配每个信号类型之后,错误信息就应该消失了。 c.接口页面
8 t8 K% K+ g* ~. N+ A# f" o9 U+ r接口页使用能够户配置元件上所有的Avalon接口的属性。PWM元件只有一个Avalon接口。执行下面的步骤进行Avalon从端口的配置:
3 ]: N: \$ f9 `5 h2 s, A* Q3 s1. 点击Interfaces页 tab。元件编辑器显示一个默认的Avalon从端口,该端口是元件编辑器基于元件设计的顶层I/O信号创建的。
5 g0 f7 a- o5 N1 s2. 在Name域中键入control_slave重命名该从端口,当用在SOPC Builder中户例化该元件时,该端口名出现在SOPC Builder 图形用户界面中。 " R* p1 W- ]9 p# [' v0 }1 C) Q
3. 如表8-8所示修改control_slave接口的设置。图8-23给出了正确的设置的Interfaces页。 d.软件文件页 % Y& k7 q* j D+ y" V; b8 `
SW Files页使用户将软件文件同元件联系起来,并指定它们的使用方法。PWM设计实
% _& I2 f! [/ L例提供了定义寄存器映射的头文件和驱动程序。执行下面的步骤将软件文件引入到元件中:
% ~, r2 S+ M9 M. ] k F" n1. 点击SW Files页。 . a' S8 a- z0 u
2. 点击Add SW File,出现打开对话框。 ; m1 f3 S' t) i. P7 H1 @$ y
3. 切换到<PWM design files>/pwm_sw/inc目录。 , s6 V: e& h# M
4. 选择altera_avalon_pwm_regs.h文件,点击Open。 * ?5 L J1 `( W
5. 点击altera_avalon_pwm_regs.h的Type单元格,改变文件类型。下拉列表中,选择Registers (inc/)。 ! \$ z* ]( ]- \
6. 重复2~5的步骤,添加<PWM design files>/pwm_sw/HAL/inc/altera_avalon_pwm_routines.h文件,设置其为HAL (HAL/inc/)类型。 5 y# ~" Q% G: m# r7 A
7. 重复2~5的步骤,添加<PWM design files>/pwm_sw/HAL/src/altera_avalon_pwm_routines.c文件,将其设置为HAL (HAL/src/)类型。 : M n1 b/ k$ X. ^3 Z
图8–24显示了SW Files页的正确的设置。 e.元件向导页
1 z* } _! D$ }3 l( U元件向导页允许用户控制在SOPC Builder例化元件时,添加向导的样式。执行下面的步骤配置元件向导的样式:
/ `$ p% G2 O% H1. 点击Component Wizard页。 2. 对于本例,不改变元件名,元件版本和元件组的默认值。
" q+ H5 u- z( J& }, A/ J3. 在Parameters栏中,在clock_divide_reg_init的Tooltip单元格键入:Initial PWM Period After Reset。
' @: s5 {5 K( i3 u w( K# [& t7 H# E4. 在clock_cycle_reg_init的Tooltip单元格中键入: Initial Duty Cycle After Reset。 如图8-25 9 D# R# i. D' C6 S9 }2 s
5. 点击Preview the Wizard 预览元件SOPC Builder例化时的元件向导的样式,如图8-26 所示。 6. 关闭预览窗口。 (三) 保存元件
4 H% j2 F o% A% H3 a) X执行下面的步骤保存元件,并且退出元件编辑器: 2 j0 z8 \7 H% s: b7 h7 W, x
1. 在图8-25中点击Finish,出现对话框,提示为元件创建文件,如图8-27。 ( D, a0 i. E0 B3 ^7 S. x/ u
2. 点击Yes保存文件。元件编辑器保存这些文件到<Quartus II project>目录中一个子目录。元件编辑器关闭,返回SOPC Builder图形用户界面。
" Z9 U$ @! l# F& U6 s3. 在Unkown组中可用的元件列表中找到pwm_avalon_interface新元件。用户可以在SOPC Builder系统中例化该元件。 4. 例化元件 # E3 p/ h) v0 K
此时,新的元件已经可以在SOPC Builder系统中例化了。元件的使用是和设计相关的, 是基于系统的需要的。剩下的步骤演示例化和测试元件的一种可能的方法。然而,该元件在系统中使用方法数目是没有限制的这部分用户将添加新的PWM元件到系统中,重新编译硬件设计,重新配置FPGA。包括如下的步骤: % m3 s! m x9 }6 q! v
1. 添加一个PWM硬件到SOPC Builder系统,重新生成系统。
" I# W. {1 d: w2. 修改Quartus II设计,连接PWM 输出到FPGA的一个引脚。
2 A: e( q, a. k |) b3. 编译Quartus II设计,使用新的硬件镜像文件配置FPGA。
1 O( s! l! w6 l5 J6 `添加PWM元件到SOPC Builder系统,执行下面的步骤建立SOPC Builder的元件搜索路径:
; S& p8 p" ^+ I1. 在SOPC Builder图形用户界面中,在File菜单中选择SOPC Builder Setup。 - W% O8 U' A% x
2. 在Component/Kit Library Search Path中输入<Quartus II project>目录的路径。如果已经有一些路径存在,使用"+"来分隔这些路径。如图8-28所示。 " X: c* f2 ?* v- x: T6 b' ^
3. 点击OK。
; R7 P6 A. Z9 `( n: ^, s2 l上面的这些步骤使得元件的软件文件对Nios II IDE可见。 这些步骤对Quartus II 软件v4.2和Nios II IDE v1.1是必须的。 执行下面的步骤将PWM元件添加到SOPC Builder系统: 7 W, q, `8 J* t: t+ j3 X
1. 在SOPC Builder System Contents页,在Unkown组中选择pwm_avalon_interface,然后点击Add。PWM元件的配置向导出现,如图8-26。如果用户需要,可以修改配置界面中的参数。参数会影响PWM控制寄存器的复位状态。 ' D1 _: c: {0 z: v% A5 D7 m1 }- z
2. 点击Finish。返回到SOPC Builder System Contents页,元件pwm_avalon_interface_0出现在活动的外设的列表中。 # o) M9 r. v6 [
3. 右键单击pwm_avalon_interface_0 , 选择Rename, 键入z_pwm_0 的名字, 然后按Enter键,如图8-29。 , f0 w' t5 U! f, r0 F( ?
4. 点击Generate开始生成系统。
8 w# @8 |/ n6 J" \. c S5. 系统生成成功之后,退出SOPC Builder,返回到Quartus II。 5. 在Quartus II中编译硬件设计,然后下载设计到目标板上。
9 j7 L/ p* ^6 E+ H" j 此时, 用户已经创建了一个使用PWM元件的SOPC Builder系统, 用户必须更新Quartus II工程才能使用PWM 的输出。.
* C6 ~( R) s) O8 ?. zstandard.bdf文件是顶层的原理图设计文件,BDF包含SOPC Builder系统模块的一个符号,名字为std_<FPGA>,这里<FPGA> 代表的是目标板上的 FPGA,如std_2C35。在之前的步骤中,用户添加PWM元件,则系统模块会产生新的输出。所以要更新系统模块的符号,并将PWM 的输出连接到FPGA的一个引脚。 & v2 u& R9 u/ l: [, }
1. 在Quartus II中,打开standard.bdf文件。
; O7 }4 \" v3 M+ N2. 在standard.bdf中右键单击符号std_<FPGA> ,然后选择Update Symbol or Block。更新符号或模块的对话框出现。
, D6 w9 g2 b# d2 `3. 选择Selected Symbol(s) or Block(s),如图8-30所示。 ! X% }2 l! _0 u; T H' P
4. 点击OK关闭对话框。std_<FPGA> 符号已经被更新了,现在已经有了一个新的输出端口名为pwm_out_from_the_z_pwm_0。SOPC Builder为所有系统模块上所有的I/O端口创建唯一的名字,名字是将元件设计文件中的信号名同系统模块中元件的实例名。 . U5 {3 {# d' ^" h1 k
5. 删除连接到port out_port_from_the_ LED_pio[7..0]端口的引脚。
7 r5 T* a+ m& ~/ R B6 t+ q6. 创建一个新的引脚命名为LEDG[0]。 ) O4 ?7 f5 w+ }6 N, M. Z
7. 将新的引脚连接到pwm_out_from_the_z_pwm_0端口。现在可以对硬件进行编译了。 编译硬件和下载到目标板的步骤在第二章已经讲解过,这里就不做赘述了。
5 n+ c8 k9 @; d1 t/ D. _4 }$ ^6. 在Nios II软件中使用硬件 # o* E$ B( u( }7 U' t2 l
PWM设计实例是基于Nios II处理器,用户必须在Nios II处理器中执行软件来验证PWM硬件。设计实例的设计文件提供了C语言的测试程序,该层序使用PWM的输出点亮LED,该程序会让PWM占空比渐变。测试程序访问硬件使用寄存器映射和调用驱动函数的方式。关于软件工程的创建、 源文件和头文件的引入以及程序的调试和下载等内容在第六章已经介绍过了,这里就跳过了。程序的运行会使开发板上的LED重复的亮灭,但是周期是渐变的。 8.2.6 共享元件 ; C3 h$ {/ P1 z
当用户使用元件编辑器创建了一个元件, SOPC Builder在当前的Quartus II工程目录中自动地保存该元件。为了促进设计的重用,用户可以在不同的工程中使用元件,用户也可以将自己的元件同其它设计者分享。 / I2 c; f! g# A9 o
执行下面的步骤,可以分享一个元件: ) `0 N" r' M4 P; g
1. 在用户的计算机文件系统中, 将元件的目录移到一个Quartus II 工程目录之外的一个位置。例如,可以创建一个目录c:\my_component_library 来保存用户的定制元件。目录路径中不能包含空格。
6 e& k! H( m; V+ }/ z4 }# a2. 在SOPC Builder中,在File菜单中选择SOPC Builder Setup。出现SOPC Builder Setup对话框, 在该对话框中用户可以指定SOPC Builder到哪去找元件的文件。 , {" @1 Y0 U. t6 p
3. 在Component/Kit Library Search Path里添加包含元件目录的目录。例如,元件的目录为c:\my_component_library\pwm_avalon_interface\,加入路径c:\my_component_library。如果已经有路径存在,使用"+"来分隔路径名,如图8-28所示。 + o. c4 n0 ~0 Z4 }4 Q- s4 J2 }
4. 点击OK。 * K& w% N$ t% | Y0 j0 B2 n8 y7 c
+ R/ @: M6 A4 [6 g5 w/ u2 w6 _
[ 本帖最后由 kenson 于 2009-1-2 20:12 编辑 ] |