8051软核处理器设计实战.html.pdf

上传人:紫竹语嫣 文档编号:5514566 上传时间:2020-05-27 格式:PDF 页数:116 大小:4.67MB
返回 下载 相关 举报
8051软核处理器设计实战.html.pdf_第1页
第1页 / 共116页
8051软核处理器设计实战.html.pdf_第2页
第2页 / 共116页
8051软核处理器设计实战.html.pdf_第3页
第3页 / 共116页
8051软核处理器设计实战.html.pdf_第4页
第4页 / 共116页
8051软核处理器设计实战.html.pdf_第5页
第5页 / 共116页
点击查看更多>>
资源描述

《8051软核处理器设计实战.html.pdf》由会员分享,可在线阅读,更多相关《8051软核处理器设计实战.html.pdf(116页珍藏版)》请在三一文库上搜索。

1、前言 虽然目前FPGA设计的发展如火如荼,但仍被嵌入式设计压过一头。具体原因有很多,究其主要原因,在于MCU的价格低廉、容易普及,而设计者又不用担心设计的某些程序bug,反正MCU可以反复擦 写、存储空间又充足,即使有了bug也决不会成为毁灭性的。实际上,FPGA也有这种反复擦写的优势,但它的单品价格不菲,因此,与MCU主打的嵌入式设计比起来,实在缺乏竞争力。 价格影响产品的普及。细察嵌入式开发者和FPGA开发者,就会发现嵌入式开发者胆气冲天,一个人就能拿捏住整个系统,什么音乐、网络,搞得风生水起,有声有色。但此种现象在FPGA开发者身上 极其罕见。大多数FPGA开发者都只是“方面大员”,在各

2、自的领域内固然是见微知著,但一旦超出他的领域,那就四顾茫然了。 作者一直存在一个想法,那就是引嵌入式开发的“灵气”入FPGA设计的“一团死水”中,激活FPGA开发者的豪气,也让FPGA设计能够变得与嵌入式设计一样有声有色。存在这种想法的不仅是作 者,而且还包括FPGA领域的“大鳄”Xilinx。Xilinx公司联合ARM公司推出带有Cortex-A9硬核的FPGA,也就是想让嵌入式设计与FPGA设计做到融合,互帮互助,从而实现设计的一体化。于是这种特 殊类型的FPGAZYNQ系列成了Xilinx公司的主打宣传产品。在相关技术论坛上,由于Xilinx不遗余力地大推特推,ZYNQ已经变得耳熟能详了

3、。但是,对于设计者而言,ZYNQ只是“看起来很美”。 至少对于个人开发者来说,能真正玩转ZYNQ不仅需要开发者有高超的FPGA设计经验,而且还要有能让Cortex-A9正常运转的嵌入式开发经验。这对于普通开发者来说是一个了不起的挑战。如果是一个 团队,甲负责FPGA设计,乙负责Cortex-A9开发,两人通过沟通、合作、同心协力,或许能够让嵌入式和FPGA两者互相补充,并发挥最大效能。但对于普通开发者来说,则绝无这种左、右手同时担当两方 面工作的能力。因此,对于普通开发人员来说,在CPU方面,没有必要采用那么高端的配置。 采用最普通的Verilog语言写一个CPU软核是不错的主意。在这本书之前

4、,作者曾编写了兼容ARM9的软核处理器设计:基于FPGA,让众位FPGA开发者能够用到与ARM9功能相当的32位CPU处理 器。但通过和几位读者沟通了解到:从FPGA设计上来理解软核处理器的运作没有问题,但32位处理器的嵌入式设计、使用开发工具生成程序并让软核处理器充分运作起来,这对于他们而言则太难了,因为 这是个跨领域的课题。为了解决这个问题,作者产生了编写本书的想法。 8051架构流传久远,对于嵌入式开发者来说,他们非常熟悉相关的工具和流程,但由于它的指令众多、实现复杂,对于FPGA设计者来说,这是一个很好的挑战课题。作者继ARM9软核处理器设计之后 又推出8051架构的软核处理器设计,这

5、套系统相对于ARM9来说更加简单,可以吸引更多FPGA的入门开发者,并使其通过学习软核处理器设计(不仅学习设计技巧,而且最终能将所学知识用在今后的开发 上)打通嵌入式开发和FPGA设计上的“任督二脉”。 本书首先对8051架构做了详细介绍,并对它的各种器件做了取舍。8051毕竟是一种独立运行的单片机,因此它包含了必要的定时器、串口等。但作为一个可以在不同环境下调用的8051软核处理器,可 让使用者根据自己的需要对它添加元件。因此,简单的定时器和串口并不需要包括在软核处理器之中,使用者完全可以根据自己的需要来添加它们。 对于8051的111条指令,单个看起来每一条都很简单,然而数目众多,作者分类

