前言: 最近花了一点时间研究了一下一个日本古董级产品的系统电路,基于双8086的,以及看了一下飞思卡尔的ARM11核心片子i.MAX31的datasheet,忽然想写一些多年来玩MCU的所谓经验,自信能比某些单片机书籍写得要好。水平有限,错误难免,请拍砖,俺大方接受。
第1章 编址
1.1 如何编址
如何在MCU系统中,对其地址空间内的各种存储器、外设、IO准确唯一地编址,在李广弟的《单片机基础》(2000年8月,北航出版社)中已经阐述得很清楚,但是例子过于简单,也没总结出什么原则性的东西。对于一些memory map比较复杂的系统,这个问题是很重要的,应该把握一些原则来进行分析和设计。确定系统中的memory map是硬件平台设计的第一步。
首先需要分两种情况考虑:你所用的CPU是程序、存储、寄存器、IO统一编址呢,还是程序、存储和IO分别编址。但无论怎样,我们在确定每片空间时的原则是一样的,就是要按应用需要分配,而且要唯一,即一个地址对应一个存储单元(字节或者字)。
对于特定的CPU,其寄存器和IO所位处的地址空间,我们一般都不能动。因此确定memory map的关键是处理好程序(一般是ROM)和数据存储(一般是RAM或flash)的地址编址。(复杂的系统还可能有一大堆的外设地址)
多数嵌入式CPU在上电复位或受控复位后,都是从0000H地址开始取指令,8086是个例外,是从FFFF0H处开始取指令,原因是8086的代码段寄存器CS复位后值为FFFFH,偏移4位后就是FFFF0H了。
因此在编址时,系统的程序ROM(启动代码)必须编制在CPU上电后取指的地址,例如0000H。至于执行完这段启动代码后,系统是跳转到程序ROM的别的地方,还是跳转到数据存储空间去继续取指,那是以后的事。
在目前大容量存储技术发达的21世纪来说,系统中的程序ROM一般一块搞定,或者是片内FLASH搞定,不必要设计成多块,但是在我研究的小日本80年代的某个产品中,一块CPU对应的ROM都有10块8块,这是题外话。
相对于程序ROM,数据存储则很可能会很多片,因为一个复杂的系统中可能需要有nand flash,同时需要SRAM,SDRAM,DDR……等,以及还有各种特殊外设映射给CPU的地址,因此在设计时主要的编址工作在这里。
编址的工作实际上就是两件事情:一是确定数据总线的字长(8位,16位, 32位……),二是确定如何准确给出存储芯片(或外设芯片,以下省略)的片选信号。
确定数据总线的字长,影响着CPU与存储芯片的地址线的连接。因为CPU的编址数据宽度并不一定与存储器的存储单元宽度一致,举例说,8086是按照字节编址的,意思是说0000H这样的地址是对应一个字节,0001H地址则对应下一个字节,以此类推。但是对于16位宽的存储器(大部分都是),它的地址线上的一个0000H地址对应着一个16位字长的存储单元也即2个字节。这种情况下,在设计原理图时,CPU的地址线就不能跟存储器的地址线一一对连,而应该往前偏移一位,如本该A15-A00 对应存储器的A15-A00的,现在应该改为A16-A01对应连接存储器的A15-A00。这样,无论A00是0还是1,一次读写操作都涉及到2字节的内容。对于这种情况,一般在硬件电路上需要连接高字节和低字节的控制引脚,如80186CPU有UBE和LBE引脚。或者如ARM44b0,可以通过设置内部寄存器来配置数据总线宽度,这样就无需在外部连接UBE和LBE。
确定如何准确给出各存储芯片的片选信号,这就是体现设计者对地址空间如何进行分配的关键所在。当代码中要访问某个地址时,该地址的数值出现在地址总线上,每片存储芯片都能收到,而到底哪一片芯片该响应此地址,决定于片选信号(一般称为CS或CE),在那一刻没有被CS或CE的芯片,都得当哑巴,不能把自己的数据放到总线上。编址问题,核心就是如何构造准确的片选信号问题,而构造片选信号问题,核心就是如何摆弄各存储芯片的高位地址线的问题。
举个例子,譬如说要在地址空间总计64kB的51单片机中分配3片4kB的SRAM地址空间,简单起见,假设是从最低地址处开始分配。
4kB意味着有12根地址线A00-A11,而51的64kB地址空间是对应着16根地址线A00-A15的,那么对于每片SRAM来说,51多出来的4根地址线:A15-A12就是其高位地址线,产生它们自身片选信号就从这几根高位地址线里作**。
如何作**?仔细看李广弟的书就能清楚了。李广弟提到了两种方法,一种是线选法,一种是译码法。除了极其简单的系统外,要唯一、准确地编址都必须使用译码法。
理解了上面的描述后,更进一步,假如这3片4K 的SRAM 需要分配在0x8000开始的空间呢,或者更难一点,需分配在任意一个地址开始的空间,那又该如何设计呢?我所研究的系统中,8086的1M的地址空间中划分了非常多的地址,包括存储器地址和外设地址,译码电路非常复杂,需要大量的与、非门器件参与,当然今天一般是采用CPLD来统筹管理复杂外部地址的译码逻辑。
------------------------------------------------------ 本章题外废话:玩过很多款CPU,体现的是知识;能在很短时间内玩转一款新CPU,体现的是能力。
(待续) |