8051软核处理器设计实战
上QQ阅读APP看书,第一时间看更新

第1章

8051架构描述

1.1 引言

8051是最流行的CPU。8051兴起于20世纪80年代,由intel开创。当然,现在intel已经不再理会这种低端的8位CPU,它主打的是通用处理器,也就是我们电脑上用的那种。因此,8051的架构不像ARM架构一样有专利的困扰,各位可以放心地将其应用在各自的项目当中。

8051和它的“后辈们”——x86的各种高端处理器相比,其优点是功能简单、架构单一。因此由8051这种8位处理器形成的MCU占据了单片机市场的主流。就算ARM公司费尽心机开发出各种小面积、高性能的处理器内核,它们也无法取代8051在开发者心目中的地位,原因在于8051处理器优越的性能。

本章将带领诸位去领略这款经典8位处理器的架构,让我们从架构这一方面了解它的优异性。

本书的目的是在FPGA上开发兼容8051的软核处理器。因此在开发之前,我们必须对它的架构非常熟悉。在探讨之前,必须明确一点,在FPGA上设计兼容8051的软核处理器到底应该设计到什么程度?笔者在上一本关于处理器设计的书《兼容ARM9的软核处理器设计:基于FPGA》中,对兼容ARM9的软核处理器进行了FPGA设计研究。当时的设计目的是要和原版的ARM9TDMI一模一样,仿佛稍微有一些不同,就没有设计成功一样。现在看来,其实大可不必。

这大概是“山寨”的必由之路:一开始对某原版产品分析得仔仔细细,列出基本功能,然后开始模仿,并模仿到每一个细节都相似,然后推向市场,声称开发出了一款功能与原版类似的产品。比如市面上经常看到的仿苹果手机,从界面到开机屏幕,再到桌面布局,几乎做到惟妙惟肖,真假难辨。然后呢?……

但我的“山寨”之路却不想停留在模仿表面上,原因在于软核处理器设计出来后,它的最大目的不是“炫耀”,而在于它的实用价值。它的的确确能够帮助开发者在FPGA开发板上玩出花样,玩出精彩,它最大的目的在于帮助更多爱好开发FPGA设计的人。既然如此定位,在“山寨”的路上就得前进一步,在原版的基础上进行创新和扬弃。

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

用嵌入式开发软件做什么,也就是嵌入式软件能起什么作用?嵌入式软件就是一个翻译机,主要是把C语言翻译成机器语言,也就是生成BIN文件。然后这些含有机器语言的BIN文件被软核处理器“吃”进去。这些机器语言对阅读者来说是天书,但对于软核处理器却是对口的。软核处理器会按照该BIN文件规定的一条条指令进行执行,那么C语言想表达的意思就得到了执行。因此嵌入式软件主要干的活就是翻译C语言。

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

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

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

另外一部分就是可以更改的。比如架构规定了两个堆栈指针,但项目只需要一个堆栈指针即可,C程序和汇编程序里面也根本不会用到两个堆栈指针,那么为什么还要两个呢?架构当初这么设计是为了照顾大多数人的需要,但现在,设计者既然自己设计了软核处理器,那么完全可以做到专用——可以任意设计处理器,需要什么硬件架构,就可以在FPGA上实现。

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

这个原则好比日常所使用的键盘。它有26个字母和标点符号、以及Esc、F1~F12、Insert、Delete、Home、End、PgUp、PgDn等按键。26个字母好比核心指令,你一个也不能省,省略了则不能叫键盘了,标点符号要看情况省,这就好比某些乘、除法指令,可以在某种特殊情况下省。至于Esc、F1~F12、Insert、Delete、Home、End、PgUp、PgDn等按键,你完全可以按需配置,无须学习既有键盘的那套规则。