6、介绍它们用了不少篇幅,但运用Verilog设计技巧却能在700行左右的代码文件中详尽表达它们。采用精简的Verilog描述来 描述复杂的系统是作者带给读者的设计艺术。通过了解这种设计艺术,读者能够加深对Verilog设计的领悟。因此,在讲述完8051的架构后,作者对Verilog的基本知识也做了介绍,让读者在学习设计技巧之 前,能够先了解这些基本知识。 重点是如何采用Verilog语言来实现这111条指令,本书也对此做了介绍。软核处理器作为吞吐指令的“装置”,它对源源不断的指令进行精确而迅速的解析。由于指令繁多,这对资源整合提出了挑战, 很多同行都在这个问题上束手无策。但其实处理这类问题的策略

7、古人早就教给我们了。最通俗的比喻就是折筷子,若给你111根筷子,让你一把折断,这当然是比较费力的,但如果一根一根地折断,那就容 易多了。这个策略很多人都懂,但真要做起来,却会走样变形。问题是首先得把这111条指令变成如同每根筷子一样的不同的“小麻烦”,而不是集合在一起,成为“大麻烦”。因此,在进行Verilog设计 前,需奠定好软核处理器主程序架构的基础,如千手观音,首先塑起无手的观音,然后,一只一只地逐步添加上所有的手。本书在奠定基础上有独到之处,值得读者借鉴。 在FPGA设计上有一个好的思维模式并不太难,难在坚持这个思维模式并使之完备成熟。为此,作者准备了与Keil这个流行的8051开发工

8、具适配的测试代码。这些代码会针对每条指令进行测试,并在最 后给出测试结果。读者可以在作者的基础上对程序大胆地添加自己的想法,并用这种软件的测试程序进行检验。 目前,FPGA设计远没有达到蓝海的沙滩,它的提升空间巨大,愿与读者共勉,共同提升之。 编者 2014年10月 第1章 8051架构描述 1.1 引言 8051是最流行的CPU。8051兴起于20世纪80年代,由intel开创。当然,现在intel已经不再理会这种低端的8位CPU,它主打的是通用处理器,也就是我们电脑上用的那种。因此,8051的架构不像 ARM架构一样有专利的困扰,各位可以放心地将其应用在各自的项目当中。 8051和它的“后

9、辈们”x86的各种高端处理器相比,其优点是功能简单、架构单一。因此由8051这种8位处理器形成的MCU占据了单片机市场的主流。就算ARM公司费尽心机开发出各种小面积、 高性能的处理器内核,它们也无法取代8051在开发者心目中的地位,原因在于8051处理器优越的性能。 本章将带领诸位去领略这款经典8位处理器的架构,让我们从架构这一方面了解它的优异性。 本书的目的是在FPGA上开发兼容8051的软核处理器。因此在开发之前,我们必须对它的架构非常熟悉。在探讨之前,必须明确一点,在FPGA上设计兼容8051的软核处理器到底应该设计到什么程 度?笔者在上一本关于处理器设计的书兼容ARM9的软核处理器设计

10、:基于FPGA中,对兼容ARM9的软核处理器进行了FPGA设计研究。当时的设计目的是要和原版的ARM9TDMI一模一样,仿佛稍微 有一些不同,就没有设计成功一样。现在看来,其实大可不必。 这大概是“山寨”的必由之路:一开始对某原版产品分析得仔仔细细,列出基本功能,然后开始模仿,并模仿到每一个细节都相似,然后推向市场,声称开发出了一款功能与原版类似的产品。比如市 面上经常看到的仿苹果手机,从界面到开机屏幕,再到桌面布局,几乎做到惟妙惟肖,真假难辨。然后呢? 但我的“山寨”之路却不想停留在模仿表面上,原因在于软核处理器设计出来后,它的最大目的不是“炫耀”,而在于它的实用价值。它的的确确能够帮助开发

11、者在FPGA开发板上玩出花样,玩出精 彩,它最大的目的在于帮助更多爱好开发FPGA设计的人。既然如此定位,在“山寨”的路上就得前进一步,在原版的基础上进行创新和扬弃。 对处理器架构进行创新的想法萌发于对嵌入式软件开发工具的熟悉。最开始,FPGA设计者对嵌入式软件的各种开发工具知之甚少,只知它最后生成了BIN文件,且这个文件可以被FPGA设计的 ROM“吃”进去。因此只需要阅读某某公司出来的既定的“处理器架构”文档,按照该文档预定的方方面面进行设计就可以,设计者几乎不会想到对某些要点进行更改。这个想法几乎是有点“逆天”的, 因为当设计者连模仿到某种相似的程度都做不到,怎么可能想到对处理器的架构进

