运动估计IP核在ML403中执行的结果不一样,经过一个星期的调试,问题初步得到解决。

将自己编写的运动估计IP核通过PLB总线与 ML403的ppc405相连,但是结果不正确。从下图可以看出:

 

错误的meIP执行结果

我们使用的序列是标准测试序列foreman.qcif的第1帧做当前帧,第0帧做参考帧,对于宏块左上角位置(16,16)的宏块,使用纯软件的结果是0x7d0267,即mv=(5, -1),sad=0x267;使用硬件IP得到的结果是0xa80285,即mv=(0, 2),sad=0x285;我们设计的ME核的结果见文献:

Yang, K.-M., Sun, M.-T., Wu L, “A family of VLSI designs for the motion compensation block-matching algorithm,” IEEE Trans. Circuits and Systems for Video Technology, vol. 36, no. 10, pp.1317-1325, Oct. 1989.

我们使用VHDL语言将它实现,在ISE中使用ModelSim做了后仿结果是正确的,仿真图见:

modelsim的后仿真结果

可以看到它的结果是正确的:0x7d0267。

那么我们错在那里了?

1、怀疑是执行时钟的问题,是不是太快了(100Mhz),于是开始降频到50Mhz和25Mhz,问题依旧。

2、怀疑是PLB总线的问题,于是将它移植的OPB接口,问题依旧。

3、怀疑是逻辑资源占的太多了(整个设计占了XC4VFX12的93%),place或route时处理问题(因为某些PE单元的工作时正常的,从运算结果可以看出),于是使用ML402进行试验,将同样的IP核挂载到Microblaze的OPB总线上,结果依旧。

4、没辙了,唯一的救命稻草是Chipscope pro了,经过一天的学习,我们开始捕获一个PE单元的内部信号(这里是PE8),具体的结果见下图

chipscope的pe8的错误信号图

其中的b信号是当前宏块的象素值:可以看出它的输出顺序是127,140,142,133,208,166,121,119,...

但是我们取出这块数据,我们希望的数据顺序是133,142,140,127,119,121,166,208,....

所以这是因为PPC405是大端工作模式,而我们的ME  IP采用的是小端工作模式所致。于是在数据输入的时候先转换为小端模式,问题解决了,大端到小端的程序如下:

  small_endian_value = *(pointer1);
  byte0 = small_endian_value & 0xff;
  byte1 = (small_endian_value & 0xff00)>>8;
  byte2 = (small_endian_value & 0xff0000)>>16;
  byte3 = (small_endian_value & 0xff000000)>>24;
  big_endian_value = (byte0 << 24) + (byte1 << 16) + (byte2 << 8) + (byte3);

正确的结果如下:

正确的meIP执行结果

相应使用chipscop pro捕获的数据是:

chipscope的pe8的正确信号图

同样的大端小端问题还出现在视频输入IP中,这个问题正在调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值