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