12、行更改呢?但现在若能够对它模仿得惟妙惟肖,那为什么不能按照设计者的意愿将其定制成自己感觉舒服的架构呢?但前 提是需要嵌入式软件开发工具配合。编者在用了大大小小的嵌入式开发软件后,发现它们其实挺配合的。 用嵌入式开发软件做什么,也就是嵌入式软件能起什么作用?嵌入式软件就是一个翻译机,主要是把C语言翻译成机器语言,也就是生成BIN文件。然后这些含有机器语言的BIN文件被软核处理 器“吃”进去。这些机器语言对阅读者来说是天书,但对于软核处理器却是对口的。软核处理器会按照该BIN文件规定的一条条指令进行执行,那么C语言想表达的意思就得到了执行。因此嵌入式软件主要 干的活就是翻译C语言。 处理器架构设计

13、者除了规定该类处理器支持指令的含义外,还规定了该类处理器的硬件架构,例如ARM9的七种工作模式、Cortex-m0的多类中断支持、8051的计数器和串口。这些硬件架构一旦被制 定完毕,即被各方开发者奉为至宝,并严格按照该类硬件架构进行设计,从不敢越雷池半步。但嵌入式软件开发者使用开发软件的时候,要重新学习这些硬件特性,并在编写C语言程序的时候体现它们。 他们倒是敢作敢为,因为嵌入式程序是他们写的,他们有这个能力使硬件架构按照某种规则活动。 就本书的8051处理器来说,不管是前人实现的8051软核处理器还是市面上出售的8051的单片机,都有两个特殊操作的计数器。嵌入式开发者在开发8051的嵌入式

14、软件时,必先学习如何调理好这两个 计数器。但软核处理器设计者们可以改变这个规则。他们完全可以按照项目的需要配备计数器,而无须计较什么规定。对于8051软核处理器来说,用到什么就设计什么,有些东西没有用,则完全可以去 除。因此设计者也可去掉这两个计数器,这也表示改变了8051的既定架构,但这种改变又有何不可呢?设计者完全可以按照需要生成自己的计数器,而不需要学习8051规定的那套繁琐的使用规则。 处理器架构可被人为地区分成两部分:一部分是可以改变的;一部分是不可以改变的。划分的依据在于嵌入式软件,如果改了某部分,则嵌入式软件不能自如地翻译C语言,那么这部分就属于不可改 变的。不可改变的部分包括有

15、多少个寄存器、多少条指令支持。如果设计者去掉了某条指令,但软件翻译的时候却不知道哪条指令被去掉了,因此它仍会将相应的C语言翻译成这条指令,那么软核处理器 在碰到该指令的时候,就无法处理了。当然就连这个也是可以商量的,比如乘法指令,因为硬件乘法比较耗费资源,所以可以让软核处理器不支持乘法指令,然后再编写C程序的时候,有意改变编程风 格,避免让嵌入式软件生成到乘法指令,那么其实连指令集也都可以改变。 另外一部分就是可以更改的。比如架构规定了两个堆栈指针,但项目只需要一个堆栈指针即可,C程序和汇编程序里面也根本不会用到两个堆栈指针,那么为什么还要两个呢?架构当初这么设计是为 了照顾大多数人的需要,但

16、现在,设计者既然自己设计了软核处理器,那么完全可以做到专用可以任意设计处理器,需要什么硬件架构,就可以在FPGA上实现。 因此,本章在讲8051架构的时候就分开来讲,具体分为两部分:一是必须要实现的特性;二是可以舍弃的特性。对于必须要实现的特性,那毫无疑问必须要弄清楚,而且要理解得非常透彻非常明白, 在执行设计的时候,也要彻底。但对于可以舍弃的特性,我们只需了解即可。以前面举的两个计数器为例,在此就不再详细讲解如何将其设为何种模式,如何让它工作等。读者在阅读了本书后,一定能够 自行添加需要的计数器。在这种情况下,再去将就原来的计数器就显得毫无意义。当然,若特别钟情原来的架构或原来的嵌入式软件,

17、而非要适用原来架构的设计者,也可以查找8051的资料,弄明白它的 方方面面,然后自行添加上去。 这个原则好比日常所使用的键盘。它有26个字母和标点符号、以及Esc、F1F12、Insert、Delete、Home、End、PgUp、PgDn等按键。26个字母好比核心指令,你一个也不能省,省略了则不能叫 键盘了,标点符号要看情况省,这就好比某些乘、除法指令,可以在某种特殊情况下省。至于Esc、F1F12、Insert、Delete、Home、End、PgUp、PgDn等按键,你完全可以按需配置,无须学习既有 键盘的那套规则。 第1章 8051架构描述 1.1 引言 8051是最流行的CPU。80

18、51兴起于20世纪80年代,由intel开创。当然,现在intel已经不再理会这种低端的8位CPU,它主打的是通用处理器,也就是我们电脑上用的那种。因此,8051的架构不像 ARM架构一样有专利的困扰,各位可以放心地将其应用在各自的项目当中。 8051和它的“后辈们”x86的各种高端处理器相比,其优点是功能简单、架构单一。因此由8051这种8位处理器形成的MCU占据了单片机市场的主流。就算ARM公司费尽心机开发出各种小面积、 高性能的处理器内核,它们也无法取代8051在开发者心目中的地位,原因在于8051处理器优越的性能。 本章将带领诸位去领略这款经典8位处理器的架构,让我们从架构这一方面了解

