EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-8-25 17:04 编辑 1 o1 l+ U7 J8 n2 B2 w. y+ T6 }. C9 u
" ^# K& m9 a. o N Q& j# X, P; _
5 `1 F0 c% F# S# r C' j+ i& e5 n
" x4 L# e/ `: |! r
+ d# m1 W2 d! j8 `
: N$ }# X! i6 N1 X3 Z$ @2 P
本篇通过原理图设计,学习MicroBlaze基本结构,通过Tcl脚本创建简单的MicroBlaze工程,实现MicroBlaze调用UART模块,完成串口打印功能,掌握在模块化设计中,MicroBlaze最小系统的组成,学会导出、建立以及运行基于SDK的工程。获取本篇相关源工程代码,可在公众号内回复“MicroBlaze串口设计源工程”。
* ]1 q: y& m9 s" I8 n6 z9 R1 h
/ c f" M" Q) O9 i3 j9 t. A& k; I* e
7 Y$ a+ r, J1 w! m/ k' q8 @) l1 I' p
7 h! A4 n5 o% [/ a8 T6 }
设计原理
" z* w; ?# T: N _
4 ~5 q7 {. z2 N% {, s0 G# s9 ^
& Q6 ]- E- l1 j- C/ Q1 p3 R( [# C" R7 B, N9 p) |: b+ E
- g# K, x, F8 h# Y/ I1 Y1 d" a本系统中,Basys3的MicroBlaze模块调用基于AXI协议的UART IP核,通过AXI总线实现MicroBlaze-UART之间的通信,完成串口打印。
6 `0 U$ L W" v. ]
! `1 U9 S2 G- E' f1 @* h- ] v$ P
5 Q. E) ~1 f- N3 u. c* [
" C; s. j, B/ V; W+ s 6 U- T6 j, S- R
操作步骤6 J1 j$ w( L* u- \5 ^8 ?4 g* F0 P
$ t- @0 A0 g ?" P2 ^) a: W: n, l8 f# b& }$ S* [
7 V" d! {8 k* V9 _
& v2 E# z9 d' ?! Z; }7 `, V4 w一、基于GUI界面创建工程
# F8 D3 V2 T3 H/ l* `6 p" G8 \0 Y1. 创建新的工程项目
$ [8 N" m9 T; N' t2 Z. E1) 双击桌面图标打开Vivado 2017.2,或者选择开始>所有程序>Xilinx Design Tools> Vivado 2017.2>Vivado 2017.2; 2) 点击‘Create Project’,或者单击File>New Project创建工程文件; 3) 将新的工程项目命名为‘lab6’,选择工程保存路径,勾选‘Create project subdirectory’,创建一个新的工程文件夹,点击Next继续; 4) 选择新建一个RTL工程,由于本工程无需创建源文件,故将Do not specify sources at this time(不指定添加源文件)勾选上。点击 Next继续; 5) 选择目标FPGA器件:xc7a35tcpg236-1或Basys3; 6) 最后在新工程总结中,检查工程创建是否有误。没有问题,则点击Finish,完成新工程的创建。
E! e$ k4 w, C: K6 P% V I2. 创建原理图,添加IP,进行原理图设计。
9 |5 B& B. M! b+ l7 D+ Z& A( g2 F1) 在Project Navigator下,展开IP INTEGRATOR,选择‘Create Block Design’创建新的原理图设计; 2) 将新的设计命名为‘MB_UART’; ; L( V1 B9 K" H6 e& m
. _$ S1 p4 I. \4 e
2 b0 y e, U) O; U2 @ V5 I
# R4 m# m7 w* H' ?8 M" k
5 n, S `' J9 d3) 添加一个clock IP,在原理图(Diagram)界面中鼠标右击,选择‘Add IP’。在IP搜索框中输入‘clocking’,双击添加Clocking Wizard;
$ y# e' T2 I/ @1 D- I4 u- l! s. k
* R& R3 f5 G3 A
' |: _* l7 M q/ r8 b
2 t0 ^: T" e$ c7 d8 K3 S) `% j
$ O8 t! U2 v; ?, P+ c2 G" L1 Z/ n
4) 双击Clocking Wizard模块进行自定义配置,选择Output Clocks一栏,确定clk_out1频率为100(MHz),Reset Type为Active High;
$ j* e8 G- |0 C) n
) @1 T9 O: ~3 Z9 i3 _& E
9 @; r. C) L6 {- _; P
8 B; I9 Y/ U$ O% I) g* j+ G
; f+ ^* _0 w$ D0 q) N. w2 b
# n! y9 c' @) K. }
& g8 Z" n- f2 [* _( `. B$ {. ~2 P$ T) W R9 J" b6 k0 d% n
9 a* h, V [: B/ \% g2 @
' b$ ^) P& y0 D6 q% @7 Q1 S7 X# E m2 y6 P* P- r: Y
* l' x" a S/ O# |4 f k5) 鼠标右击‘clk_in1’,选择Make External添加引脚; ' r6 k- m" R' l$ ?
, ^3 J' r# O6 q8 s- e2 m2 K
7 W2 l1 p: o) [: j: j9 a0 I/ p
8 x: J7 o1 E( M% m2 p, {$ ?/ Y. W; I5 H, `1 R, H
j6 ?3 f9 \' W: c7 ^9 m
9 i% ^8 g- \/ x9 i
- |1 {9 w( X4 R6 Q, w I/ t6) 完成后,如下图所示: 0 ^5 h% O% X: F1 `) q$ T
2 B+ ~8 a3 d8 v/ g. L% Z
. c0 ?2 V6 Z0 ?- I; p6 w* [# e$ Q2 d2 o2 w. o8 I; s* H
, {4 G4 `& A6 g9 ^+ r
6 b- A) }3 x- d7) 同样的,在Diagram中添加MicroBlaze IP;
$ D- V) D0 c2 @9 G( _
' P# ^3 |0 \; q
3 q/ S2 I! M$ _9 ]& V6 q* q; K* t6 B. c+ \
' {; l; E* j' ^0 `) r/ m+ Y
" a9 V' s, n0 t/ J) h6 s: M8 E' }" [7 n- t: S/ g9 _
* i: k. `9 b: h& p
8) 添加完成后如下图所示,点击‘Run Block Automation’; # W! c7 T/ t& G
0 ]& }' _) K7 _& ~
# {: Q" Q+ p, s7 W* ~9 e
# A' h4 J; U6 k* O, N' z' j
" x* P4 o7 ]1 }& }9 U/ r- j; ~ s. N- r. M& g3 w$ ^# M# s$ h
' b7 a% e4 S+ Y( }* \. q3 B# _% c) O; Y/ z- t( t7 I4 x
& P! |: o# H9 {. g2 P$ W& a9 [5 a& D* x5 c/ W, }
9) 在弹出窗口中,使用以下设置替换默认设置;
: f! x; Z" q! Q- VLocal Memory: 128KBLocal Memory ECC: NoneCache Configuration: NoneDebug Module: Debug OnlyPeripheral AXI Port: EnabledInterrupt Controller: 不勾选Clock Connection: /clk_wiz0/clk_out1(100 MHZ)
T7 V/ Z' u, y8 u- w4 V
! x4 V6 K8 J1 P, Q
) `3 {2 D6 W! a% V6 P8 }4 L# W& S4 O D: \0 {3 Q' H
; i L% Y6 _% a+ A+ \/ z0 S) G- C: _( q* O; n( l
10) 完成之后,Vivado会基于之前的设置自动生成一些额外的IP,并且会自动连接完毕,此时不要点击‘Run Connection Automation’;
H# L( t9 G0 f: J% }7 V# o4 ?& H: o2 u! d+ g. Y
# m1 S5 M$ X: v2 n y* z
1 ~" t }9 y, U+ r p) T" u' M5 i- F2 k
0 |, |+ t6 j8 S9 d/ r! M% n& M% `5 A, c
0 ^' ?- D+ ~/ y; o/ ?+ s" i: e) ~" ]. _7 i3 Z+ o9 ~& r. @
$ f! |3 ~; l/ J# n7 \5 h/ p1 l2 z
; w: O6 h6 L8 F$ ]0 r! E2 s% \11) 在Diagram中添加AXI Uartlite IP,在搜索框输入‘uart’,选择相应的IP; $ {* S3 S5 y% }/ A0 S
: Y" g' }# l. l! f7 z% d' t2 d- g2 l: b2 h! w) m- [# y
8 E0 L1 T9 ~0 g
+ W& r7 B0 f+ i" [& R% c
8 {- Q/ I+ D# ^5 P
8 ~& o7 D- J: r k$ e, l) t
8 @# @, G9 W3 x+ O# j& A% m* }
9 P0 l% f% W, O- J+ O; c* M, T0 _! K& a
12) 鼠标右击Clocking Wizard的‘reset’,选择Make External添加引脚;
" s9 w# I, m: ]8 ?9 D! q. I( l5 k7 S8 K4 ^- o, S
* W( L5 w; F h5 _
- v9 P% |9 U" p' g0 X# M5 d) W3 J# P
" c {0 d; W1 m: e* `/ s- `$ r* W
& Q/ i) q& O" f: ?) T, ^% q: P9 n. k* {1 L
13) 使用连线工具将Processor System Reset的‘ext_reset_in’与‘reset’相连接。 9 x" i, Z+ {4 L( ^
8 U; w: a" M7 N k& e' K; n1 d5 @/ B2 N
1 a8 c) x2 q, l! n( c
2 L# h) r% A' a( D; V' H# K: o, j) f+ g* }0 R/ z3 e$ \: S
/ l r! |9 o+ c2 E4 ?3 l% T
+ @) o) `$ g! N& E4 a- [; j T. h( R( G
14) 完成后,点击‘Run Connection Automation’,在弹出窗口中勾选所有端口,点击OK继续; 5 H- S7 c0 V+ Z7 Q* t6 Y7 O
# v7 I+ W e$ D! u% a+ v/ F
7 V" r. p' z# I F
8 u9 R, s6 k; j$ p) ]% X
R5 P3 L+ V# d( {
' y. m5 o& D2 X5 m
2 A. b+ y3 Y% b0 O+ A _$ D
1 R/ v5 d$ _& E- e# O, H6 U8 Z9 t0 i0 r0 S3 r: n. E
15) 完成后,点击按钮重新布局,完成后如下图所示: # x8 c& q; s; x
. w+ B5 D+ ^5 ?3 V& C1 a2 D
. l9 L M j- \" Y/ q( H- @$ I3 ?; v$ B6 H
* U3 s! c3 Y, e( ~6 l8 ]9 ?% g) q" C0 E
3 L. H+ n a; h6 l
0 q' \% I& s; ? S/ \% S1 \; m$ a b
! ~" k' q( e2 P- P/ P" Q
16) 点击按钮验证设计是否正确 17) 验证成功,设计与连线都正确,点击OK,Ctrl+S保存设计。
9 K8 t: z4 U4 x1 E' y
" P% J% [6 {' O
/ A( j9 G) `8 A
8 B5 t9 P9 i9 ]9 Q, b; Y& u x3 s3 W2 a/ V. _, G. ^
18) 在Sources窗格中鼠标右键‘MB_UART’,选择‘Create HDL Wrapper’。 8 J* N% Q7 e4 T7 { D6 s
- \; M" x2 J2 L) E$ l0 y
7 x4 {/ U9 L! ^5 [3 M
0 x+ z& f0 S2 m0 ^1 P
+ P5 _7 g- I9 W; X
19) 使用默认选项,点击OK继续,完成HDL文件的创建。
3 {0 q1 M! e) l6 ~; Q" V8 b2 `" D1 s8 \* z7 u
! k3 Z- {" ~: [7 J: R! ~9 L2 w% _+ z) I- Y" W. p+ V
20) 添加约束文件 a) 在Flow Navigator中,展开PROJECT MANAGER,点击‘Add Sources’。 6 N& t$ p/ `( ]8 n- k
b) 选择‘Add or create constraints’,点击Next继续。
& X0 A: A- L8 s- Z9 K7 B5 ?# u) Q2 ~0 w9 G; y2 E
) A7 Y: Q7 w# R& E* M8 A% j$ E2 k
( x* ? j, Q4 D
c) 选择‘Add Files’,找到并添加‘MB_Uart.xdc’文件。注意,要勾选Copy constraints files into project
# B. k% D F. [( m$ e(文件路径:\Basys3_workshop\sources\lab6\Src\Constraint)
! k5 @( R$ }1 k' v2 g& w
: P" b* |8 g$ J5 g# O
" T7 V N( G6 H' V- f/ Y. V3 y3. 综合、实现、生成比特流文件
5 Y& N% D3 l0 U7 D9 o( \; |1) 在Flow Navigator中展开PROGRAM AND DEBUG,点击Generate Bitstream。Vivado工具会提示没有已经实现的结果,点击‘Yes’,Vivado工具会依次执行综合、实现和生成比特流文件。 8 u, z1 h' I/ `1 K5 `& y0 I2 Y3 i
: r% I2 \# a" T+ K) \) W/ n
- E. U% M" s+ G2 z* v" w
6 k7 @& O& C l; i+ k
' Q3 R5 p, X& \* D: _二、基于Tcl脚本创建工程
$ M0 N x- ]& t1 p$ B6 E1. 打开Vivado 2017.2 2. 在底部Tcl命令框使用‘cd’命令,进入MB_Uart.tcl文件所在路径。参考路径:C:\Basys3_workshop\sources\lab6\Src\Tcl,在Tcl命令框输入:cd C:/Basys3_workshop/sources/lab6/Src/Tcl (注意:Vivado使用‘/’) 3. 在Tcl命令框中,输入命令:source ./ MB_Uart.tcl。输入完毕按回车,运行Tcl,等待Tcl进行创建、综合、实现,最后生成比特流文件。 4. 建立SDK应用工程
; K8 ?" c) ]5 C1 F% o" q' G# @1) 在顶部工具栏中,选择File>Export>Export Hardware导出硬件工程到Vivado SDK;
' u' p$ C9 D8 m- a* g
) X& ?$ |$ W% Z( Y2 x
: g1 Z, g3 m: j: o2) 在弹出窗口中勾选‘Include bitstream’,点击OK继续;
" ~: Q% g8 ?2 d* P8 Z6 A$ y& K/ d9 W: x) S+ n- y
* V" Q1 P8 p8 o. h8 a% i" i& V- d% t% ^# j
3) 在工具栏中,选择File>Launch SDK,使用默认工程,启动Vivado SDK; : D" ]: C' N0 v
y* _' o) a$ D$ _ S; C+ F; Y) d
" F p; `2 E% {7 _$ l5 r6 j4) 在SDK上方工具栏中,选择File>New>Application Project,新建一个SDK应用工程; 2 ]- y* Y5 ]9 |; G, p# y, c
m P4 A' p$ `0 t- \- W4 N/ Y0 E3 l1 T
5) 工程取名为‘helloworld’,点击Finish完成创建; 3 D$ }: w @8 U, a
' L! @& {6 k6 N; c) y
/ B+ w9 I$ ?) @( K" b: E
6) 可以看到 SDK 界面左侧如下,新增加了helloworld和helloworld_bsp两项。其中helloworld_bsp为helloworld应用工程的板级支持包: 8 b2 a" n; V. I7 z4 r# y5 r
, Z# Z# h7 L& \4 s; {! m
# s. l. c! Q: y
! T' s/ F$ g* a. k2 c- K, |" f
# t9 h u' ?' `% ~, T" R8 p* z
7) 双击helloworld下的src下的helloworld.c。这个文件为包含主函数的C语言文件,然后可以通过 CTRL+B 完成工程的 build;
" W5 u' X6 N+ q! E6 _' b% a
* I% Z% ]" T. k) r @& K- t2 x
8 n/ O. T9 }/ x: i8 b$ q( C8) 连接Basys3开发板,打开电源,点击SDK任务栏Xilinx Tools>Program FPGA; 7 t* g3 R2 i! `0 L/ s* k9 i+ s
( Z4 t4 r$ i1 ~1 z1 l4 _: u: ]
/ D; ]8 I3 Z) E+ x
& x) m6 H# L" e' E1 W$ G9 q! v2 t9) 在弹出窗口中点击Program完成比特流文件的下载:
9 ]& K! ]' _ j
I; O$ U, \" E
6 B$ M2 l8 Y! }/ b- l$ Y* Q# R1 G. k10) 连接Basys3的串口。选择SDK界面下方的Terminal窗口,点击下图的连接按钮:
8 C2 |- V9 E M$ v: k6 c# r
0 T+ }4 f2 N- P
) g! O7 ]& _5 q, l
% g" I+ O6 ^- S9 u( v6 M5 ~$ L7 r5 C0 e. E( a% F
11) 在弹出窗口中,将Connection Type设置为Serial,在Port一栏选择正确的串口,点击OK完成串口配置并连接; 2 [* s% a; I% p) T
" H* d( k2 p; \8 F" O
. n' O4 H) p3 b
+ t# V* G( ?( N12) 在SDK界面左侧Project Explorer中鼠标右击helloworld,选Run As>Launch on Hardware(GDB),运行SDK软件工程;
% U# r: S6 j8 R7 z1 o" P- u9 s
$ P, H: [3 O$ s1 \0 I I j
9 f* f7 I/ L% `! O0 @
13) 稍等几秒,可以看到Terminal界面出现了打印的‘Hello World’字样。
3 X4 S6 d* _3 K& l I* g2 p2 t. [; N- K+ _' d# I% K. j
* C. M5 H. N% I |