了解了
单片机内部的大致工作原理之后,我们或许对单片机如何读取指令代码和数据的过程存在一定的疑问,这就是
总线系统。
51单片机内部有三大块总线系统AB,CB,DB即地址总线,控制总线和数据总线。51系统式的存储形式是采用普林斯顿结构(冯·诺依曼结构)的,即数据和代码存放在重叠地址通过不同的控制总线控制不懂的物理存储位置读写。冯·诺依曼结构代码和数据是公用数据和地址端口的所以在执行程序的时候必须先读取指令,然后再读取数据这相对于哈弗结构来说,在一定程度上限制了程序的执行速度。借助下图可以适当说明一下冯诺依曼结构程序和数据的存储方式。外部ROM和RAM都是通过P2和P0作为地址输出,P0作为数据或者代码输入。通过CB开控制是读取代码,还是读写RAM。由于很多资源是公用的所以在执行速度上会受到一定的限制。
![](../img/eep/emb/emb-60673n3cxyn3myba.jpg)
冯诺依曼结构图
这里值得注意的是,上图是冯诺依曼的结构图,也是51单片机典型的外部存储器(包括程序存储器ROM和数据存储器RAM)扩展电路。扩展程序存储器和数据存储器唯一不同点是通过CB(Control BUS控制总线)控制时序的不同实现对不同存储器的操作。P0口为了满足地址/数据总线复用的功能,其内部具有和其他端口不同的结构。P0在作为地址输出时是具有‘0’,‘1’输出的,而且驱动能力比较强,在作为数据读入的时候是呈现高阻态的。
对于哈佛结构程序指令和数据指令分开组织和存储的,执行时可以预先读取下一条指令。在最简单的只有一级流水线的执行条件下,程序在读取本条指令的时候可以同时预取下调指令的数据,这样在执行速度会有一定的提高。
![](../img/eep/emb/emb-6067405arnncji2p.jpg)
哈佛结构图