19、它的优异性。 本书的目的是在FPGA上开发兼容8051的软核处理器。因此在开发之前,我们必须对它的架构非常熟悉。在探讨之前,必须明确一点,在FPGA上设计兼容8051的软核处理器到底应该设计到什么程 度?笔者在上一本关于处理器设计的书兼容ARM9的软核处理器设计:基于FPGA中,对兼容ARM9的软核处理器进行了FPGA设计研究。当时的设计目的是要和原版的ARM9TDMI一模一样,仿佛稍微 有一些不同,就没有设计成功一样。现在看来,其实大可不必。 这大概是“山寨”的必由之路:一开始对某原版产品分析得仔仔细细,列出基本功能,然后开始模仿,并模仿到每一个细节都相似,然后推向市场,声称开发出了一款功能

20、与原版类似的产品。比如市 面上经常看到的仿苹果手机,从界面到开机屏幕,再到桌面布局,几乎做到惟妙惟肖,真假难辨。然后呢? 但我的“山寨”之路却不想停留在模仿表面上,原因在于软核处理器设计出来后,它的最大目的不是“炫耀”,而在于它的实用价值。它的的确确能够帮助开发者在FPGA开发板上玩出花样,玩出精 彩,它最大的目的在于帮助更多爱好开发FPGA设计的人。既然如此定位,在“山寨”的路上就得前进一步,在原版的基础上进行创新和扬弃。 对处理器架构进行创新的想法萌发于对嵌入式软件开发工具的熟悉。最开始,FPGA设计者对嵌入式软件的各种开发工具知之甚少,只知它最后生成了BIN文件,且这个文件可以被FPGA

21、设计的 ROM“吃”进去。因此只需要阅读某某公司出来的既定的“处理器架构”文档,按照该文档预定的方方面面进行设计就可以,设计者几乎不会想到对某些要点进行更改。这个想法几乎是有点“逆天”的, 因为当设计者连模仿到某种相似的程度都做不到,怎么可能想到对处理器的架构进行更改呢?但现在若能够对它模仿得惟妙惟肖,那为什么不能按照设计者的意愿将其定制成自己感觉舒服的架构呢?但前 提是需要嵌入式软件开发工具配合。编者在用了大大小小的嵌入式开发软件后,发现它们其实挺配合的。 用嵌入式开发软件做什么,也就是嵌入式软件能起什么作用?嵌入式软件就是一个翻译机,主要是把C语言翻译成机器语言,也就是生成BIN文件。然后

22、这些含有机器语言的BIN文件被软核处理 器“吃”进去。这些机器语言对阅读者来说是天书,但对于软核处理器却是对口的。软核处理器会按照该BIN文件规定的一条条指令进行执行,那么C语言想表达的意思就得到了执行。因此嵌入式软件主要 干的活就是翻译C语言。 处理器架构设计者除了规定该类处理器支持指令的含义外,还规定了该类处理器的硬件架构,例如ARM9的七种工作模式、Cortex-m0的多类中断支持、8051的计数器和串口。这些硬件架构一旦被制 定完毕,即被各方开发者奉为至宝,并严格按照该类硬件架构进行设计,从不敢越雷池半步。但嵌入式软件开发者使用开发软件的时候,要重新学习这些硬件特性,并在编写C语言程序

23、的时候体现它们。 他们倒是敢作敢为,因为嵌入式程序是他们写的,他们有这个能力使硬件架构按照某种规则活动。 就本书的8051处理器来说,不管是前人实现的8051软核处理器还是市面上出售的8051的单片机,都有两个特殊操作的计数器。嵌入式开发者在开发8051的嵌入式软件时,必先学习如何调理好这两个 计数器。但软核处理器设计者们可以改变这个规则。他们完全可以按照项目的需要配备计数器,而无须计较什么规定。对于8051软核处理器来说,用到什么就设计什么,有些东西没有用,则完全可以去 除。因此设计者也可去掉这两个计数器,这也表示改变了8051的既定架构,但这种改变又有何不可呢?设计者完全可以按照需要生成自

24、己的计数器,而不需要学习8051规定的那套繁琐的使用规则。 处理器架构可被人为地区分成两部分:一部分是可以改变的;一部分是不可以改变的。划分的依据在于嵌入式软件,如果改了某部分,则嵌入式软件不能自如地翻译C语言,那么这部分就属于不可改 变的。不可改变的部分包括有多少个寄存器、多少条指令支持。如果设计者去掉了某条指令,但软件翻译的时候却不知道哪条指令被去掉了,因此它仍会将相应的C语言翻译成这条指令,那么软核处理器 在碰到该指令的时候,就无法处理了。当然就连这个也是可以商量的,比如乘法指令,因为硬件乘法比较耗费资源,所以可以让软核处理器不支持乘法指令,然后再编写C程序的时候,有意改变编程风 格,避

