使用chipscope来观察coreconnect总线时序的第二篇博文,那就来看看DCR总线的时序吧。
Device Control Register Bus 有两个作用:
1,DCR总线是用于ppc general purpose registers和 DCR从设备的device control registers之间的数据传输。
2, DCR总线使configuration registers不在映射到内存地址空间上(它有自己的地址空间),从而减少了PLB总线的负荷,增加了PLB总线的带宽。
使用的软件是ISE9.1i,EDK9.1i,chipsocpe9.1.03.
ISE和EDK是没有打SP的,但是chipsocpe是chipsocpe9.1.03的,如果用chipsocpe9.1.01的,EDK生成硬件时会报错。
本文举例的系统如下:
这个系统很简单,除了dcr_ram是自定义的IP外,其它IP都是EDK里提供的。
dcr_ram,是一个DCRslave,它里面也很简单,我例化了一个RAMB16_S36的BLOCKRAM。这样的话,PPC405可以通过DCR总线来向dcr_ram读写数据。这样dcr_ram可以看成一个DCR的寄存器堆,总共有512个32位的DCR寄存器。
下面是系统的address
可以看到dcr_ram的地址是可以和DDR的地址是有重叠的,这可以说明它们的地址空间是不同的。
为了访问不同的地址空间,EDK里提供了不同的访问函数。
DCR的空间:XIo_DcrOut,XIo_DcrIn。
PLB的空间:XIo_Out32,XIo_In32。
这个IP的实现,如果有时间,我再写一篇博文来介绍。
这个系统的功能很简单,ppc405通过DCR总线,不断地写入和读出dcr_ram.
代码如下:
chipscope_icon和chipscope_ila的搭建方法,上一篇博文已经介绍,
http://xilinx.eefocus.com/utoo/blog/10-02/185008_93c8e.html 这里不再啰嗦。同样,把关心的信号引出。
与chipscope_ila连接
打开chipsocpe,修改信号名,设置触发条件。
TriggerPort2对应于我们的DCR write 信号,一旦有上升沿到来,这个chipsocpe开始保存采样。
这是因为还没有运行软件,chipsocpe没有扫到DCR write 上升沿,所以一直处于等待状态。
我们运行软件,进入debug状态。设置如下断点。
运行至断点。Chipsocpe出现信号。
这样就完成了对dcr_ram的写入。
为了证明数据确实被写入Blockram中,我再从Blcokram将数据读出。
这需要重新设置触发条件和断点。
TriggerPort1对应于我们的DCR read 信号,一旦有上升沿到来,这个chipsocpe开始保存采样。
从SDK也可以看到PPC也读到了正确的数据
总结: DCR总线的读写时序十分简单,只要我们观察到其时序,chipscope可以帮助我们做到这一点。
更重要的是,FPGA作为软硬件协同设计的平台,需要能做到软硬件的codebug,Chipscope+SDK的debug,将是最佳的选择。