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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Zedd 于 2019-3-30 15:57 编辑
1 a- s- n7 M) h/ d0 j; j
- N* F9 L+ K3 m$ u1 I
转——第十章 MC8051软核在FPGA上的使用 下
8 @6 P# E! W, Y, ^! n0 [
/ i: C7 |/ N* |( {
2.2 MC8051 core 的组装
# j! s" q2 F0 T( u6 ^  P+ {+ r4 ^到现在为止,MC8051核RTL级实现的所有模块都已经具备了,接下来就使用将这些模块组装到一起,得到一个含完整mc8051核的Quartus· II工程,在新建工程之前我们还要对一些 mc8051 core 的源文件进行更新修改,使之符合我们的设计。
* l! [( I/ k) o8 m& b/ y& x2.2.1 更新 mc8051 core 的顶层源文件# o1 D: I" U' d, [" B
由于默认提供的源码中的顶层设计文件中的存储模块(ROM、RAM)是仿真时使用的, 现在要进行硬件测试,所以必须改成我们实际用到的 ROM、RAM 模块(也就是前一节我们生成的 ROM、RAM 模块)。 - N  S  x- O' Q  G. b
(1) 首先在工程目录下新建一个 mc8051core 的文件夹,将 mc8051 core 的源代码文件(位于:\mc8051_Source\VHDL 目录)拷贝到 mc8051core 文件夹。 / B7 R) s  E) Z5 @
(2) 打开 mc8051_Source\VHDL 目录下的 mc8051_p.vhd 文件,将原文件中 ROM、RAM 模块调用的代码(如程序清单 2.1 所示)全部替换为符合本设计的程序代码(如程序清单 2.2 所示)。 " K* j* [2 ]5 w! P5 h3 t
程序清单 2.1 mc8051_p.vhd 文件代修改代码
/ R" n7 Q" x- ]; a5 P+ l" m+ R( b* o. S7 A. o' w7 E
7 j( \6 x" R, v* C
' G& v9 R1 R, H+ ~, {

; ^% T6 o$ |9 @4 L: m/ q: c- h4 u5 M# s9 b5 w; _
. V7 t/ }0 f5 @7 T2 ?
程序清单 2.2 mc8051_p.vhd 文件更新的源代码