25、免让嵌入式软件生成到乘法指令,那么其实连指令集也都可以改变。 另外一部分就是可以更改的。比如架构规定了两个堆栈指针,但项目只需要一个堆栈指针即可,C程序和汇编程序里面也根本不会用到两个堆栈指针,那么为什么还要两个呢?架构当初这么设计是为 了照顾大多数人的需要,但现在,设计者既然自己设计了软核处理器,那么完全可以做到专用可以任意设计处理器,需要什么硬件架构,就可以在FPGA上实现。 因此,本章在讲8051架构的时候就分开来讲,具体分为两部分:一是必须要实现的特性;二是可以舍弃的特性。对于必须要实现的特性,那毫无疑问必须要弄清楚,而且要理解得非常透彻非常明白, 在执行设计的时候,也要彻底。但对于可

26、以舍弃的特性,我们只需了解即可。以前面举的两个计数器为例,在此就不再详细讲解如何将其设为何种模式,如何让它工作等。读者在阅读了本书后,一定能够 自行添加需要的计数器。在这种情况下,再去将就原来的计数器就显得毫无意义。当然,若特别钟情原来的架构或原来的嵌入式软件,而非要适用原来架构的设计者,也可以查找8051的资料,弄明白它的 方方面面,然后自行添加上去。 这个原则好比日常所使用的键盘。它有26个字母和标点符号、以及Esc、F1F12、Insert、Delete、Home、End、PgUp、PgDn等按键。26个字母好比核心指令,你一个也不能省,省略了则不能叫 键盘了,标点符号要看情况省,这就好

27、比某些乘、除法指令,可以在某种特殊情况下省。至于Esc、F1F12、Insert、Delete、Home、End、PgUp、PgDn等按键,你完全可以按需配置,无须学习既有 键盘的那套规则。 1.2 8051处理器基本模型 基于上述原则,我们来讨论8051处理器的架构。在分析前,首先建立处理器的基本概念。 处理器架构的基本模型如图1.1所示。 图1.1 处理器架构的基本模型 该图分为三部分:最左边的方框是指令池(CODE区);最右边的方框是数据池(数据区);中间虚线区域为处理器模型。CODE区和数据区是处理器设计的两大主题,它们解决了软核处理器的两大难 点:该怎么做和对谁做。CODE区里从0开

28、始按顺序排列着指令,软核处理器可从它那儿得到该怎么做的信息。数据区作为数据的存储池,它也按顺序排列着数据,软核处理器可从它那儿得到处理的对象。 一般来说,软核处理器从CODE区里面读出指令,分析指令的含义。指令具有的含义,说白了就是从数据区内的某处取出某数据,进行若干处理,然后写回某处。 处理器模型是所有事件的发起者,是不折不扣的主角。一般来说,它会从指令池的0地址开始取第一条指令,然后执行,下一次再取第二条,如果不遇见跳转指令,它会一直取到指令池的结束。而跳转 指令会改变指令池的读取程序,强行它从某某地址重新开始读指令,然后一直递增,直到遇到下一条跳转指令。 好了,处理器开始读取指令。那么它

29、首先得告诉指令池,它要取哪一条指令,不然指令池会出错。因此处理器会送给指令池一条地址信息,32位处理器的地址信息是32位宽的,因此指令池在理论上可 以存放232个指令数据,也就是常说的4GB的地址空间。当然这4GB并非专属于指令池,通常的做法是:让指令池和数据池共用同一地址空间。8051作为8位处理器,地址线的宽度应该是8位,但其实不 是,它的地址位宽是16位,因此指令的最大空间是216,也就是64KB的地址空间。它和32位处理器不同的是这64KB的空间乃属于指令池专用。 处理器对指令池给出地址,声明需提取指令池的xx地址的指令。指令池给出对应指令A,处理器把指令A放置于它的“当前执行的指令”

30、区域,作为这次操作的主题。指令A的操作一般分为3步:第一 步,从数据池的xx地址处取出数据,放于“当前处理的数据”区域;第二步,对“当前处理的数据”进行数据处理,最终改变成想要的形式;第三步,告诉数据池,某数据写回yy地址。上述三步完成,该 指令即执行完毕,换下一条指令到“当前执行的指令”区域,重复上面的三步操作,如此周而复始。 每条指令的执行效果可能非常微小,但汇聚在一起就是一件有意义的行为。众所周知,指令池由开发软件编译而成,而开发软件编译的基础是C语言程序或汇编。这些C语言程序或汇编是由开发者编写 的,并反映着开发者的意图。开发者也就是通过“C语言程序-开发软件-BIN文件-指令池内容”

