打印

【蛋疼系列】第一章 编址

[复制链接]
3011|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fjh|  楼主 | 2008-8-26 20:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言:
    最近花了一点时间研究了一下一个日本古董级产品的系统电路,基于双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,体现的是能力。

(待续)

相关帖子

沙发
wb61850| | 2008-8-26 20:27 | 只看该作者

沙发!热泪欢迎蛋疼大虾献身说法!顶!

使用特权

评论回复
板凳
wb61850| | 2008-8-26 20:28 | 只看该作者

板凳!LZ果然是高手啊,高,实在是高啊,娃哈哈

使用特权

评论回复
地板
wb61850| | 2008-8-26 20:34 | 只看该作者

地板!席地而坐,虚心听课

使用特权

评论回复
5
wb61850| | 2008-8-26 20:36 | 只看该作者

希望LZ给大家带来更多的法喜!功德无量,鸭米托福

使用特权

评论回复
6
fjh|  楼主 | 2008-8-26 20:39 | 只看该作者

dd

第二章要明晚再上,先去玩几把游戏。

使用特权

评论回复
7
patrick007| | 2008-8-26 20:51 | 只看该作者

re

地址线的作用就是“使能cpu以外的可寻址部件(或者其中的某一部分)”
通常从全0地址开始用(其实就是一基址,给编译器用的,非要用高址,也没人拦着),所以地址线剩下的高几位,就去“激活”其他非内存的可寻址部件。

比如,一个器件里面有几个可读的寄存器,你叫把地址线的高几位连到他的使能上,然后接上数据线,从低位开始接,然后程序在读该寄存器的时候,地址线上相应的位会产生高电平或者上升沿,打开寄存器,改变高阻状态之类的,数据线上的数据就进cpu内的存储部件了,然后就可以用了。。。。。

不是很复杂

没事再看看非易失,dram,flash什么的,就没障碍了

使用特权

评论回复
8
fjh|  楼主 | 2008-8-27 07:28 | 只看该作者

re 7楼同学

编址问题我之所以提到第一篇来讲,是因为我个人认为这是嵌入式硬件平台原理图设计中数字电路部分最复杂的。当然,有些应用场合是简单的很,譬如你用51扩一片32K的SRAM,并且还是分配在 0000H ~7FFFH,那当然简单了,闭着眼睛画原理图都可以。

但是在很多场合下,你可用的地址空间是受约束的,你不能想分配到哪就到哪的时候,就体现编址工作的难度了。或者让你分析一个人家的系统的memory map,你很可能会看到一大堆由74逻辑器件搭建起来的地址译码电路,或者CPLD的原理图,这种情况下也是需要对编址有全面概念才容易去分析。

使用特权

评论回复
9
patrick007| | 2008-8-27 07:52 | 只看该作者

re

地址总线宽度,数据总线宽度,可寻址设备各种信号宽度,设备读写方式,可重配置性,,,,,,都可以影响

不过都是数字逻辑。

lz加油,**还是有一定意义的,再加点图片,例子就更完美了

使用特权

评论回复
10
HWM| | 2008-8-27 08:07 | 只看该作者

开篇就概念混乱,还能有何高见?

引楼主一段高论:

“首先需要分两种情况考虑:你所用的CPU是程序、存储、寄存器、IO统一编址呢,还是程序、存储和IO分别编址。
    前者是冯诺依曼结构,后者是哈佛结构,前者的典型代表是51、MSP430、ARM等CPU,后者的典型是2407DSP。部分CPU是两者的混合,譬如8086,程序和存储器在一块存储空间,IO则是另一片独立的空间。”

还望LZ了解历史,认真看书。有些东西前人已经早就已经搞得很透彻了,没必要再画蛇添足。

使用特权

评论回复
11
xwj| | 2008-8-27 08:13 | 只看该作者

呵呵,占位看扯蛋...

使用特权

评论回复
12
dld2| | 2008-8-27 08:55 | 只看该作者

关键看总线

使用特权

评论回复
13
fjh|  楼主 | 2008-8-27 11:21 | 只看该作者

re 10楼同志

“首先需要分两种情况考虑:你所用的CPU是程序、存储、寄存器、IO统一编址呢,还是程序、存储和IO分别编址。
    前者是冯诺依曼结构,后者是哈佛结构,前者的典型代表是51、MSP430、ARM等CPU,后者的典型是2407DSP。部分CPU是两者的混合,譬如8086,程序和存储器在一块存储空间,IO则是另一片独立的空间。”

