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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Zedd 于 2019-3-30 15:57 编辑 / q" x. z1 X; ]4 x, ]# V  t
6 A2 x7 D2 g/ e# T6 w. O: J' C
转——第十章 MC8051软核在FPGA上的使用 下
! F6 W  s5 h! c' O0 i3 W

% M9 K: Z3 K+ }3 K% q; ^2.2 MC8051 core 的组装
" l0 h# w$ [. E9 x4 j( c到现在为止,MC8051核RTL级实现的所有模块都已经具备了,接下来就使用将这些模块组装到一起,得到一个含完整mc8051核的Quartus· II工程,在新建工程之前我们还要对一些 mc8051 core 的源文件进行更新修改,使之符合我们的设计。
: A9 Z/ i" N8 }5 L# C2.2.1 更新 mc8051 core 的顶层源文件& j% }$ P) F! c9 r8 [. w2 \
由于默认提供的源码中的顶层设计文件中的存储模块(ROM、RAM)是仿真时使用的, 现在要进行硬件测试,所以必须改成我们实际用到的 ROM、RAM 模块(也就是前一节我们生成的 ROM、RAM 模块)。
. [- m9 f. s8 p0 K0 H$ v(1) 首先在工程目录下新建一个 mc8051core 的文件夹,将 mc8051 core 的源代码文件(位于:\mc8051_Source\VHDL 目录)拷贝到 mc8051core 文件夹。
4 U' Q3 U3 ]2 d! T3 k& m(2) 打开 mc8051_Source\VHDL 目录下的 mc8051_p.vhd 文件,将原文件中 ROM、RAM 模块调用的代码(如程序清单 2.1 所示)全部替换为符合本设计的程序代码(如程序清单 2.2 所示)。
4 w* g: E7 d% u1 F# a- a程序清单 2.1 mc8051_p.vhd 文件代修改代码
5 {, p3 R9 n! |: {6 c
8 a3 h7 Y! _, T4 U( s

+ a* ~  n, i0 C. a( y7 X
0 t* c/ t. |( T7 b

" \. i% `0 ^; C( n* M
* V' Y. ^7 _4 ~. G" ^0 m2 H
5 X1 U6 A* x( ]2 _
程序清单 2.2 mc8051_p.vhd 文件更新的源代码
1 H, G. R3 n+ n  p' x- D
1 c; n9 ~: V8 W& s1 T' R+ D

5 Z6 Q+ A8 i! f8 d
1 _7 Y& Y( D! G! M! J
0 f# j3 a' @: M5 @* W, b$ y6 S" W; B2 V# i4 o4 }
(3) 打开 mc8051core目录下的 mc8051_top_struc.vhd 文件,首先做如程序清单 2.3 所示修改,其中行末标注“--new”的行为新增加的内容。然后将原文件中 ROM、RAM 模块调用部分的代码修改成如程序清单 2.4 所示的代码。这样就完成了源文件更新修改。

! l# x- L/ |# u  t
程序清单 2.3 mc8051_top_struc.vhd 文件新增的代码
/ f5 o& k( a: p5 p( A! m
7 m+ ?) p8 J8 G( m( V, s
1 V$ q# d4 v) x( c9 M+ M3 t/ {

, D- j  V; K' S$ R& k; a
7 h% o& s/ S0 F, }! o7 j( j9 G; X8 `3 U3 k- u
其中,
" s' W: ?1 @0 q$ a/ x) W

0 s" K# J9 g* N. u

4 l. \  C: p5 y8 F
/ j1 L& Z9 i0 Y& P4 q

  q2 E  Y; x( L2 V1 n
, K8 ~; F- u4 ?& I* J: v
就是新增加的内容
6 F$ P4 w( l* \; X5 {
程序清单 2.4 mc8051_top_struc.vhd 文件中更新的源代码

( n5 F1 D  G6 A6 E8 r6 D
7 j! i7 E1 r8 Q* P* _2 L; U
# f8 r$ X9 J$ E. a0 t! a

( [( U0 x8 _  w$ x* U7 a" a4 q% v! K( u5 l5 V5 j( t
: _  r1 B# o0 F( C- {
3 A4 y3 D9 x1 A0 k+ P
2.2.2 添加mc8051 Core相关文件到Quartus II工程中
* |2 M; H2 S. [" I2 V, M
在将mc8051的源码添加到Quartus II工程前,我们需要首先对部分文件的文件名进行更改。原版的VHDL源码,部分文件的文件名末尾加了有“_”,而实际源码中的模块名没有加“_”,因此,如果将这些文件直接添加到Quartus II工程中,编译就会报错,提示找不到模块。
. w! j0 _5 z5 K& }

1 Q) y* a: u+ I
$ m9 V: y* N4 d$ y  w% N0 y
0 @  Z, L2 P, y6 T5 v& I

* q1 c  f( N1 Q7 ]. Y0 a/ w, G  m
, B2 u9 J1 s2 G$ Z6 ^, M
因此我们首先将源码文件以“_”结尾的文件名中的“_”全部去掉,例如,将“addsub_core_.vhd”更改为“addsub_core.vhd”。当所有的文件名更改完成之后,方可添加这些文件到工程中。
/ n: b" B* [) H: X) i7 O' }2 I- I
在Quartus II软件中,点击【Project】>>【Add/Remove Files in Project】,在弹出的对话框中,点击浏览文件符号,如图 2.21 所示:

  ?: s$ m; S& t9 D
7 z5 f0 J2 [' g& Q. o; Q

+ y" U; d' X6 }9 {, _! o  s" b9 X; g
图 2.21 添加文件按钮

# D/ i1 S) v& e1 m2 [选择mc8051core文件夹下的所有非配置文件(即以cfg结尾的文件不用选中),然后点击打开按钮,即可将文件添加到工程中来。如图 2.22 所示:
( Q- F+ A9 @' I& T: M, V/ Q, n- H4 Q2 ~- m: i( {

$ P0 J$ J* P$ N8 y+ M0 V5 ]4 C
图 2.22 选择需要添加的文件
点“OK”完成文件的添加。  

3 I0 z4 j6 y6 ]6 ^  @
2.2.3设置工程顶层文件在Files栏中,选中mc8051_top.vhd文件,点击右键,选择“Set as Top-Level Entity”,即可将mc8051_top.vhd设置为工程的顶层文件,(这里设置为顶层主要是为了封装IP核方便,临时性的,并不是最终作为工程顶层)。如图 2.23 所示:
. D7 h; x- M( Y, i$ W4 ]# Y

$ `5 w5 U* [' ^$ y
0 E, w- v/ b' F
图 2.23 选择需要添加的文件
2.2.4 综合工程文件

- h( d; \) B* O2 \$ f( B
      (1) 综合工程

+ ^' F2 Z* {" v' Y. |
在 Quartus II 软件的主界面,点击分析和综合按钮 (或者直接按键盘组合键ctrl+k),即可开始对工程进行分析和综合。这个过程大概需要几分钟到十几分钟,视软件版本和电脑配置,耗费时间有差异。
0 j( f9 i8 o, h' M. `- j* G& X. y
      (2) 查看RTL图
6 G' @  r0 M$ K0 n/ V
综合编译后我们需要检查顶层设计是否正确,这时可以通过 RTL 图来检查,双击RTL Viewer,如图2.24 所示

9 y, `) H) u' Q  Z

. D) }( f" B/ n$ D2 |* u1 f
2 ^, ]3 S8 n4 v

: A2 W" h4 S! ^3 Y) x$ [
图 2.24 点击打开RTL Viewer

& y5 d9 j: ^! _. C
按钮可以打开 RTL 图,我们可以很清晰的看到 8051 core 的顶层结构图,如图 2.25所示。如果没问题我们就可以进行下一步的设计了。

9 {) z, v4 t% W% m0 O/ m$ Q8 W0 L( `7 j% ~. a

' M/ o6 n! o# g4 h( d
图 2.25 mc8051 core RTL 图
# Z4 i4 H. o% p) r+ `0 o
2.3 MC8051 core 在 Quartus II 中的应用
7 P6 l% g% l. h+ y. y0 V
在看这节内容之前建议大家先看一下 2.4 节,了解一下单片机的应用测试程序及测试流
# L* @6 q; C; C  [( a/ E
程,因为这两部分内容是同时进行,密切关联。
" s! E8 w8 j, N5 o
在这一节我们将对 2.1 节建立的 Quartus 工程做进一步的设计,并将 mc8051 core 应用

" Y% M. R4 L6 |; b9 }9 @- m
于设计中。同时对 Quartus 的简单应用做进一步的学习。具体包括以下内容:
, I& l& }, a0 Q. ^/ y6 F
      1. 建立 PLL 数字锁相环模块;
* I3 V% b1 |( _; |
      2. mc8051 core 在 Quartus II 中的应用设计;' w$ G, W4 W2 j! ^, g
      3. FPGA 参数设置;' {. Y; E/ ?8 ?3 O
      4. 下载硬件设计到目标 FPGA。
  N1 z# O: M( J# _7 n0 n

3 p6 Y/ K( t# t0 |5 z
6 m5 g) p, P: b4 T5 v, e+ C
2.3.1 建立 PLL 数字锁相环模块

7 f4 |5 x) v/ c0 B4 c+ S
众所周知,单片机需要时钟信号才能运行,那怎样才能得到一个稳定而可靠的时钟源呢?我们的实验板上有一个 50MHz 的有源晶振,但对于 mc8051core 来说,频率比较高,需要分频,这时可以用 FPGA 自带的 PLL 调整时钟频率,PLL 输出的时钟频率、相位都可调而且精度很高,下面我们将介绍如何在 Quartus II 中调用 PLL 模块。

+ y$ z& q! s+ h: M
(1) 打开我们在 2.1 节建立的 QuartusII 工程,从【Tool】>>【MegaWizard Plug-In Manager…】打开如图 2.13 所示的添加宏单元的向导。

% C- [) _2 I: h" E6 G( W5 K
(2) 在图 2.13 中按 进入向导第 2 页,按图 2.26 所示输入“pll”选择 ALTPLL,并选择器件类型及存放路径,注意标记部分。
1 E  O8 c, B8 j" a6 V  C) g

  _  K$ r# G( P5 C% C) P* Q
( w3 t4 J( E/ w1 D, ?$ O
图 2.26 MegeWizard Plug-In Manager page2

! e. b9 [" r3 y1 ]; U1 N
(3) 在图 2.26 中按 进入向导第 3 页,按图 2.27 所示选择和设置,注意标记部分。由于电路板上的有源晶振频率为 50MHz,所以输入频率设为 50MHz。

2 z) {4 p. \, x# J3 _
6 ~9 m% s8 Z* t0 |7 }/ H! W& f2 b1 ?& a

; R  i. L# }  O
图 2.27 page3 设置输入时钟频率

8 |% |' K. W6 z: x7 ^
(4) 在图 2.27 中按 进入向导第 4 页,在图 2.28 所示的窗口选择 PLL 的控制信号,如 PLL 使能控制“pllena”;异步复位“areset”;锁相输出“locked”等。这里我们不选任何控制信号。
+ Y6 ^0 o" i7 a3 w, ?
( W# d. B  W: U  E" w
: ?9 T/ N2 [  K5 z4 l( m
图 2.28 page4 设置控制信号
2 F: }- q1 Y+ f. U! X0 `
(5) 在图 2.28中按连续按下 直到进入向导第8页,按图2.30所示选择c0输出频率为18MHz,时钟相移和占空比不改变。
  P' _2 G9 o" B- J/ f, l
5 o6 S& s6 t" p* v/ h

& a" I1 u% ?5 E: M& g
图 2.29 page8 设置时钟输出频率

" ?  v6 G/ d0 [8 |: ?
(6) 在图 2.29 中按 进入向导第 9 页 c1 的设置界面,由于c1以及后续其他输出都不再使用,因此,这里可以直接跳过其他所有输出的配置,直到最后按 完成 PLL 兆功能模块的定制。
2 g/ Z" B3 h# g, B. c9 n0 s
在完成定制 PLL 后,在 Quartus II工程文件夹中将产生 pll.bsf文件和 pll.v 的Verilog HDL源文件。

+ t- J5 o; v# |' c7 z$ M
2.3.2 建立MC8051应用工程,

0 C$ Q3 S/ m4 j! C" J
这一小节将讲述如何使用以上移植的mc8051的核建立一个实际的Quartus II 工程并能够在芯航线FPGA学习套件的主板上运行。 具体步骤如下:
5 B) U4 ]8 M( z& ^6 b2 u; g8 i
: a* f% A' ?4 V, u3 R, P

6 F; q4 \4 ^" ~# Z
      (1) 在工程顶层中例化mc8051核
% P3 f2 I( j6 s8 s; `$ C
      (2) 在工程顶层中例化pll
+ x- D. N5 G& F5 M: [
      (3) 对工程进行分析和综合* Z! D+ Z; w. \& x
      (4) 分配引脚
/ D$ T& r0 Q; e$ A7 z& L0 R
      (5) 编译并生成FPGA配置文件 * b6 n& X  g* x' R2 X
      (6) 使用USB Blaster配置FPGA

3 b' ]" y. m: n& N/ j4 V9 B$ R4 z
5 ?* @5 U& T" Z) S/ s

! w$ _7 M& D5 y  i1 I$ l6 i
打开之前建立的Quartus II工程,打开mc8051_test.v文件,首先编写模块的端口,这个模块的端口也是工程最终的对外引脚,这里直接设置模块端口为mc8051的IO。 如程序清单2.5的第1行至第23行所示。
3 w+ f* [- @0 |4 p: T0 t8 {
接着在工程中例化mc8051核,这里就是例化mc8051_top。Quartus II中,可以直接在Verilog文件中例化使用VHDL编写的模块,因此这里直接按照Verilog的格式例化mc8051_top即可,如程序清单2.5的第33行至第56行所示。注意,mc8051核的复位端口是高电平复位,而我们开发板上是将复位信号接到了轻触按键上,轻触按键在没有被按下时,输出的是高电平,因此该信号不能直接接到mc8051的复位输入端,需要先将其取反,因此直接在例化时将Rst_n取反后连接到mc8051的reset端即可(第36行)。
- N. {" G' G5 F, |: v# k
然后在工程中例化pll核,例化pll的代码如程序清单2.5的第27行至第31行所示,pll的时钟输入端连接到芯片的时钟输入信号Clk50M上,c0输出为18M,连接到mc8051的时钟输入端口clk上。
& s7 x2 H1 a1 g% S& Q: z

& o5 \2 i5 `- G- b. v- _5 H
程序清单 2.5 mc8051_test.v 文件的源代码
! [0 _9 B! d  s/ D

- E9 [# y. u% \7 H7 s0 L6 h

$ F# v/ |. F7 h% N7 \! v" K& A9 @

: V7 S5 E: L" `9 ]6 n% I
) F3 o  H/ j% e: Y' K& R; m' p2 h6 E9 _5 ]% e7 F

7 l0 C, M  Q7 A* Z2 R6 W7 n9 v
接着我们将mc8051_test.v文件设置为工程顶层,然后点击分析和综合按钮(或者按下键盘组合键ctrl+k)来对工程进行分析和综合。
# S+ Z: m% c# b; v% Y
分析和综合完成后,我们打开Pin planner,进行引脚的锁定。依次点击【Assignments】>>【Pin Planner】,如图 2.30所示:
/ J- [: ~- C8 Y% w, g5 x! ?
* B) c+ ^. u+ ^
2 ]. b, @! C) A# \
图 2.30 打开引脚分配卡
7 Z9 V" s8 j8 c
这里,我们只需要分配我们使用到的部分外设,没有使用到的暂不做引脚分配。本例中,我们将在Keil中编写软件代码测试mc8051的定时器、串口和P1口。我们使用开发板上板载的4个led灯进行测试P1口P1_o[0:3]的测试。因此我们需要分配引脚的端口有P1_o[0:3],all_rxd_i,all_txd_o,Clk50M以及Rst_n。其他没有使用的端口暂不分配引脚。引脚分配表如下所示:
- n1 P- K! g5 R  w: u

, S: g1 l/ E0 t& a2 O* w: M

+ q" L8 I7 w4 V$ _- o! |5 Z: d, @% _1 j' u4 F" D! D
将以上引脚对应分配给相应的信号即可。分配结果如图 2.31所示:

  y2 t/ o( s! t+ O# Z) Y3 r8 W0 _" d; B% C5 x

; Z* g8 B9 Q3 ~/ E
图 2.31 引脚分配结果
' H% k6 h( ]% N2 @% r5 J/ F. m
引脚分配完毕后,关闭Pin Planner,点击Start Compilation(或者键盘组合键ctrl+L)·来对工程进行全编译并生成FPGA配置文件(.sof)。
0 B2 W/ Z/ o3 [6 ^
编译完毕后,使用USB Mini线连接芯航线FPGA开发板,连接上USB Blaster,然后打开Programmer,在Hardware Setup中选择USB Blaster。添加mc8051_test.sof文件,然后点击start即可将生成的配置文件下载到FPGA芯片中。如图 2.32所示:

8 O5 F1 {% [! @/ P# C. v& d

- C+ W2 _1 W1 {" x+ O

2 K5 u  s- J' a! a4 u
图 2.32 引脚分配结果
! V# v4 M" z6 N3 L# U3 H
2.4 测试 MC8051 的 I/O、UART 和定时器功能9 ]& F6 k0 d& h
在这一节中我们将通过一个简单的流水灯、UART 程序验证我们的 mc8051 core。
1 l# Q/ F5 P. P# b% r& h5 {, W

  `' u5 |* a. }) N7 x& B7 N) ^& d
/ |3 p& Y/ d& ~% v. X" U) t
2.4.1 Keil C 测试程序

6 |: f$ Z; V8 z( t! M
我们的 mc8051 core 已经建立起来了,现在需要一个程序进行硬件测试,这里的程序

! B& @5 A. E. z( W
是指普通的 51 程序,可以用 Keil C 或其它工具来编译我们写的测试程序,并生成.HEX 文件具体的操作过程就不用做介绍了。

1 Y8 z1 |8 A8 Y; a
如程序清单 2.6 所示是一个简单的测试程序,用于测试 I/O、定时器和 UART。定时器 0 用来做流水灯控制,从 P1 口输出;串口波特率(9600b/s)由定时器 1 决定 。

" J% c. y. {+ ~6 `! h. c, n

3 K0 u) y6 D. M7 U1 A
程序清单 2.6 mc8051 IP核测试程序
4 u. _: q9 w% h7 k

9 g* u% {/ ~% d" b" v* S) ^3 |
, y0 {5 c0 U. k7 S1 n
% x3 m2 W% L) ^5 K* R

( V5 x6 T- W* T+ {: t  |4 t) G7 a: g
# n$ S' ~+ Q* `/ c& ~' T; H. n
5 N: X9 r5 h# j- G$ k/ e
& Q! w/ y6 P$ x" X4 O: F
5 P. `, y' j8 @9 r4 X; r3 l
2.4.2 测试步骤

# x4 s/ v+ }+ k+ {8 A, p
将程序清单 2.6 的程序进行编译并生成.hex 文件,为了方便大家测试,我们提供了一个创建好的Keil工程,在“mc8051_test\Cproject\uart_led”目录下,使用Keil C51 v4打开。

  p0 X% d! q  |. l  c( k9 v7 z: M
在Quartus II软件中,依次选择【Tools】>>【In-System Memory Content Editor】,打开In-System Memory Content Editor工具,右侧选择Hardware为USB-Blaster [USB-0],如图 2.33所示:

# f; ?( I1 L( H9 g. n* k

2 x/ ~2 g+ M& T! b" b
图 2.33 选择下载器

. ~$ _3 @% Z7 E8 A; q5 ?7 Y- s0 p
然后工具会自动搜索到器件和器件中存在的支持该工具的节点,搜索完成后整个工具界面如图 2.34所示:

8 w- ]# ]9 N  T0 i/ Y, W# E
1 J$ J: O' L1 D. f

9 N  N4 o- Z5 m# T+ @
图 2.34 In-System Memory Content Editor界面
, P! R3 Y5 a& t# \, K( G5 w+ j
鼠标选中ROM0(这里是我在配置ROM核的时候修改的索引名,如果你在配置的时候忘了修改索引名,则这里默认显示的名字应该是NONE),点击右键,选择Import Data From File。定位到C工程目录下,我这里为:E:\CoreCourse_fpga\mc8051_test\Cproject\uart_led,选择uart_led_test.hex文件并打开。这时候我们可以看到,工具下方已经有数据了,我们点击下传按钮以将数据传输进FPGA中的ROM中。如图 2.35所示:

9 z2 `9 @3 G" C6 o7 ?
2 M1 u, U. ~0 A
* Y' R6 b! t% @9 `+ m
图 2.35 下载程序到mc8051的ROM中

+ D. k! m0 M: [
然后,我们打开电脑上的串口调试工具(任意一个你熟悉的就行),我这里使用友善串口调试助手,选择板子端口对应串口,设置波特率为9600,数据位为8位,无校验位,1位停止位,接收格式为ASCII。然后点击打开串口,则可以看到串口接收窗口中接收到了开发板传输过来的数据。同时板子开发板上的4个LED灯循环依次点亮。如图 2.36所示:

" X' r  y# S2 b: t* v: \. Z( g! j" n2 z) l- d/ e  A5 K

9 @6 o, {5 V. ]$ ]* h. u
图 2.36 串口接收的数据
& F! m5 Y# a( x4 v. _7 i
当我们的程序调试无误后需要固定到芯片中永久使用时,就将编译好的hex文件名称修改为mcu_test.hex,替换工程目录下原有的mcu_test.hex文件,然后重新编译文件,然后配置FPGA即可。
$ Y" T' U) p& Z( x% r1 O9 U* E

# q. T5 K, ~4 c/ f6 ?8 {$ ~& ~- {! M
小梅哥
2016年2月26日星期五
芯航线电子工作室

. P, A  m1 i$ m+ O; W, W4 O. y+ z
6 e! s) d% B6 ~$ b2 W" H. u7 u* Y' j$ m* W7 d2 l' U

- B) V+ ?' S3 C( w
' r( O& k5 e2 j5 }, B, B
- ?& I& M' _9 `/ g
附录 A MC8051 指令表

5 x1 A& R2 g% E9 u) g, V2 z) Q
附表 1 MC8051 指令表

0 M' Q. }! q8 w% C
3 L4 R) i1 P& P8 [4 Q
" g$ i- k) P5 ]( g
3 e) L& _/ B$ I" x2 l
" n* w- d) D+ W* G  h) U) U

0 K( X  L8 K1 B* B4 r

  l* q* Y" |+ o1 w8 V5 i3 @. o
) R4 X1 M! [- H) E$ v" w0 j& O; p

# v+ Z6 ^- `4 `: Z, ]
游客,如果您要查看本帖隐藏内容请回复

+ X8 `. g9 d# }( C5 `& E3 X& S) n
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-30 01:11 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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