使用chipscope来观察coreconnect总线时序的第三篇博文,轮到opb了。
On-Chip Peripheral Bus的作用:
1,连接具有不同的总线宽度及时序要求的外设,以使这些外设能够尽量减少对 PLB 性能的影响。
2,一些低速的设备都连接在 OPB 总线上。像RS232,CF卡控制器,PS2控制器。
使用的软件是ISE9.1i,EDK9.1i,chipsocpe9.1.03.
ISE和EDK是没有打SP的,但是chipsocpe是chipsocpe9.1.03的,如果用chipsocpe9.1.01的,EDK生成硬件时会报错。
本文使用的例程还是xilinx提供的在XUPV2P开发板上完成的Slide Show using 256 MB DDR Memory的例程。http://www.xilinx.com/univ/xupv2p_demo_ref_designs.htm
这个例程这样工作的:
首先,从CF卡里读取多个BMP图片的数据,去掉BMP的头信息之后,把RGB的数据放到内存中。
同时,每个BMP图片在内存中的地址都被记录。
最后,PPC通过DCR总线向把要显示的图片的地址写给plb_tft_cntlr_ref,plb_tft_cntlr_ref 就会根据这个地址从内存中读取数据进行显示。PPC通过传不同的地址给plb_tft_cntlr_ref,这样就能显示不同的图片,做到幻灯片的效果。
这样的话,就需要PPC向plb_tft_cntlr_ref的SDCR端口写图片在内存中的地址,照我想,最直接的方法是通过PPC的MDCR端口由DCR总线plb_tft_cntlr_ref的SDCR端口写图片在内存中的地址。像我第二篇博文那样访问DCR会更直接。
http://xilinx.eefocus.com/utoo/blog/10-02/185025_1f4ec.html
但是,这个例程并没有这样做,PPC的MDCR是NO connection的,那他是怎样向plb_tft_cntlr_ref的SDCR端口写图片在内存中的地址呢?
这个例程是这样的:PPC的PLB接口->PLB->plb2opb_bridge->OPB->opb2dcr_bridge->plb_tft_cntlr_ref的 SDCR接口。感觉绕了一大圈。
给它这么一绕,差点给它绕晕。既然SDCR接口得到的数据的源头是PPC的PLB接口,那么SDCR上的两个寄存器的地址是映射在PLB的地址空间上。我们看看地址就明白了。
首先,看一下与PLB有关的地址空间。PLB_ddr的地址是0x00000000--0x07ffffff。
而plb2opb_bridge有两个RNG,RNG1是给OPB总线上那些外设的,可以看到OPB总线上那些外设的地址都在RNG1内。RNG0是给opb2dcr_bridge的,可以看到opb2dcr_bridge的地址也在RNG0内。这样SDCR上的两个寄存器的地址是映射在PLB的地址空间上。而且从中可以知道OPB的地址空间属于PLB的地址空间的。
我们可以在SDK的代码中,可以看到软件是这样访问DCR寄存器的。
因为DCR是32位寻址,而PLB上是8位寻址,所以0xD0000040右移2位会得到上面的0b000010000,至于前面的D,那是因为这两个寄存器放在了RNG0里。
为了验证上面的想法,我在例程中加入chipscope_opb_iba,来观察是否访问寄存器时要通过OPB总线。端口连上后使用默认配置。
连接chipscope_icon和chipscope_ila之间的控制信号。
打开chipsocpe可以看到IBA。
其实用IBA一个最大的好处就是EDK工具帮我们生成了所有的信号名,不用我们一个个去改。
我们可以这样来导入这些信号名。在当前的project的目录下找到implement这个目录。然后找到文件就可以导入了。
接着设置触发条件
下载硬件,在软件中设置如下断点。
当程序运行到断点时,chipsocpe可以采到这样的信号。
这样就验证了刚才的猜测。
总结:在FPGA上设计片上系统,了解总线的时序十分重要,在利用仿真和datasheet给我们提供的总线时序的基础上,通过猜测和思考并最后通过chipsocpe的验证,我们可以得到我们关心的总线信号的准确时序。
这样使用chipscope来观察coreconnect总线时序的博文就写完了,希望这三篇博文对大家有所帮助,起到抛砖引玉的作用。由于我还处于学习阶段,如果文章写得有什么不对的地方,还请大家指出。