6 l3 I/ b0 T6 F( y: g. s

" z; w6 d8 s7 W: {! _+ k, f) b

1 M' b+ C/ u9 ]  t
1 e8 B/ |! V3 k' \3 @* Y( C9 T+ a) ]
, u8 p, f0 v( n& `& n5 J
(3) 打开 mc8051core目录下的 mc8051_top_struc.vhd 文件,首先做如程序清单 2.3 所示修改,其中行末标注“--new”的行为新增加的内容。然后将原文件中 ROM、RAM 模块调用部分的代码修改成如程序清单 2.4 所示的代码。这样就完成了源文件更新修改。

. U* }) k9 {8 m& U, N
程序清单 2.3 mc8051_top_struc.vhd 文件新增的代码
4 R; [5 q( B4 G8 |$ J9 }4 u
( e; y$ r- K" R" \. \
/ Q/ y+ x  E: J" y/ ]" R

, j  m  y# y9 U* v9 J  a. l( n6 j& [/ f% K% k
6 I4 {) @) W. r/ N
其中,

1 S6 `) ~) F. \
8 z, K; y$ l' E5 Q3 N' A( {1 @1 p
- b; b- S% H4 P

6 @0 l6 W  z4 [; D: O& V/ d- E: D3 N- ~) R- H& P
, Z7 c# v+ _( y, n* Q1 |+ J
就是新增加的内容
! L8 b& q- ]+ e7 Z
程序清单 2.4 mc8051_top_struc.vhd 文件中更新的源代码

* j' H. H# r1 [4 F, v3 e
4 l6 H! Q6 W6 d

' h0 ?5 M3 ^2 G

9 Y* w# q# T6 i7 `0 l3 D. A1 l$ K  z2 {
( r+ Q9 O- @3 u/ Z5 M+ U! o* v& P/ b! v, _  B, t) Z4 c

& z5 x+ X. Z! ?" |7 D/ A
2.2.2 添加mc8051 Core相关文件到Quartus II工程中

6 Q( I7 H* D' n: k( V2 v7 E* |
在将mc8051的源码添加到Quartus II工程前,我们需要首先对部分文件的文件名进行更改。原版的VHDL源码,部分文件的文件名末尾加了有“_”,而实际源码中的模块名没有加“_”,因此,如果将这些文件直接添加到Quartus II工程中,编译就会报错,提示找不到模块。

$ W1 h0 ^2 C, y+ w4 H0 u

5 k1 h' k2 ^7 W3 m  {3 b3 X

# N8 S) t; c. j6 K

4 K* ]" E& ]& z& ?* j6 r

/ w9 G; w5 E( p- U# u: R! [+ C
, i. N4 o1 e0 O# z9 c3 h8 t5 `
因此我们首先将源码文件以“_”结尾的文件名中的“_”全部去掉,例如,将“addsub_core_.vhd”更改为“addsub_core.vhd”。当所有的文件名更改完成之后,方可添加这些文件到工程中。

/ d4 ?( G+ @" X
在Quartus II软件中,点击【Project】>>【Add/Remove Files in Project】,在弹出的对话框中,点击浏览文件符号,如图 2.21 所示:
4 t8 C- }9 k$ R! b' A3 ~
% L) F5 e* a/ I) o
1 g& [& I" Q7 ^4 J
图 2.21 添加文件按钮

1 L7 P& J0 t0 U9 Y$ j4 \选择mc8051core文件夹下的所有非配置文件(即以cfg结尾的文件不用选中),然后点击打开按钮,即可将文件添加到工程中来。如图 2.22 所示:
, Q9 J) [. f8 A- X1 l& }
: g2 |/ V8 [  R+ @# b6 c6 }
* Y7 i  J+ Q5 l9 q$ E
图 2.22 选择需要添加的文件
点“OK”完成文件的添加。  

3 W" n5 A5 p/ n% m
2.2.3设置工程顶层文件在Files栏中,选中mc8051_top.vhd文件,点击右键,选择“Set as Top-Level Entity”,即可将mc8051_top.vhd设置为工程的顶层文件,(这里设置为顶层主要是为了封装IP核方便,临时性的,并不是最终作为工程顶层)。如图 2.23 所示:

. C$ e  P' s9 f5 S/ A' ^. V$ ^/ P7 C- I
* Y8 k, }8 ]- g! P. D4 p$ B
图 2.23 选择需要添加的文件
2.2.4 综合工程文件

7 W* z# A6 s! P. X2 i* y
      (1) 综合工程

# o. w& i6 a( G6 ~! g& T3 {$ W4 g
在 Quartus II 软件的主界面,点击分析和综合按钮 (或者直接按键盘组合键ctrl+k),即可开始对工程进行分析和综合。这个过程大概需要几分钟到十几分钟,视软件版本和电脑配置,耗费时间有差异。

( j, d- |7 y! J: p) R& g
      (2) 查看RTL图
# c" l# ^4 O: X) t* @% d5 B, `
综合编译后我们需要检查顶层设计是否正确,这时可以通过 RTL 图来检查,双击RTL Viewer,如图2.24 所示
. H4 D0 j. _8 M2 y2 N& {3 J

0 G! G9 U! \3 d' K* [
+ j+ K% j" r, M3 e
0 T$ F& b0 h6 i+ m4 Y8 k
图 2.24 点击打开RTL Viewer
* b5 u3 ]8 m( W3 ]- J5 c. s
按钮可以打开 RTL 图,我们可以很清晰的看到 8051 core 的顶层结构图,如图 2.25所示。如果没问题我们就可以进行下一步的设计了。

