fjh的笔记 https://bbs.21ic.com/?73864 [收藏] [复制] [RSS]

日志

嵌入式硬件平台设计要点(三) CPU的其他功能单元

已有 2544 次阅读2008-9-1 20:28 |系统分类:单片机

一个典型的MCU包含的功能单元方块图是如下所示:




1.1 BUS Control Interface单元


其实从第一章到这里,还是在谈论memory controller单元。CPU要访问挂在地址和数据总线上的外设就需要总线控制信号的参与,前面也提到了,目前为止大多数嵌入式CPU仍然保留着这种并行的BUS Interface控制单元。最常见的控制信号莫过于RDWRALE


 


RD常常连接外设的OEWR常连接外设的WEOE就是output enableCPU使能外设在数据总线上输出数据;WE就是write enable,使能外设允许CPU对其写入数据。ALE只出现在数据总线与地址总线低8位地址引脚复用的CPU中(如80518086),ALE意为Address Latch Enable,使能地址锁存,用于配合外部锁存器件的如74LS373573),当ALE信号有效时373芯片把当前总线上的低八位地址锁存住,送给外设,因为下一个时钟周期,总线上的就是数据的低八位了。


 


8086BUS 控制信号需要使用一片8288来进行译码,因为8086通过3个引脚S0-S28种不同译码状态来给出ALEDENMEM_WRMEM_RD等控制信号。


 


有时你还会看到有些CPU还有类似ARDYSRDYHOLDHLDA等的总线控制信号,8086就有(8086真是一款经典的CPU)。ARDY顾名思义,异步(传输)已准备好信号,SRDY则是同步传输已准备好。这俩信号都是外设(譬如一台打印机)输入给CPU的,意思是外设告诉CPU:我READY了,你可以读写我的某个地址数据。


 


HOLD也是外设给CPU的请求信号,意思是目前外设需要使用总线,CPU这边先别往总线上送数据。这种情况多发生在多CPU共享同一块存储器时,CPU 甲告诉CPU 乙,它要暂时取得总线的控制权。


 


HLDA顾名思义,就是CPU 乙对甲所提出的HOLD请求做一肯定的回应(Ack)。


 


2440上我们还可以看到更多一些的引脚。


譬如你能看到GCS0~GCS7,它们都是来自2440CPU的存储器片选控制单元(Chip Select Unit)。2440支持最大1GB的寻址空间,于是它设计了这样一个逻辑,把1GB的连续空间分为了8个区,每个区128M。当程序中寻址到该范围内的地址,这些片选信号自动有效,激活该地址上的存储器。CPU里有了这种片选控制单元,某种程度上简化了外部译码逻辑。


 


你还可以看到BWE0DQM0 ~ BWE3DQM3这四个引脚。这就是第一章提到的,当CPU数据总线宽度跟存储芯片的数据宽度不一致的时候,需要增加高低字节(高低字)控制信号。因为2440的寻址方式是字节寻址,而2440数据总线宽度32位(328等于4,所以要提供四个控制引脚以便能寻址到字节),SDRAM宽度则是16位,因此需要把上述的四个控制引脚作为SDRAM的低两位地址线,并且要两片级联(这里以第二章提到的16位数宽的SDRAM为例子,它们的连线方式例子如下图)。



 


1.2 时钟、上电复位


80年代的8086系统常用8284A来完成这两个工作。8284A可以输出5M8M的时钟,可以根据输入端经过内部的斯密特触发器产生可靠的RESET信号。


 


MCU一般用无源晶体来产生时钟,MPUDSP常用更准确的有源晶振。请注意一点字眼上的区别,无源VS有源,晶体VS 晶振


 


它们的区别:无源晶体没有电压的问题,信号电平是可变的,同样的晶体可以适用于多种电压的CPU,而且价格通常也较低,缺点是信号质量较差。


 


而有源晶振就是晶体再配上若干电路,并留了电源引脚,加电源即可输出稳定的振荡信号。对于时序要求敏感的应用,还是有源的晶振好,因为可以选用比较精密的晶振,甚至是高档的温度补偿晶振。有些CPU内部没有起振电路,这时只能选择有源晶振了。其缺陷是其信号电平是固定的,譬如3.3V,或者5V,需要根据CPU的电压电平来选择匹配,灵活性较差,价格也相对晶体高很多。


 