31、这条线来体现自己的意图的。软核处理器作为最低等的“生物”,它只是机械地按照指令池的内容进行 执行,如此而已。 我们经常说8051处理器是8位的,它指的是指令池和数据池的位宽。每次从8051的指令池里取指令,都是以8位为基础的,但指令并非是8位的,而是参差不齐的。有的指令长一点,有3个字节;有的 指令稍短,只有1个字节。8051处理器取出这些长短不一的指令,并解析执行之。 1.3 8051的接口 数据池的每一数据位宽为8位,也就是每次从数据池取出一个单元的数据都为8位。数据池和指令池不同的是,它的构成更加复杂。指令池作为存放预先编译的指令汇集,它完全可以用ROM来代替 (ROM是只能读不能写),

32、我们只执行命令时,希望命令保持不变。数据池是一类数据的集合,它可以是RAM、某种特殊用途的寄存器,也可以是输入、输出引脚。 图1.2是某种8051单片机的内部架构框图。乍一看其全是条条框框的功能模块。不过不要紧,我们不是8051的嵌入式软件或硬件设计者,不必细究它们各自的详细含义。我们只需观其大略。 图1.2 8051单片机的内部架构框图 首先,通过该图了解它的引脚。最左边的边框,从上到下:VCC和VSS是供电引脚,PSEN用来读取外部指令池,ALE用来锁存输出的地址,EA是用来激活外界接入存放指令的ROM的,此三者都是用在 外界连接存储空间的;RST用来对单片机复位。 最下部是晶振。XTAL

33、1/XTAL 2是两个连接着的晶振,一般来说,在12个周期的晶振时间内,CPU会执行一条8051指令。当然ARM9、Cortex-m0这样RISC架构的CPU会一个周期执行一条。8051的指 令有它的特殊性,这个在后面会讲到。 剩下的是四个8位宽的接口:P0.0P0.7、P1.0P1.7、P2.0P2.7、P3.0P3.7。前面的接口我们大略知道它们的功用,而这四个接口既可以用作输入端口,也可以用作输出端口。它是单片机和芯片外 部交换数据的主要通道。它既可以和EA、ALE、PSEN结合起来从外界读指令池的指令,也可以用作读取外界存放的数据池的数据,它还能用作通用接口(即GPIO)。 那么这四个

34、接口(P0P3)是如何被8051的处理器感知和使用的呢?P0、P1、P2和P3属于数据池的一部分,它们各自拥有不同的地址。它们的地址分别对应的是:80H、90H、A0H、B0H(后面的H 代表前面的数据属于十六进制)。开发者在读P0的时候,只需要驱动C或汇编程序从80H的地址读取它对应的数据则可,那么单片机会把P0作为输入引脚,并将外界对它输入的电平信息告知处理器。处理 器就会明确P0接口的状况如何,这就实现了读取操作。 同样,当开发者想改变P3接口的电平状态时,他可以对B0H地址写入他想写的字节数值。处理器会把写信息送到P3接口。那么P3就作为输出引脚,开发者想要的输出电平信息就反映在P3这

35、7个引脚上 了。 正因为这样,单片机只有一个,但我们可以连接P0P3到不同的应用场合,并通过读取或改写它不同的端口状态来达到特定的使用需求。这就是单片机灵活通用的所在。单片机只是一种让开发者任意 改变来满足自身需求的手段。 读者要问了,为什么是四组接口呢?单片机作为一种通用的手段,它只规定有四个,若觉得太少,可想其他方法来解决这个资源冲突。但如果在FPGA里面使用8051软核处理器,那就完全可按照自己 的需求定制。当然除非是专精于8051单片机编程的程序员会觉得接口多了少了不习惯。但编者也相信他会因为FGPA的高度灵活和可配置性而改变他的习惯。 在这四大接口中,P3比较特殊,它可以充作他用。表

36、1-1是它的其他功用的列表。 表1-1 P3端口的可选功能引脚含义 1.4 8051架构的重要硬件和性能 从上面的列表中,我们要引出8051的其他元素了。P0P3是8051和外界沟通的主渠道,除此之外,8051还有其他重要元件来丰富它的工作。 1.一个全双工串口(UART) 串口是8051、Cortex-m0/3这类低等单片机采用的不二调试手段,原因是它只需两根线,电脑上装个调试终端或其他串口软件,则可在C程序中使用printf语句来打印内部的信息。如果说单片机属于火 星一样的异域世界,那么串口就是火星探测器发回来的电波,它有助于我们了解单片机内部的工作状态。我们的P3.0和P3.1即承担这样

37、的重任,一个负责发送,一个负责接收。 为了串口的工作,我们还为它配备了两个寄存器:一个是SCON,地址编号是98H;一个是SBUF,地址编号是99H。SCON用来配备串口的工作模式和波特率,也就是操作串口如何工作的寄存器。 SBUF放置接收和发送的字节数据。接收方和发送方都是以字节为基础进行交流的。硬件从P3.0收到一个字节,它就将其放入SBUF内,单片机知道后即从SBUF内取出该字节数据。同样,单片机想从串口送 出1Byte数据,即把该字节数据写入SBUF内,硬件会为该字节数据加上头信息和奇偶校验位,然后再串行从P3.1送出。 P3接口既具有通用接口的功能,又有串口的发送、接收功能,但硬件根

