LocalBus总线原理2010-10-0121:32:09[上一篇|下一篇]硬件家园/查看(3545)/评论(1)/评分(0/0)相信搞硬件的朋友都应该对LocalBus总线非常熟悉,在当今的通信电子领域中,几乎所有的CPU小系统中都有它的身影。LocalBus总线又称为CPU总线,根据高低位地址线序的差异,又可分为MotorolaCPU总线和IntelCPU总线。古老的CS51单片机就是IntelCPU总线的典型代表,而我们常用的PowerPC就是MotorolaCPU总线架构,它是从60X总线衍变过来的(60X总线支持64、32、16、8四种可选位宽模式),由于LocalBus总线是直接从60X总线上通过桥片分出来的,所以它和60X总线是同步同频的,进行数据数据读写时与60X总线共享带宽,不需要内核提供额外的处理。如下图所示:DeviceBus(数据/地址复用总线解复用后的DeviceBus叫LocalBus)总线一般采用数据/地址线复用的形式,通常为32位宽,使用时需要将总线的数据和地址分离出来再分别接到目标器件的数据和地址端口,如连接到低速设备时还需要通过Buffer起来来进行驱动和隔离。在早期的设计中,通过用信号锁存器来分离总线中的数据和地址(如经典锁存器SN74LVC16373),不过现在基本上都是通过逻辑器件CPLD来进行解复用的。利用锁存器373对DeviceBus总线数据/地址解复用原理如下图所示。在上图中,L_ALE是地址锁存信号,低电平有效,当L_ALE出现一个低电平脉冲时,锁存器的输入端口对LAD[31:0]信号进行采样、锁存并从输出端口输出,直到下一个L_ALE低电平脉冲到来时,其输出状态才发生改变,DeviceBus总线在输出地址信号时将L_ALE信号驱动为低电平,输出数据信号时,将L_ALE驱动为高电平,锁存器正式利用这个特点轻松实现DeviceBus总线上数据和地址的分离。LocalBus总线上的数据读写分为同步模式和异步模式。在同步模式下,需要一个外部时钟信号供接收端和发送端共用,利用时钟信号的上升沿对数据进行采样,SDRAM、SSRAM等高速信号使用同步模式;异步传输模式下,不使用时钟信号对数据进行采样(芯片内部还是需要有系统参考时钟来产生时序的),而是利用片选信号CS、写使能信号WE和读使能信号OE对数据进行采样,使用异步模式的器件有FLASH、BOOTROM等。♦DeviceBus总线数据及控制信号列表及功能说明:1).LAD[31:0]:数据/地址复用信号,数据线宽度可设为8、16、32为三种模式;地址线根数可根据实际存储空间大小来选取,比如,16根地址线可支持的寻址空间大小为(针对8位宽存储器件,16位宽存储器件需要乘以2,其他类推):216=65536Byte=64KByte。做为地址线时是单向输出,三态总线,LVTTL电平。做为数据线时是输入/输出双向信号,三态LVTTL。2).CS_L:ChipSelect,器件片选信号,低电平信号,LocalBus总线上每个器件都有一个独立的CS_L信号,某个器件上的CS_L信号为低电平时表示这个器件被选中,LocalBus总线主控制器可以对其进行读写操作;3).WE_L:WriteEnable,写使能信号,低电平有效,LocalBus总线上的WE_L信号为低电平时,表示在进行写操作,在异步传输模式下,它与CS_L信号配合对写数据进行采样;4).OE_L:OutputEnable,读使能信号,跟WE_L类似,在异步传输模式下与CS_L信号配合对读数据进行采样;5).ALE_L:地址锁存信号,低有效,其功能已经在前面介绍过了,不在赘述;6).Rdv:应答信号,对读写操作进行应答;7).INT:中断输入信号;8).RST_L:复位信号;9).CLK:参考时钟信号,只在同步传输模式下使用,异步模式下不使用,设计中将其悬空即可。实际应用中,一般只使用LDA/CS_L/WE_L/OE_L/ALE_L这些信号,其他信号作为选用。上面介绍的是针对IntelCPU总线的,MotorolaCPU总线有一点点差异,后者将OE_L和WE_L合并成一根控制信号,称为R/~W,当其为高电平时表示“读”操作,为低电平时表示“写”操作。另外,后者还有一个DS控制信号,当其为低电平时表示总线上传输的数据是有效的,否则为无效。如果LocalBus总线上挂SDRAM等高速存器器件时还需要行列选择信号RAS和CAS以及数据奇偶校验信号DP。♦CPU总线的大端模式和小端模式Intel系列的CPU总线是小端模式,也叫Little-endianbyteordering,其特点是低有效字节在低地址位,高有效字节在高地址位。MotorolaCPU及PowerPC架构总线是大端模式,也叫Big-endianbyteordering,其特点是低有效字节在高地址位,高有效字节在低地址位。所以在使用大端模式总线连接外部器件时需要将地址线进行倒序,即最高位地址线与外部器件的最低地址位相连,最低地址位地址线与外部器件的最高地址位相连,其他依次连接。♦LocalBus总线的读写时序下图为FLASH器件MX29LV002CBTI的读时序,该FLASH器件提供的LocalBus接口,Addresses信号是从LocalBUS地址信号(已经解复用了),Outputs是Localbus的数据信号。在第一个时钟周期内,Address信号线上传输的是目标器件的地址信号,此时CS#、OE#、WE#都处于高电平无效状态,并且Outputs输出的数据无效。在第二个时钟周期内,CE#变为低电平,表示目标器件已经被选中,接着OE#也变为低电平(大多数情况下,CS#和OE#几乎是同时有效的),表示开始进行读操作,主控制器在CE#和OE#都为低电平有效的时候对Outputs上的数据进行采样(通常做一定的延时后再采样,以保证采样数据的正确性),采样到的数据即为要读取的数据。WE#和OE#不会同时变低的,因为LocalBus总线是半双工工作方式,不可能同时进行读写两种操作。(点开看清楚大图)下图为FLASH器件MX29LV002CBTI的写时序,在WE#和CS#同时为低有效的情况下,Flash器件从数据总线上采样数据,然后写到指定的地址空间里去。对比下这两个图,我们会发现,读操作时,OE#信号差不多在ADDValid周期的中间部分有效,而写操作时,WE#信号几乎在ADDValid周期的开始部分有效,为什么有这个差异呢?其实想想也不难,因为读操作流程是:总线控制器给目标器件发读取数据指令,等目标器件收到指令后再将总线控制器要读取的数据传回来,这中间有线路的延时及目标器件的延时。而写操作则不然,可以将写操作命令和要写的数据同时传到目标器件那边去,几乎没什么延时。♦LocalBus总线的典型应用如下图所示:如上图所示,CPLD对Devicebus总线进行了解复用后连接到FPGA、FLASH和NVRAM(CPLD可以对LocalBus总线的大小端模式进行切换),利用CS0_L、CS1_L和CS2_L三根片选信号线来区分Localbus总线上的三个器件。FPGA使用了32根数据线中的16根,32根地址线中的26根。我们再仔细看一下其地址线标号,为A[26:1],我们也许会疑问,会不会是搞错了啊,怎么不是从最低位地址AO开始啊?是的,我没有写错,你也没有看错,实际上就是从A1开始的。这是因为当数据线宽度为16位双字节模式(也叫WORD模式,四个字节叫DWORD模式,单字节叫BYTE模式)时,Localbus总线的A1变为地址的最低位(A0悬空不用),用它去连接器件的最低位地址线A0。这其实也很好理解,因为对于同样大的存储空间来说(我们可以将存储空间想象纵横交错的棋盘状),当数据线D(棋盘中的横线)增加一倍的情况下(从8位增加到16位),要想保持数据线和地址线的乘积不变(存储空间容量不变),那么就要将地址线减少一半(对于译码前的数据线来说,就是减少一根线)。下面的NVRAM用的是8位BYTE模式,所以最低位地址仍然用A0去接。