基于FPGA的自定义总线MCMB的设计与实现
(1) SMC接口模块
实现SMC总线到Wishbone总线的转换,SMC总线至Wishbone总线接口转换模块如图2所示。本文引用地址://m.amcfsurvey.com/article/189629.htm
该模块的信号转换可以分为以下三种:
1)数据地址线
地址线上将SMC总线的地址线SMC_A[15..0 ]译码成Wishbone地址总线ADR_O[15..0]。数据线上使SMC总线的输入输出复用数据线SMC_D转换成两个分开的单个输入输出信号DAT_O[15..0]和DAT_I[15..0]。
2)控制信号
当ARM发起SMC总线操作时,我们根据SMC总线操作的类型,译码得到以下输出控制信号:WE_O、 CYC_O、 SEL_O[3..0]、 CTI_O[2..0]、STB_O和BTE_O[1..0]。
SMC总线的读写命令分别为NRD和NWE。当NWE为低时,表明当前操作是写操作。NRD为低时,表明当前操作是渎操作。Wishbone总线的WE_O信号只在写操作时有效,所以当FSC0和NWE都有效时,便将WE_O信号置1,证明这是一个有效的写操作,当FCS0有效但NEW为低时,为读操作。
CYC_O有效表示Wishbone总线事务的开始。当ARM发起SMC总线操作时,可由SMC总线的FCS0信号译码得到。
SEL_O[3..0]代表Wishbone数据总线上的有效位。在系统的设计中将SEL_O[3..0]置全1,表明数据线上的每一位数据郜一直有效。
CTI_O[2..0]译码Wishbone总线的操作是单字操作和块操作。选择SMC总线地址线A[17]和A[18],A[17]定义为SMC_LAST;A[18]定义为SMC_BURST。这两个信号用于对CTI_0 [2..0]的译码。当进行单字读写操作时,SMC_LAST和SMC_BURST均为低,CTI_O [2..0]译码为111;当进行块读写操作并且不是最后一个数据相时,SMC_LAST为低,SMC_BURST为高,CTI_O[2..0]译码输出010;当进行块传输且为最后一个数据相时,SMC_LAST和SMC_BURST均置为高,CTI_O[2..0]译码输出111,代表块传输操作的结束。
3)响应信号译码
当外设和MCMB总线进入等待状态时,需要产生NWAIT信号;当外设和MCMB总线状态异常时,需要产生中断信号。
Wishbone主模块有三个输入的响应信号,分别为ACK_I、ERR_I、RTY_I。当外设不能及时响应当前操作时,需要在SMC总线上插入等待周期。NWAIT是SMC总线的等待信号。当NWAIT为0时,ARM保持当前SMC总线操作,直到撤销NWAIT为止。
(2) SMC主桥接口模块
实现Wishbone总线到MCMB总线的转换,主要是对MCMB总线的各种状态进行译码,并将译码结果与上面的Wishbone从模块进行对接。模块如图3所示。
①数据地址
Wishbine从模块的地址和数据的输入输出是分开的,但在MCMB总线上,地址和数据复用一个线,在这主桥中有个译码逻辑,将数据和地址进行转换。即将ADR_O [15..0]、DATA_I [15..0]和DATA_O [15..0]译码为AD [15..0]。
评论