38、本不用去区分。如果往P3的地址位B0H写入某数据,那么该数据立即送到P3的对应位,此时P3就被用作通用接口;若往SBUF内 写入一个字节,那么P3.1立即具有串行输出功能,该字节数据会在接下来的时间内被串行送出。 2.五个中断源,两个优先级 心急的读者可能会问,你说有五个中断源,为什么我只在P3.2和P3.3上发现了两个中断,其他三个呢?P3.2和P3.3确实是属于8051架构的五大中断之二,它们属于外部中断。也就是外界能够控制的中 断,好比我们的眼睛和耳朵,外界的刺激能够让单片机立刻感知。但另外三个属于内部中断,比如我们下面会提到的计数器,它好比我们揣的怀表,你定好了时间,去忙其他事情了,怀

39、表计时到头了总得 通知你吧,那么会有两个定时器中断为这两个定时器专用。还剩下一个被前面的串口所用,好比串口接收到了一个字节数据了,单片机程序应该处理该字节数据。此时单片机程序按照指令池里有秩序的指 令一条一条正在执行,但要让它知道硬件接收了1Byte数据,就会有一个中断强迫单片机程序进入它对应的中断向量。该中断向量里面存放着中断程序的地址,里面是已设定的串口处理程序。单片机的接收 和发送共用一个中断,当往SBUF内写入一个字节后,硬件发送完毕,则立即触发中断,单片机程序知道该字节数据发送成功。 既然有五个中断,那就存在着竞争。就好比两个中断同时触发了,你该回答哪一个?一般来说它们五个之间有一个

40、优先级秩序: 第一为外部中断0; 第二为定时器中断0; 第三为外部中断1; 第四为定时器中断1; 第五为串口中断。 排在前面的中断优先级高,后面依次递减。这就是它们同时到来时的判决依据,但也不是绝对的,这是因为8051的架构设计者们为我们安排了改变它们优先级的可能。这就是“两个优先级”:一个是 高优先级,一个是低优先级。开发者可以为这五个中断设定所属的优先级。 当两个中断同时到来后,硬件将不再按照固有的秩序,而是先通过优先级做一次筛查。如果是一个高优先级,一个低优先级,那么毫无疑问,高优先级的先响应,而不管高优先级的秩序落后于低优先 级。因此排名后面的还是有机会得到照顾。但如果两者同属于一个优

41、先级,那么他们还是得按照预定的秩序来,谁在前,谁先得到响应。 用于中断配置的寄存器有:用于配置使能的IE,地址是A8H;用于配置优先级的IP,地址是B8H。 3.两个定时器/计数器 “定时器/计数器”虽然称为两“器”,但其实属于一样东西:16bit宽的寄存器。它充当定时器(timer)的时候,这16bit的寄存器会随着机器周期(1个机器周期等于12个外部晶振时钟)递增。它充 当计数器(counter)的时候,这16bit的寄存器会随着P3.4或P3.5从变成0的时刻递增。再看表1-1,即可知道P3.4或P3.5的含义了它是用来触发这两个计数器的。后面统称“定时器/计数器”为通俗 化的计数器。

42、这两个16bit的计数器皆可通过地址访问。其中计数器0的对应地址为:8AH和8CH,一般标称为TL0和TH0,其分别表示低8bit和高8bit;计数器1的对应地址为:8BH和8DH,标称为TL1和TH1。这两 个寄存器有四种工作模式,且都可通过地址为88H的TCON和89H的TMOD来配置它们的工作模式和中断方式。 这两个计数器配置起来颇为复杂,但在FPGA中,只需为这个计数器配备一个地址以让软核处理器能够访问到,那么它就能充当“定时器/计数器”了。因此,在这里用大篇幅来讲述这两个计数器的工 作模式和操作方法实在是不太合适。读者如果有兴趣,可自行参照单片机的文档学习。 1.5 8051的存储器

43、架构 通过上面的讲述,我们大抵知道8051的重要元素,现在让我们回过头来,重新审视图1.1所示的8051处理器架构的基本模型图。我们在上面介绍的寄存器TMOD、TL0、IE、IP等位于数据池,但它们和 数据池到底有什么关系,到底如何访问,才能让整个硬件运转起来?这就涉及对处理器地址的梳理。 8051的存储器架构如图1.3所示。这里的指令池还是一块完整的区域,它的地址位有16bit,因此它的地址范围是0000HFFFFH。对于图中指令池的访问有两种情况:一种是读指令,除了跳转或中断 以外,每执行完一条指令即取下一条指令;另外一种是该指令指定加载CODE区的某地址,如MOVC指令会访问到CODE区