还望LZ了解历史,认真看书。有些东西前人已经早就已经搞得很透彻了,没必要再画蛇添足。
----------------------------------------------

哈哈,确实是错了,不过个人认为对我所要阐述的主旨影响不大。写该文时是没打稿子没做功课,错误是肯定有的,所以篇前已提到。看来后续的文还是应该做好功课再写。多谢10楼。俺从没说要写高论,既然是新人园地,写的东东主要目的是给新人看滴,同时自己的认识错误也可暴露出来:)

PS. 我个人认为除了算法外,计算机中的其余东西都谈不上高论。

使用特权

评论回复
14
hjh2008| | 2008-8-27 13:04 | 只看该作者

LZ是个好同志!

    楼主你的高尚情操太让人感动了。在现在这样一个物欲横流的金钱社会里,竟然还能见到楼主这样无私奉献的人,无疑是我这辈子最大的幸运。让我深深感受到了人性的伟大。楼主的帖子,就好比黑暗中刺裂夜空的闪电,又好比撕开乌云的阳光,一瞬间就让我如饮甘露,让我明白了永恒的真理在这个世界上是真实存在着的。只有楼主这样具备广阔胸怀和完整知识体系的人,才能作为这真理的唯一引言者。看了楼主的帖子,让我陷入了严肃的思考中,我认为,如果不把楼主的帖子顶上去,就是对真理的一种背叛,就是对谬论的极大妥协。因此,我决定义无返顾的顶了!
   

使用特权

评论回复
15
zwfj2418| | 2008-8-27 16:21 | 只看该作者

没位置了啊

    LZ说的好,学习了~~~
    只是有人够狠的~~沙发抢了正常,板凳抢了理解,地板还抢?不理解...纳闷中.....
    继续等LZ的新东东.....
    坐在厕所学习ing~~~~~~~~

使用特权

评论回复
16
ch2003_23| | 2008-8-27 19:38 | 只看该作者

不错

正在看ARM,有用…… 
谢谢!

使用特权

评论回复
17
TS赵永强| | 2008-8-28 10:07 | 只看该作者

讲的很GOOD

使用特权

评论回复
18
fjh|  楼主 | 2008-8-28 19:42 | 只看该作者

举一个比较复杂的编址案例

以下举一个例子以说明:为什么需要深入地掌握编址的观念。有些场合并非大把的存储空间可以随你分配使用的。

下图就是我所提到过的那个小日本产品的其中一片8086的地址译码电路的其中一小部分(译码电路总共约12页,这里是第一页)。图中左边是8086的地址线A00 - A19 ,右边就是经过译码电路后的输出。

为因为手机的相机不好,我贴一下右边得出的地址范围,是我分析时做的笔记,这些信号大多还需要再经过二次或三次译码才得到最后的存储器片选信号!

附:

IO ports信号 *ADIO:地址 0E800~0EFFF H
RAM0信号:地址 0E800 ~ 0F7FF H
RAM1信号:地址 0F800 ~ 107FF H
RAM2信号:地址 10800 ~ 117FF H
*ADRAM信号:RAM0,1,2信号任一有效即有效,全部无效则无效。
(上述0E800~117FF H共12K 大小的RAM空间)

X轴ADPOSX:地址0EE00~0EE3F
Y轴ADPOSY:地址 0EE40~0EE7FH
Z轴ADPOSZ:地址 0EE80~0EEFFH
IO ports信号 *ADIOZ:地址 0EFC0H~ 0EFFH

BUBLE MEMORY: *ADBM的有效地址是 0EF40H~0EF4FH (只有16字节)

EROM Board Special Select信号*SS,地址范围F0000~FFFFFH内均有效。
ADSSF :地址范围0~3FFFFH,FxxxxH范围内均有效。
EROM Board Select信号 BS:地址 0~3FFFFH范围内均有效。
Bit OP 信号*ADBIT:地址 4****H 范围内均有效。
Expanded BUS信号 *ADEX:地址0~1FFFFh 范围内均有效。

使用特权

评论回复
19
wb61850| | 2008-8-28 21:10 | 只看该作者

hjh2008兄弟,你好让我感动!~

使用特权

评论回复
20
wb61850| | 2008-8-28 21:12 | 只看该作者

哦云会结束了,而我们这里的哦晕会才开始,加油!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

fjh

16

主题

56

帖子

0

粉丝