9 f7 z1 u) M& k: q: Y$ J* s& M% z
( R; E* P' W6 U0 ?5 X- ^

& U! A* @4 X1 k. B6 [
图 2.25 mc8051 core RTL 图
$ g$ L( x6 J0 E, V" V* Y
2.3 MC8051 core 在 Quartus II 中的应用

% Y8 @8 B5 K4 W; M; \8 m0 q
在看这节内容之前建议大家先看一下 2.4 节,了解一下单片机的应用测试程序及测试流

0 _: Z2 ^2 A' D/ \/ c+ e5 s
程,因为这两部分内容是同时进行,密切关联。
( X# P4 `/ Y& v( `" ^. C
在这一节我们将对 2.1 节建立的 Quartus 工程做进一步的设计,并将 mc8051 core 应用

( o& \  v+ f) U0 x  N( ^  t! x
于设计中。同时对 Quartus 的简单应用做进一步的学习。具体包括以下内容:
' f6 b/ u$ o7 R  ~1 x8 H& e
      1. 建立 PLL 数字锁相环模块;
2 J+ T7 g" S: b# k
      2. mc8051 core 在 Quartus II 中的应用设计;
) Q5 I5 ?. ~, j3 F6 A9 h" ^9 g
      3. FPGA 参数设置;
, D" ?, z( L% E
      4. 下载硬件设计到目标 FPGA。

& V1 k! w7 p8 s9 ^8 b2 W
- t: V* _2 r8 A3 C! ?- C% T
7 `3 b1 m" f0 ^6 W8 w
2.3.1 建立 PLL 数字锁相环模块
1 ~+ K" C( s7 U
众所周知,单片机需要时钟信号才能运行,那怎样才能得到一个稳定而可靠的时钟源呢?我们的实验板上有一个 50MHz 的有源晶振,但对于 mc8051core 来说,频率比较高,需要分频,这时可以用 FPGA 自带的 PLL 调整时钟频率,PLL 输出的时钟频率、相位都可调而且精度很高,下面我们将介绍如何在 Quartus II 中调用 PLL 模块。

: B7 I; B0 z7 ~
(1) 打开我们在 2.1 节建立的 QuartusII 工程,从【Tool】>>【MegaWizard Plug-In Manager…】打开如图 2.13 所示的添加宏单元的向导。

, d+ d7 V6 V4 F& Q
(2) 在图 2.13 中按 进入向导第 2 页,按图 2.26 所示输入“pll”选择 ALTPLL,并选择器件类型及存放路径,注意标记部分。

# {) R4 P, S) Q

& |) b7 A* j' [3 t

% o& P* s& z0 L8 e8 @. Q) D
图 2.26 MegeWizard Plug-In Manager page2

/ b) y! G+ m( ^0 b& x& S) |9 P
(3) 在图 2.26 中按 进入向导第 3 页,按图 2.27 所示选择和设置,注意标记部分。由于电路板上的有源晶振频率为 50MHz,所以输入频率设为 50MHz。
. P# E0 `: b2 \
4 _- q  w; m' }8 [% S: e+ D( X

7 q4 ]5 r$ M2 L% M' P2 w
图 2.27 page3 设置输入时钟频率

" h6 ~( v6 s; O0 p7 O7 Z
(4) 在图 2.27 中按 进入向导第 4 页,在图 2.28 所示的窗口选择 PLL 的控制信号,如 PLL 使能控制“pllena”;异步复位“areset”;锁相输出“locked”等。这里我们不选任何控制信号。

( v" d3 e0 R/ J/ J7 {: b& |  o3 @# ]+ w. P

" D' E3 k8 z+ z6 s
图 2.28 page4 设置控制信号

) i% H8 z& I% m2 q3 a) g6 K- a
(5) 在图 2.28中按连续按下 直到进入向导第8页,按图2.30所示选择c0输出频率为18MHz,时钟相移和占空比不改变。
2 M2 X! T: {. {
6 c; d# J3 H& X
: O& k9 I& n0 N% W% _* {# w
图 2.29 page8 设置时钟输出频率
3 o# T  T% E. p
(6) 在图 2.29 中按 进入向导第 9 页 c1 的设置界面,由于c1以及后续其他输出都不再使用,因此,这里可以直接跳过其他所有输出的配置,直到最后按 完成 PLL 兆功能模块的定制。
) ?1 ]9 Z, F2 X. S& o$ [7 d0 r( S
在完成定制 PLL 后,在 Quartus II工程文件夹中将产生 pll.bsf文件和 pll.v 的Verilog HDL源文件。

( l5 P- `( O+ ~, [
2.3.2 建立MC8051应用工程,
  c; e6 w+ x% ]3 J, Z# n, T% z
这一小节将讲述如何使用以上移植的mc8051的核建立一个实际的Quartus II 工程并能够在芯航线FPGA学习套件的主板上运行。 具体步骤如下:
+ |( f& y! b9 h* L% b! W
; w" X" ?" f5 J9 `

. F4 h9 {! R- K
      (1) 在工程顶层中例化mc8051核
0 K: v. n2 }6 {% F, \+ K. H
      (2) 在工程顶层中例化pll" u' J/ b  g9 e, f$ S
      (3) 对工程进行分析和综合
6 S3 u7 ?/ O; W2 L# R
      (4) 分配引脚
0 A8 \5 E3 x+ A, W" ]
      (5) 编译并生成FPGA配置文件 3 U2 l; J' v0 I& u) `) j
      (6) 使用USB Blaster配置FPGA
& F+ L7 p, l" P/ N, r1 S7 Y% ^7 a

& m& W- l, g- h8 n8 F1 O# j

3 H  s3 w# i, w2 d. F6 b
打开之前建立的Quartus II工程,打开mc8051_test.v文件,首先编写模块的端口,这个模块的端口也是工程最终的对外引脚,这里直接设置模块端口为mc8051的IO。 如程序清单2.5的第1行至第23行所示。
& L6 r  n' w' P4 l
接着在工程中例化mc8051核,这里就是例化mc8051_top。Quartus II中,可以直接在Verilog文件中例化使用VHDL编写的模块,因此这里直接按照Verilog的格式例化mc8051_top即可,如程序清单2.5的第33行至第56行所示。注意,mc8051核的复位端口是高电平复位,而我们开发板上是将复位信号接到了轻触按键上,轻触按键在没有被按下时,输出的是高电平,因此该信号不能直接接到mc8051的复位输入端,需要先将其取反,因此直接在例化时将Rst_n取反后连接到mc8051的reset端即可(第36行)。
$ R/ J/ m# G+ s0 \. d% W
然后在工程中例化pll核,例化pll的代码如程序清单2.5的第27行至第31行所示,pll的时钟输入端连接到芯片的时钟输入信号Clk50M上,c0输出为18M,连接到mc8051的时钟输入端口clk上。
4 P. g. d; ?/ B: M9 n0 q4 V# X
: j# A) S1 U" I2 r& e3 y6 X
程序清单 2.5 mc8051_test.v 文件的源代码

/ _9 x# [" A* v$ D* a) ?
5 e9 U5 ]0 P1 x; U* E

: I1 r4 X% E- ?; e

6 j% l+ V3 F; J" F- u
0 o0 N: i# P2 _5 R) E& X- p( K6 q6 x; L/ ^9 g; I" d+ N0 T
2 s& U" z6 A2 y0 ]1 I2 h2 g+ q
接着我们将mc8051_test.v文件设置为工程顶层,然后点击分析和综合按钮(或者按下键盘组合键ctrl+k)来对工程进行分析和综合。
' Q* m0 G/ j' R% R2 E
分析和综合完成后,我们打开Pin planner,进行引脚的锁定。依次点击【Assignments】>>【Pin Planner】,如图 2.30所示:
9 J  q9 R) I' p- s& v5 ~# J- n7 f

$ y; u8 J8 W$ Y' X" y

1 c2 y( g7 C8 y
图 2.30 打开引脚分配卡

/ x2 u  l7 a0 H# _* R% V
这里,我们只需要分配我们使用到的部分外设,没有使用到的暂不做引脚分配。本例中,我们将在Keil中编写软件代码测试mc8051的定时器、串口和P1口。我们使用开发板上板载的4个led灯进行测试P1口P1_o[0:3]的测试。因此我们需要分配引脚的端口有P1_o[0:3],all_rxd_i,all_txd_o,Clk50M以及Rst_n。其他没有使用的端口暂不分配引脚。引脚分配表如下所示:
% y3 h7 D4 n& \

% j8 L; K$ l* P' Y% G& K2 X

  `: O9 O4 u) F8 s4 E0 b  q( A2 S9 P; }$ ?( f8 a9 Y3 R
将以上引脚对应分配给相应的信号即可。分配结果如图 2.31所示:

* a( B. S; k* l! b# [& \; K* W& {2 x
& ?/ \, ]: V3 c( ]: ^: w
  J# d" @1 l- e' x& _. h
图 2.31 引脚分配结果

& C# z2 L& E2 g* l: A# }. E+ }
引脚分配完毕后,关闭Pin Planner,点击Start Compilation(或者键盘组合键ctrl+L)·来对工程进行全编译并生成FPGA配置文件(.sof)。

! _2 v9 c! o+ Y7 R( O
编译完毕后,使用USB Mini线连接芯航线FPGA开发板,连接上USB Blaster,然后打开Programmer,在Hardware Setup中选择USB Blaster。添加mc8051_test.sof文件,然后点击start即可将生成的配置文件下载到FPGA芯片中。如图 2.32所示:
8 f& X( S% ]8 E- b
/ C# [# V- U; i7 R8 [
8 W" D, e6 V2 f2 I7 z7 U3 L* a
图 2.32 引脚分配结果
+ q7 R7 @+ \" k- F2 B5 h2 _; X
2.4 测试 MC8051 的 I/O、UART 和定时器功能2 y% w$ q4 q. a3 |1 X
在这一节中我们将通过一个简单的流水灯、UART 程序验证我们的 mc8051 core。

/ E2 F2 d9 ~& j+ o( F1 T
2 n' F: D& Q" Z( m
9 m3 C2 |: e3 h0 J
2.4.1 Keil C 测试程序
; D% I* z: |! I6 _% H0 R( ]# i
我们的 mc8051 core 已经建立起来了,现在需要一个程序进行硬件测试,这里的程序
$ i; g# C# ?9 J, q
是指普通的 51 程序,可以用 Keil C 或其它工具来编译我们写的测试程序,并生成.HEX 文件具体的操作过程就不用做介绍了。
+ H# i& G# G3 p7 f: h$ ~% E
如程序清单 2.6 所示是一个简单的测试程序,用于测试 I/O、定时器和 UART。定时器 0 用来做流水灯控制,从 P1 口输出;串口波特率(9600b/s)由定时器 1 决定 。

9 l# ^5 C3 f# c8 y
% r" {+ e" H- W# x( D
程序清单 2.6 mc8051 IP核测试程序

3 [4 _5 w! T4 D

: Z- d% |* I. |6 j& P( D- Y" e
, W6 s3 o& _) C7 W$ `4 t8 o

) s9 U" v4 m! h" w
0 f! t1 P" a' E& b
# }7 d; n3 |/ V5 F
! ^7 y- G4 b& B
% F" a- N6 |/ D7 l8 ~
' P+ Q/ Q; m+ t7 W- b5 q2 G
2.4.2 测试步骤
7 Z; }9 e; b7 v3 Q9 C
将程序清单 2.6 的程序进行编译并生成.hex 文件,为了方便大家测试,我们提供了一个创建好的Keil工程,在“mc8051_test\Cproject\uart_led”目录下,使用Keil C51 v4打开。

% \2 ^8 y1 z6 S
在Quartus II软件中,依次选择【Tools】>>【In-System Memory Content Editor】,打开In-System Memory Content Editor工具,右侧选择Hardware为USB-Blaster [USB-0],如图 2.33所示:

2 a% b) F- Z# W* }4 a; `3 m5 A! j
9 v! T/ d5 K. J" n$ R) y
图 2.33 选择下载器

" W, ?- s) v. {7 u$ M
然后工具会自动搜索到器件和器件中存在的支持该工具的节点,搜索完成后整个工具界面如图 2.34所示:

  A! d% i% T7 n+ {/ x6 N4 X+ {2 H( Z9 a* {' N6 J8 J2 @( V

- Q, ^, c$ M: C1 Z. C
图 2.34 In-System Memory Content Editor界面
5 @8 ^1 V9 O) o  x
鼠标选中ROM0(这里是我在配置ROM核的时候修改的索引名,如果你在配置的时候忘了修改索引名,则这里默认显示的名字应该是NONE),点击右键,选择Import Data From File。定位到C工程目录下,我这里为:E:\CoreCourse_fpga\mc8051_test\Cproject\uart_led,选择uart_led_test.hex文件并打开。这时候我们可以看到,工具下方已经有数据了,我们点击下传按钮以将数据传输进FPGA中的ROM中。如图 2.35所示:

0 _5 G6 L  C# @/ G- }. o4 ]  K
: o0 I. E) S9 f# O- g

" _" w6 Y8 v" K  \9 O
图 2.35 下载程序到mc8051的ROM中

! x  \! d3 ]- I' [
然后,我们打开电脑上的串口调试工具(任意一个你熟悉的就行),我这里使用友善串口调试助手,选择板子端口对应串口,设置波特率为9600,数据位为8位,无校验位,1位停止位,接收格式为ASCII。然后点击打开串口,则可以看到串口接收窗口中接收到了开发板传输过来的数据。同时板子开发板上的4个LED灯循环依次点亮。如图 2.36所示:
, |1 B5 x6 C1 m, s
, r9 {4 Z5 E, X9 d4 a1 H4 m

3 W/ c+ e) D) l0 T- f6 a! s  Q
图 2.36 串口接收的数据

0 l  W/ y" z- e2 ]' o" F" x6 X$ B
当我们的程序调试无误后需要固定到芯片中永久使用时,就将编译好的hex文件名称修改为mcu_test.hex,替换工程目录下原有的mcu_test.hex文件,然后重新编译文件,然后配置FPGA即可。
# A3 d; y9 z5 F$ S& K) v1 U9 ^  P
  }  m+ L. [0 y, V
! d) m- n: l& A1 e2 ~8 R9 _2 ?2 j
小梅哥
2016年2月26日星期五
芯航线电子工作室
* y- b1 j1 ?) @, Y) R

- v2 [/ X8 y  ?3 t; _' U
5 k6 @$ N5 b" p- a
2 F- R9 `5 b, p& j0 C
. t" u" q' N; L$ ~) j1 s" o' f
- [/ M5 [' S4 \( ^
附录 A MC8051 指令表
1 R2 F/ P( z7 M, u7 E3 m, J# B
附表 1 MC8051 指令表

/ Z! B% m  K$ O. ]* X

9 u& `7 y- B3 @6 G& O
0 O( g% x( X0 V. b# S0 S

8 ~9 b, \) }8 I0 S# ~8 |3 ~. E

, E) H3 O' F* V( g
; ^" \! e' o4 {! l4 S, N$ B; T4 I
' U. _) l. q3 A$ r! f! v

8 a' [% l% W7 h% k& Q

6 g9 x& [0 [* |) |. m" I8 U

3 O- U3 j' v) o, C3 k
游客,如果您要查看本帖隐藏内容请回复

% e/ j0 T* \- I6 t% ?8 m
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 22:59 , Processed in 0.187500 second(s), 26 queries , Gzip On.

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

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

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