44、。 图1.3 8051的存储架构组织 由于不存在对CODE区写的情况,因此CODE区可用ROM(只读存储器)来实现。CODE区在理论上最大是64KB,读者在有了软核处理器后,可以将这个CODE区的ROM配置为小于64KB的大小。 CODE区比较简单,而数据池则复杂多了,下面我们将分门别类地对其进行介绍。 1.XDATA区 XDATA(external data memory space)区位于图1.3最右边区域。访问它也需要提供16bit的地址,因此理论上它的最大空间是64KB,地址范围是0000HFFFFH。XDATA表示外部数据存储空间, 它一般映射在单片机芯片之外。在后面学习指令时可以知

45、道,访问它需要使用MOVX类指令。 在进行8051的软核处理器设计时,已经不再分单片机片内和片外存储空间了,因此如果需要扩大存储空间,XDATA区也可以如同DATA区一样被访问。 2.SFR区 SFR(special function registers)指的是存放特殊控制寄存器的区域。它的地址范围是80HFFH。图1.4是它所包含的寄存器分布。 图1.4 SFR区的寄存器分布图 这里面零散地分布着各种控制器,其中包括四个接口P0、P1、P2、P3;串口SCON与SBUF;中断IE和IP;计数器TCON、TMOD、TL0、TL1、TH0和TH1。剩下的B、ACC、PSW、SP、DPL和DPH

46、在后面会专门讲述。最后一个PCON用作功耗控制。 单片机指令会通过给出的相应地址来访问对应的特殊寄存器。 最左边一栏,即从80H到F8H、以0、8结尾的特殊寄存器,可以对它们进行位寻址。它们的每一个位都可以被取出并进行置位操作。 单片机厂商为了扩展8051的功能,通常会选择在SFR区域增加新的特殊寄存器。读者如果需要扩展功能,也可以对SFR区进行拓展。 图中空白的区域表示没有放置特殊寄存器,从而单片机则不能对它们进行访问和读写。 3.IDATA区(8052专有) IDATA区是8051的变种8052专有的,它是通用RAM空间,即开发者可以往IDATA区里任意写数据或读出数据,如同使用普通的RA

47、M一样。这样,8052和普通的8051相比,相当于增加了128Byte的内 存。 IDATA区的地址段也是从80H到FFH,与SFR区的地址段相同。不过不用担心混淆的问题,有些指令提供80HFFH的地址,硬件会访问到SFR区,有些指令提供同样的地址信息,但硬件会将其引导到 IDATA区。这两段区域公用同样的地址,但可通过使用不同的指令访问来区分。 4.DATA区 DATA区对于8051来说,相当于它的内存,大小为128Byte,地址范围为00H7FH。它的使用方法同RAM。但它的00H1FH以及20H2FH地址段具有特殊的含义,具体如下文。 (1)寄存器组区 它的地址范围为00H1FH,总共有

48、32个字节大小。根据特殊寄存器PSW的RS1:0又可以分成四组,每组有8个字节。 RS1:0=2b00时,00H07H用作8个寄存器R0R7; RS1:0=2b01时,08H0FH用作8个寄存器R0R7; RS1:0=2b10时,10H17H用作8个寄存器R0R7; RS1:0=2b11时,18H1FH用作8个寄存器R0R7。 因此,后面可使用符号Rn来指代R0R7。硬件在确定Rn的具体位置时,它首先会确定PSW的RS段。或者也可使用Ri来指代R0和R1,且只需要1bit即可表征寄存器到底是R0还是R1。 (2)可位寻址区 我们对数据池的访问都是以字节为基础的,每给出一个地址,数据池即返回一字

49、节数据。但8051规定了位寻址,也就是它会通知数据池:我只需要某地址的某位即可,数据池无须返回8bit而只是 1bit。打个比方,如果地址是8bit的,那么规定7:3是该字节的地址,2:0作为位的地址,数据池接收信息后,立即首先使用7:3定位到该字节,然后使用2:0定位到这8个位的哪一个位,读取之后进行返 回。使用位寻址写也是同样道理,8051处理器会送出一个位的写数据,且只希望数据池对该字节的该位进行改写,其他字节、其他位都无须改变。 这块位寻址的范围是20H2FH,也包含了32Byte的空间。开发者的控制位可以存放在该区域,这样处理器可以迅速获取该位值。如果不存放在该区域,获取某特定位值的方式只有首先读到整个字 节,然后“与”操作上的某定值,最后再移位,只有通过这三个步骤才能确定该特定位的数值。可位寻址区对于迅速读写位数据非常有帮助。 (3)通用RAM区 DATA区剩下的部分(地址范围为30HFFH)可以用作通用RAM进行操作。 1.6 8051的重要寄存器 以上对8051所能访问的区域做了总结。一般来说,8051会把经常使用的数据放在DATA区,因为它只要8bit地址线,而且它有可位寻址区,适合存放标志位,8051读写

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料


经营许可证编号:宁ICP备18001539号-1