|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2019-3-30 15:57 编辑
- l' H- Y+ [/ D5 }
4 [2 Y9 n! j* k, x# Z转——第十章 MC8051软核在FPGA上的使用 下
( D3 y. _5 ]6 t9 y$ ^
4 X' V7 i) d% c; W9 k5 j: k/ f' U2.2 MC8051 core 的组装: U3 F4 ?; G% k& `$ h
到现在为止,MC8051核RTL级实现的所有模块都已经具备了,接下来就使用将这些模块组装到一起,得到一个含完整mc8051核的Quartus· II工程,在新建工程之前我们还要对一些 mc8051 core 的源文件进行更新修改,使之符合我们的设计。 . O' t$ H2 b) N2 d2 _
2.2.1 更新 mc8051 core 的顶层源文件
9 ^1 n8 H. ]1 ` D2 o由于默认提供的源码中的顶层设计文件中的存储模块(ROM、RAM)是仿真时使用的, 现在要进行硬件测试,所以必须改成我们实际用到的 ROM、RAM 模块(也就是前一节我们生成的 ROM、RAM 模块)。
: ^+ }) k& B* q* i(1) 首先在工程目录下新建一个 mc8051core 的文件夹,将 mc8051 core 的源代码文件(位于:\mc8051_Source\VHDL 目录)拷贝到 mc8051core 文件夹。
' |9 B3 N) Q% c( g+ ?' Z, F(2) 打开 mc8051_Source\VHDL 目录下的 mc8051_p.vhd 文件,将原文件中 ROM、RAM 模块调用的代码(如程序清单 2.1 所示)全部替换为符合本设计的程序代码(如程序清单 2.2 所示)。 9 ^. W- P& Q/ z K+ X6 [
程序清单 2.1 mc8051_p.vhd 文件代修改代码 ( T' A" Z* K+ ?8 S3 h c
4 r0 G. o+ U# g6 u& U9 X / D$ D* _4 |0 c7 i+ I
' D% }* \; k" K: s
+ o) X% n0 Y% n
& c u4 t0 P$ w3 |, I4 h& I6 Z( w( g. l
程序清单 2.2 mc8051_p.vhd 文件更新的源代码 3 \+ ^4 R& _1 p: r/ j8 w( H* k6 j
( Q/ e9 p' f2 L/ K# g8 W 5 B; s# i1 f1 L, t. H
, S. U- F* T# ~
/ K: ~8 J2 w1 r' j" s: X6 b7 I5 H0 F0 E
(3) 打开 mc8051core目录下的 mc8051_top_struc.vhd 文件,首先做如程序清单 2.3 所示修改,其中行末标注“--new”的行为新增加的内容。然后将原文件中 ROM、RAM 模块调用部分的代码修改成如程序清单 2.4 所示的代码。这样就完成了源文件更新修改。
% Q, M' ?2 ^$ K" S k程序清单 2.3 mc8051_top_struc.vhd 文件新增的代码 # j& q% q% [# \$ g5 T3 ~2 T
. R2 M4 i0 Q7 }
2 {* g3 u% J) ]; e2 k% w3 f/ i" p e8 T" U3 f+ D
7 L1 h0 [) i8 w: t3 ?9 U( M" [- s/ A! K8 @4 Y
其中,
0 r5 J# i* a8 A, H4 g7 k
' ]8 e1 ^6 _5 n- i: ]
2 C& U! [5 Y W和
0 R9 x, l( | i; z {; n3 [ k' H* n0 u
3 A5 k5 O* L7 C6 ^9 N8 K
就是新增加的内容
# B" X% T P: I) j# {. M# f: b程序清单 2.4 mc8051_top_struc.vhd 文件中更新的源代码 % k6 x6 y2 M8 @5 h$ G! E
* j6 N( d0 h# t3 z
6 z" s2 y1 J* f
3 k" ~7 s+ B( L( ]: ?& X3 J* \: M- b$ q+ \! R
3 q6 @# n" l* U9 H0 h, ^+ _% L6 k! s) E Y
2.2.2 添加mc8051 Core相关文件到Quartus II工程中 0 G7 S+ K1 }# e
在将mc8051的源码添加到Quartus II工程前,我们需要首先对部分文件的文件名进行更改。原版的VHDL源码,部分文件的文件名末尾加了有“_”,而实际源码中的模块名没有加“_”,因此,如果将这些文件直接添加到Quartus II工程中,编译就会报错,提示找不到模块。
{; p& y1 C# n6 T [4 A. L+ w+ w) T' I4 U. V+ Q2 N4 x
4 M9 U1 L, V+ N \5 m/ T& m; ^+ z! g- b. G: X6 v; R7 L
' [3 F( h: t6 P g# \
8 M4 D% S, ?) i# Z4 ?- p8 `. ^ _因此我们首先将源码文件以“_”结尾的文件名中的“_”全部去掉,例如,将“addsub_core_.vhd”更改为“addsub_core.vhd”。当所有的文件名更改完成之后,方可添加这些文件到工程中。 9 z, c5 e/ c( r0 `+ K Q& _; y% L* @
在Quartus II软件中,点击【Project】>>【Add/Remove Files in Project】,在弹出的对话框中,点击浏览文件符号,如图 2.21 所示: ) w5 ~* L# H; X& c+ m# y5 t( [
% [7 k9 X# ^ { 8 h, [2 j0 B* |4 i& i; P |6 ]) m
图 2.21 添加文件按钮
7 \9 U! a/ ~: C" b5 X选择mc8051core文件夹下的所有非配置文件(即以cfg结尾的文件不用选中),然后点击打开按钮,即可将文件添加到工程中来。如图 2.22 所示:
+ V6 \" q% H: y. h6 B/ Z" J6 D6 {# h* v
, o0 j$ t0 `' L3 p& u$ R
图 2.22 选择需要添加的文件 点“OK”完成文件的添加。
0 T# ?9 m8 G: I; M2.2.3设置工程顶层文件在Files栏中,选中mc8051_top.vhd文件,点击右键,选择“Set as Top-Level Entity”,即可将mc8051_top.vhd设置为工程的顶层文件,(这里设置为顶层主要是为了封装IP核方便,临时性的,并不是最终作为工程顶层)。如图 2.23 所示:
' |5 a+ p7 N0 X( r* \: y' t( N% `3 f1 N1 F
- A5 Y9 \! q) G I) t图 2.23 选择需要添加的文件 2.2.4 综合工程文件 1 V/ y# b" {! D1 R
(1) 综合工程
T' N" P+ w6 c+ K3 x: J8 r在 Quartus II 软件的主界面,点击分析和综合按钮 (或者直接按键盘组合键ctrl+k),即可开始对工程进行分析和综合。这个过程大概需要几分钟到十几分钟,视软件版本和电脑配置,耗费时间有差异。
, t) y% H9 U% q+ G* u N4 ?! k (2) 查看RTL图 ) X# Q& {# o5 T7 ]
综合编译后我们需要检查顶层设计是否正确,这时可以通过 RTL 图来检查,双击RTL Viewer,如图2.24 所示
0 M% D; Y3 {9 {7 r9 `: K& v. t
6 s# G W, P% ?$ i$ x 3 ~+ i6 Q- F5 P3 c m# F
- R/ o& @1 W/ n) l4 Z图 2.24 点击打开RTL Viewer ( C$ ^9 Z( u+ |
按钮可以打开 RTL 图,我们可以很清晰的看到 8051 core 的顶层结构图,如图 2.25所示。如果没问题我们就可以进行下一步的设计了。
# \1 E8 G9 X- Z) o' k% j/ N- n4 c z% Z. u# g3 Y X q
6 H! Y$ X, q" Z6 S& a+ }
图 2.25 mc8051 core RTL 图
3 T5 ]9 a, S) e* ?& q, P, l& p2.3 MC8051 core 在 Quartus II 中的应用
: e! q6 N$ d5 W6 j0 K在看这节内容之前建议大家先看一下 2.4 节,了解一下单片机的应用测试程序及测试流
2 W$ L/ ~) S3 c4 {: m程,因为这两部分内容是同时进行,密切关联。
9 t$ b7 |, f0 e* Z% ?, @在这一节我们将对 2.1 节建立的 Quartus 工程做进一步的设计,并将 mc8051 core 应用 w2 C W& O- K/ ^, ^2 x; r
于设计中。同时对 Quartus 的简单应用做进一步的学习。具体包括以下内容: + C0 X: i% ~- r
1. 建立 PLL 数字锁相环模块;
2 z* b6 U! n0 } @" q) ~8 k 2. mc8051 core 在 Quartus II 中的应用设计;
* \! Y+ q B! `9 f" R 3. FPGA 参数设置;7 C% w: v2 ~5 ~8 q9 ^; ]; ] s
4 ]0 L+ f( m2 S7 ^" X1 ~0 d: I* z
3 [4 I ~" D9 ^
0 M5 {8 F7 H1 q5 O% {2 A! B 2.3.1 建立 PLL 数字锁相环模块
1 V4 c& J& X# h; i众所周知,单片机需要时钟信号才能运行,那怎样才能得到一个稳定而可靠的时钟源呢?我们的实验板上有一个 50MHz 的有源晶振,但对于 mc8051core 来说,频率比较高,需要分频,这时可以用 FPGA 自带的 PLL 调整时钟频率,PLL 输出的时钟频率、相位都可调而且精度很高,下面我们将介绍如何在 Quartus II 中调用 PLL 模块。
+ d5 v# E* T: ]/ V2 q% v3 Y(1) 打开我们在 2.1 节建立的 QuartusII 工程,从【Tool】>>【MegaWizard Plug-In Manager…】打开如图 2.13 所示的添加宏单元的向导。
4 ^, c5 D; F# F1 l I(2) 在图 2.13 中按 进入向导第 2 页,按图 2.26 所示输入“pll”选择 ALTPLL,并选择器件类型及存放路径,注意标记部分。 ! e) s) ?8 B2 X
! P$ Z: G; m) Z$ c2 w
. A/ j$ P7 L9 \& h5 F$ [8 O- P图 2.26 MegeWizard Plug-In Manager page2
* b' F% A7 ^, H4 u" j(3) 在图 2.26 中按 进入向导第 3 页,按图 2.27 所示选择和设置,注意标记部分。由于电路板上的有源晶振频率为 50MHz,所以输入频率设为 50MHz。
) Y- F1 N- F$ \. J8 N1 k4 h$ G
* R2 Z* z# N) Z& y/ W0 p# L! u
图 2.27 page3 设置输入时钟频率
1 o2 y; R3 ]+ g* f, j! f. K* K" Z& H(4) 在图 2.27 中按 进入向导第 4 页,在图 2.28 所示的窗口选择 PLL 的控制信号,如 PLL 使能控制“pllena”;异步复位“areset”;锁相输出“locked”等。这里我们不选任何控制信号。 $ m& T3 a) c) E) c8 o
, n2 P2 M U4 `! T" f: l; d( @
6 U% c! [- H9 s0 t+ W图 2.28 page4 设置控制信号
. l L: C. R3 e, @(5) 在图 2.28中按连续按下 直到进入向导第8页,按图2.30所示选择c0输出频率为18MHz,时钟相移和占空比不改变。
5 R" h, {7 y- q. S
( B1 M, d% N; i% ]& Q, ^ + D. ?) m/ h7 I- o
图 2.29 page8 设置时钟输出频率
; S# S. H0 f1 y, Y- F* J5 j0 u(6) 在图 2.29 中按 进入向导第 9 页 c1 的设置界面,由于c1以及后续其他输出都不再使用,因此,这里可以直接跳过其他所有输出的配置,直到最后按 完成 PLL 兆功能模块的定制。 8 F" N& V3 V* C3 |1 I3 w& e8 a
在完成定制 PLL 后,在 Quartus II工程文件夹中将产生 pll.bsf文件和 pll.v 的Verilog HDL源文件。
7 u- s8 v: o% C2.3.2 建立MC8051应用工程, - `+ H2 f8 R& s5 R) l
这一小节将讲述如何使用以上移植的mc8051的核建立一个实际的Quartus II 工程并能够在芯航线FPGA学习套件的主板上运行。 具体步骤如下:
, Z% O2 F2 @4 i1 l% D! q4 T" E) b" _) Y5 v4 O/ n
6 r# `+ Y" x+ F# z& N" u K (1) 在工程顶层中例化mc8051核 H* E, @4 M* r* U
(2) 在工程顶层中例化pll
# F1 O, K: G; E3 j: h- b* P6 v (3) 对工程进行分析和综合 n7 D7 O" D/ G8 M7 t! j8 }
(4) 分配引脚
X* }: w5 N6 Z, @% I (5) 编译并生成FPGA配置文件
% c- b& C5 M+ Z* O (6) 使用USB Blaster配置FPGA & g/ ]' S" c, y3 b
, |' g2 l# _$ |4 C7 [" [8 X
8 m/ I+ x `, L; f7 R% _; T
打开之前建立的Quartus II工程,打开mc8051_test.v文件,首先编写模块的端口,这个模块的端口也是工程最终的对外引脚,这里直接设置模块端口为mc8051的IO。 如程序清单2.5的第1行至第23行所示。 6 G9 n/ k) a9 x4 \3 l! e0 d
接着在工程中例化mc8051核,这里就是例化mc8051_top。Quartus II中,可以直接在Verilog文件中例化使用VHDL编写的模块,因此这里直接按照Verilog的格式例化mc8051_top即可,如程序清单2.5的第33行至第56行所示。注意,mc8051核的复位端口是高电平复位,而我们开发板上是将复位信号接到了轻触按键上,轻触按键在没有被按下时,输出的是高电平,因此该信号不能直接接到mc8051的复位输入端,需要先将其取反,因此直接在例化时将Rst_n取反后连接到mc8051的reset端即可(第36行)。
. g; n5 l# F3 u2 [9 x然后在工程中例化pll核,例化pll的代码如程序清单2.5的第27行至第31行所示,pll的时钟输入端连接到芯片的时钟输入信号Clk50M上,c0输出为18M,连接到mc8051的时钟输入端口clk上。 ; N5 E' T6 ^+ h* M) C3 L0 K
* H! W7 a+ H/ w* c9 @% }
程序清单 2.5 mc8051_test.v 文件的源代码 ) I" l& v8 t, @6 N
/ H2 ], w' U" C8 v9 {
1 f$ y2 F9 g4 c! u0 E9 i( {( x! v6 T3 [
$ l8 A6 _3 u. s( C7 a7 x+ {: O8 }! N' X J1 Q$ H& y0 Q+ J
! Q& e: `% u) j( c7 s, l% b$ t9 d0 M V) {* L& z
接着我们将mc8051_test.v文件设置为工程顶层,然后点击分析和综合按钮(或者按下键盘组合键ctrl+k)来对工程进行分析和综合。 / B _1 H8 v' J1 T3 H
分析和综合完成后,我们打开Pin planner,进行引脚的锁定。依次点击【Assignments】>>【Pin Planner】,如图 2.30所示:
9 ?( m9 ~) Q& h8 J+ [& T
+ h, J0 V( F- U' Y) \4 M # S$ Z$ \3 w6 J5 Q* X
图 2.30 打开引脚分配卡
& Z2 S. q( `2 n% W7 m; L: l2 V这里,我们只需要分配我们使用到的部分外设,没有使用到的暂不做引脚分配。本例中,我们将在Keil中编写软件代码测试mc8051的定时器、串口和P1口。我们使用开发板上板载的4个led灯进行测试P1口P1_o[0:3]的测试。因此我们需要分配引脚的端口有P1_o[0:3],all_rxd_i,all_txd_o,Clk50M以及Rst_n。其他没有使用的端口暂不分配引脚。引脚分配表如下所示:
" u4 d- r# o2 {" n8 B) T1 Z( Y. b& ]6 M/ R( n$ v* e. _
3 f$ g' A! `( g; W+ x5 l4 X' y5 I! [ w i4 D9 u
将以上引脚对应分配给相应的信号即可。分配结果如图 2.31所示:
# M6 ]" {: ^: X' z% G% U8 |& z0 P0 H2 E! m ]" P. r6 y" V* T) s+ M
- @2 t5 k5 A v) M, o" t5 ?
图 2.31 引脚分配结果 " r2 M3 O! m* D9 u) r
引脚分配完毕后,关闭Pin Planner,点击Start Compilation(或者键盘组合键ctrl+L)·来对工程进行全编译并生成FPGA配置文件(.sof)。
/ |2 m5 L% Q, L& R. f编译完毕后,使用USB Mini线连接芯航线FPGA开发板,连接上USB Blaster,然后打开Programmer,在Hardware Setup中选择USB Blaster。添加mc8051_test.sof文件,然后点击start即可将生成的配置文件下载到FPGA芯片中。如图 2.32所示: 0 j b4 t) E$ i }! j% z5 x
. @# G5 v% y$ ?$ _$ E
! {, [/ h @, C/ j7 r/ M, C
图 2.32 引脚分配结果
( F8 B* ^ p0 w7 x/ a K0 G2.4 测试 MC8051 的 I/O、UART 和定时器功能
, _% W- p6 q \; X! D8 l在这一节中我们将通过一个简单的流水灯、UART 程序验证我们的 mc8051 core。
; r# u9 L" m/ c6 ]6 L( ]- l1 ~( y$ q. U5 a) O- m2 F0 _* o7 \# J
5 X3 ?7 \5 b# N! h9 Q# H, k
2.4.1 Keil C 测试程序 + x6 m8 |0 V- l8 y: H8 ~ c( t
我们的 mc8051 core 已经建立起来了,现在需要一个程序进行硬件测试,这里的程序
4 `; H0 u* K' p是指普通的 51 程序,可以用 Keil C 或其它工具来编译我们写的测试程序,并生成.HEX 文件具体的操作过程就不用做介绍了。
' R7 y( A( {0 i- p) { _* t如程序清单 2.6 所示是一个简单的测试程序,用于测试 I/O、定时器和 UART。定时器 0 用来做流水灯控制,从 P1 口输出;串口波特率(9600b/s)由定时器 1 决定 。
: s1 P- ]2 T2 l( B8 K
1 M1 N% l2 I& ^. E4 \
- d8 Q: J2 {& ]" C9 a 3 r' c! K3 N2 W, y" u
- {- e3 ^6 C" F5 u+ p
x9 T0 X% s4 J1 G: [2 i* k
3 E% X. g+ I/ s7 J$ }9 H
6 v9 Y% H5 s+ ] u
: C6 o- p: y! b& A9 z7 @* D
* l3 A1 w( [' ^5 t" s# M7 R
; k w1 \& v# t9 @9 V+ M2.4.2 测试步骤 : D6 [6 G6 _; U- Z/ \
将程序清单 2.6 的程序进行编译并生成.hex 文件,为了方便大家测试,我们提供了一个创建好的Keil工程,在“mc8051_test\Cproject\uart_led”目录下,使用Keil C51 v4打开。 e. X' ] e4 }; }6 j% g
在Quartus II软件中,依次选择【Tools】>>【In-System Memory Content Editor】,打开In-System Memory Content Editor工具,右侧选择Hardware为USB-Blaster [USB-0],如图 2.33所示: 6 F# {* x; x; c$ T8 u! a
$ R9 V6 l9 c% l% U% R
图 2.33 选择下载器
9 H6 e0 I( A5 W9 L+ ]: {8 M: s然后工具会自动搜索到器件和器件中存在的支持该工具的节点,搜索完成后整个工具界面如图 2.34所示: V4 Q/ M ]. w4 H0 C/ j7 Y: r6 `
0 l- L+ @; ^! | W7 g- b$ y
% Z B3 z9 G& H! z) L! |图 2.34 In-System Memory Content Editor界面
* t; q8 Q3 s2 `, }) z" P鼠标选中ROM0(这里是我在配置ROM核的时候修改的索引名,如果你在配置的时候忘了修改索引名,则这里默认显示的名字应该是NONE),点击右键,选择Import Data From File。定位到C工程目录下,我这里为:E:\CoreCourse_fpga\mc8051_test\Cproject\uart_led,选择uart_led_test.hex文件并打开。这时候我们可以看到,工具下方已经有数据了,我们点击 下传按钮以将数据传输进FPGA中的ROM中。如图 2.35所示:
5 P* w& c5 p" g* v) l+ t1 f' M+ f8 ?2 `* B# k$ I" C% S, X
- {2 T4 d) ?9 L
图 2.35 下载程序到mc8051的ROM中 & Q: b8 x. W) E+ c. V$ x$ P
然后,我们打开电脑上的串口调试工具(任意一个你熟悉的就行),我这里使用友善串口调试助手,选择板子端口对应串口,设置波特率为9600,数据位为8位,无校验位,1位停止位,接收格式为ASCII。然后点击打开串口,则可以看到串口接收窗口中接收到了开发板传输过来的数据。同时板子开发板上的4个LED灯循环依次点亮。如图 2.36所示:
; W" ^1 t( [+ b3 }& ]6 k. @
, o' `; Z! E8 R, d
- r" E8 Q6 i" p: c5 ^* V4 U o图 2.36 串口接收的数据 ' f0 `+ G2 X8 A0 r2 Q
当我们的程序调试无误后需要固定到芯片中永久使用时,就将编译好的hex文件名称修改为mcu_test.hex,替换工程目录下原有的mcu_test.hex文件,然后重新编译文件,然后配置FPGA即可。 . U4 }$ M8 e4 n9 i
! `# L+ X! y* | X+ v4 k: \2 i9 F2 ~7 Q- Y* n" s; M
小梅哥 2016年2月26日星期五 芯航线电子工作室
! B3 x7 U+ ?% A: y+ t* |
# O* M8 w; [* E5 J2 w- \. {, q* ~+ z' t+ c
4 ?9 @4 z' T7 f V( u# B1 M5 \" y: z* u) J
. O0 J1 {* I+ x9 }! z B附录 A MC8051 指令表 # v- l0 x" i/ P! |# D3 k z. X9 A
![]()
7 h a, t4 W- `0 y / w9 [3 C% R) j+ K( ?
! p% J; R6 O$ |
4 [* \3 g1 f Q
5 m# X R! s5 c* A$ O8 N, S( m- X9 P ) ~ ^, B: r3 Y# \8 c/ A1 S
% w3 d/ @+ S! ?; ^
8 m4 S: H& h3 G/ Y- Y6 M
: r1 F; ]' z. g8 V | - Z5 |7 ?9 w6 @$ H7 Z* R+ Z
) V" v5 Z8 W b; J# d; ?& |7 {, U
|
|