最近的项目要在coreconnect上搭些外设,了解coreconnect的transfer的时序非常重要,coreconnect包括三大总线,我想就写三篇博文来简单总结一下coreconnect的transfer的时序。
第一篇是使用chipscope来观察coreconnect总线时序之plb时序
其实看coreconnect总线的transfer的时序有两种方法:
1,BFM进行仿真。这要建立仿真的工具,modelsim和所需的EDK的仿真库。这只要PC机就能完成,但是建立仿真工具比较麻烦,而且我自己建的仿真工具对一些外设仿真不了。像读写CF卡这些,我搞很久都搞不定,如果有人知道,请教小弟。
2,利用chipsocpe和EDK里提供的Chipscope Integrated logic Analyzer (ILA)来观察FPGA里实际的总线信号。但是这要有开发板。我想这是最准确的debug的方法。
其实EDK里也提供chipscope_plb_iba可以对PLB进行观察,但是我发现其实这个IP也是根据Chipscope Integrated logic Analyzer (ILA)修改完成,只是它把plb的所有信号列为观察的信号,但是其实有些信号我们根本都关心,有点多余,观察起来很费劲,所以还是用这个Chipscope Integrated logic Analyzer (ILA)来自定义自己所需观察的信号。
Processor Local Bus的作用:
1,PLB 总线是一种高带宽、低延迟、高性能的处理器内部总线。
2,高速的 CPU 核、高速存储器控制器、仲裁器、高速的 DMA 控制器等高性能、宽带宽的设备都连接在 PLB 上。
我用的是ISE9.1i,EDK9.1i,chipsocpe9.1.03.
ISE和EDK是没有打SP的,但是chipsocpe是chipsocpe9.1.03的,如果用chipsocpe9.1.01的,EDK生成硬件时会报错。xilinx的forum里有人讲。
这里要用的例子是xilinx提供的在XUPV2P开发板上完成的Slide Show using 256 MB DDR Memory的例程。http://www.xilinx.com/univ/xupv2p_demo_ref_designs.htm
这个例程是VGA_FrameBuffer从DDR中读取一行pixel的数据到VGA_FrameBuffer里的Block_ram,最后读取Block_ram里的数据进行显示。
我关心的是,VGA_FrameBuffer作为一个Master,用plb总线的哪一种transfer来读取DDR里面的数据。
整个过程如下:
首先,打开例程。在这里你会看到chipscope_icon和chipscope_ila,双击添加这两个IP。
添加后如下:
第二:修改代码,把关心的信号从VGA_FrameBuffer中引出。
第三:双击chipscope_ila设置参数。
1,采样数。
采样如果没有资源限制当然是越多越好,但是chipsocpe得采样数据是用片上的BlockRAM来存储,设置太大,综合时会报错。
2,Trigger Unit。
我要观察八组信号,所以使能8个Trigger Unit,设置如下:
第四:连接chipscope_icon和chipscope_ila之间的控制信号。
注意CLK要连接sys_clk_s。
第五,将要观察的信号连接到chipscope_ila。
这样就可以生成硬件了。
然后,下载硬件,并把软件也跑起来。
打开chipsocpe,点File下面那个图标连接到JTAG。
成功连接后,可以看到
这些triggerport对应刚才我们连接到上面的信号。右击可以修改triggerport名字。
修改后我们可以观察到这样的信号图:
这就是实际中64-bit Master 8-word Line Read From a 64-bit Slave的时序
。
这与64bitPlbBus.pdf的是大致相同,但是访问DDR要等16个clk才能得到数据。
总结:实际的总线时序和datasheet画的总是有一些偏差,有了chipsocpe真的对观察实际运行的总线时序帮助很大,但是就是综合一次比较久。