找回密码
 注册
关于网站域名变更的通知
查看: 460|回复: 1
打印 上一主题 下一主题

转——【小梅哥FPGA进阶教程】第十章 MC8051软核在FPGA上的使用 下

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-29 08:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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; M
2.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& p
2.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. 下载硬件设计到目标 FPGA。
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% C
2.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 \
程序清单 2.6 mc8051 IP核测试程序

- 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+ M
2.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# B
1 M5 \" y: z* u) J

. O0 J1 {* I+ x9 }! z  B
附录 A MC8051 指令表
# v- l0 x" i/ P! |# D3 k  z. X9 A
附表 1 MC8051 指令表

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-29 03:30 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表