对于ARM等同时存在多时钟的系统,外部晶振也会不限于一个,如对于带实时时钟RTC功能的片子,一般外部配置一个手表晶振32.768k,同时再配个电池。




小小的出个题,貌似前两年比较多应届生面试时被问到:上图中1M电阻和两个电容的作用是什么?它们是否必须?只用万用表能否量出晶振起振了没?


 


对于复位电路,有廉价的实现方式,也有奢侈的实现方式。低档MCU一般使用最简单的阻容充电式电路,通过电容的充电时间来获得足够的复位时间。有些CPU是高电平复位,有些则是低电平复位,没关系,都可以用该阻容复位电路,低电平方式的CPU就把复位脚用电阻上拉然后电容接地,高电平复位的则相反对待。待电容充电完成,电位处于逻辑高(低),复位脚就失效,MCU开始处于正常工作状态。若想加入按键复位功能也很简单,把按键跟电容并联即可。


 


除此外,还可以使用电源监控和复位芯片如IMP707MAX691等,这属于较奢侈的实现方式。有些场合需要用外部的单片机或者CPLDFPGA来控制CPU进行热复位,这种情况下就是外部的IO口直接接到CPUreset脚了。


 


1.3 外部中断输入引脚


应该没有哪款CPU没有外部中断输入引脚吧?不用的话,设计原理图时应可靠地处置,譬如低电平触发的,就上拉;下降沿触发的,就接地,总之保证其状态不会被触发。


1.4 JTAG


JTAG貌似简单,但是暗藏杀机,一旦不注意,查都很难查得出来。不打算作详细分析了,网上好像也有相应文章。两个原则:芯片datasheet有说明的,按说明接;有官方应用电路的,按官方电路接;都没有的,按如下的图来接。




 


顺便提一下,对于同个电路上的多片同类器件,一般都可以设计成JTAG菊花链的形式把各片器件串起来,共用一个JTAG头,这样就省了很多电路板空间。譬如常用于电信语音音频处理单板上的DSP阵列,FPGA阵列,等等。菊花链电路一般通用如下,具体当然还是那句话:看datasheet




不过设计成菊花链的时候,很容易忽略一点就是电源的能力。不要小看多片片子级联后的电流消耗,我试过一片1117带不起三片ACTELFPGA A3P060,发现编程的时候软件老是提示编不了程。我开始时是带五片片子,别说编程,连JTAG链子都找不到。这是新人的错误,后人不该再犯。


 


1.5 MMU


两年前偶尔看到某网友说了一句:面试一个嵌入式系统工程师,不需要问太多东西,就让ta解释一下对MMU的理解就基本够了,足见理解MMU是需要不少基础知识的。MMU虽然没有外引电路引脚,但是往往设计嵌入式硬件平台的工程师是需要同时负责电路调试的,绕不开对MMU的配置(如果所用的CPUMMU的话),因此还是必须理解MMU


 


 


要理解MMU,必须首先了解这些方面知识:


A 扁平式(Flat)的内存访问机制,即之前提到的寻址方式和编址机制(再次体现了熟悉编址的重要性,因为寻址对于计算机来说是最基础的东西)


B 嵌入式系统内存管理的概念和意义。


C 虚拟地址、内存分页、存储器页帧的概念。


D多任务多线程操作系统的任务调度(任务内存分配,任务堆栈,越界)


E CPU cache的概念及其替换和写操作策略(计算机组成原理课程)


然后就可以顺利地阅读关于MMU的介绍文章了。我不在此画蛇添足。


下期预告:外设接口


1.6 本章题外废话

纸上得来终觉浅,绝知此事要躬行。

路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (2 个评论)

访客0FVh8L 2008-9-2 16:59
高电平方式的CPU就把复位脚用电阻上拉然后电容接地,低电平复位的则相反对待。 上述欠斟酌

QUOTE:
以下为fjh的回复: haha,兄弟眼好尖。偶写反了。
回复 abc 2008-9-3 14:38
关于2440寻址的那段说的还蛮清晰的