你好,
DSP芯片为C6713B,开发板为6713DSK,通过2×40引脚的J4(EMIF接口)连接了FPGA芯片,在CE2空间分别配置了22个寄存器,地址分别为 0xA0000000 (DPR0)、0xA0000100(DPR1)……0xA0000800(DPR8)……等。
FPGA程序已经固化,DSP的EMIF也配置好,DSP程序之前运行正常,一切都正常,CCS版本为6.1,但就是这同样的DSP程序,这几天突然调试失败,单步调试发现,当对某个FPGA寄存器进行写操作时,如
*(unsigned int *)DPR10 = 0x00010000;
这行代码里将DPR10寄存器的bit-16 置1,运行这一条代码之后,在CCS的Memory Browser里发现,不仅这个寄存器的bit-16变成了1,其他所有FPGA寄存器的bit-16都变成了1,更让人费解的是,在Memory Browser里发现,整个CE2空间(A000 0000 — AFFF FFFF)的bit-16全部变成了1!
这个现象很奇怪,按EMIF原理,外部地址EA总线某一时刻只能选通一个地址,即同一时刻只能是某一个FPGA寄存器进行写操作,但是为什么会影响到别的外部存储器的值呢?
急切请指教,感激不尽!
Tony Tang:
这跟EMIF不会有什么关系,关键在于FPGA对地址信号是怎么译码的。
Bruce Xiangcai Zhang:
回复 Tony Tang:
地址总线在每个FPGA寄存器之前都有一个比较器,只有地址和比较器预设的地址信号相等时才输出使能信号,才能接着往寄存器里写东西。
之前的调试一直好好的,运行完全正常,意味着FPGA里边的地址译码也完全正常,问题就出在debug无数次之后突然出现了这个情况,同样的代码,同样的CCS工程,是哪儿出问题了?
Bruce Xiangcai Zhang:
求助TI工程师和DSP大神啊,这种情况会是EMIF控制寄存器配置的问题吗?我能肯定FPGA程序没有问题,地址总线EA译码没有问题。
CE2控制寄存器配置如下:
*(unsigned volatile int *)EMIF_CE2 = 0x30D3C321;// CECTL2 in C6713 datasheet// 0011 0000 1110 0011 1100 0010 0001// bit 31-28 WRSETUP=3h// bit 27-22 WRSTRB=3h// bit 21-20 WRHLD=2h// bit 19-16 RDSETUP=3h// bit 15-14 TA=0h// bit 13-8 RDSTRB=3Ch, 60// bit 7:4 MTYPE=2h, 32位异步接口, FPGA寄存器// bit 3 reserved, default 0// bit 2-0 RDHLD=1h我该怎么检查是不是控制寄存器配置的问题?
Tony Tang:
回复 Bruce Xiangcai Zhang:
CCS的memory view显示是根据总线返回来的值显示的,数据线上是什么,它才显示什么,而数据线上的内容必然是外部提供的,而不是内部的。
我怀疑是不是FPGA的代码改了,或者FPGA译码,你说的比较电路逻辑上有问题。
你分配的地址0xA0000000 (DPR0)、0xA0000100(DPR1)……0xA0000800(DPR8)……等, 举个例子当DSP送出地址0xA0001800 时,FPGA对数据线是如何处理的呢?
Bruce Xiangcai Zhang:
回复 Tony Tang:
你好,
感谢回复,拿另外一个地址举例吧,当DSP送出地址0xA0000800时,FPGA程序里的八位地址总线是EMIF地址总线的其中七位(EA8~EA14)加上CE2,也就是ADD[7:0] = [CE2, EA14, EA13, EA12, EA11, EA10, EA9, EA8],此时FPGA内部的八位地址总线ADD上的值为0000 1000,而这个地址对应的比较器预设的八位值也是0000 1000,由于两个值相同,比较器输出地址使能,DSP的EMIF数据总线ED[31:0]才能往相应的FPGA寄存器DPR8里写数据。
体现在CCS debug里的过程里就是:单步F5执行如下代码(DPR8 寄存器的bit-16置1,其余位全部清0)
*(unsigned int*)DPR8= 0x00010000那么在CCS的memory browser里可以看见0xA0000800地址的数据的确变成了希望看到的 00010000,正常情况下其余地址的值不变,之前的大部分时间里都是正常情况,也偶尔出现过不正常的情况,也就是观察其余CE2空间的地址,发现bit-16全部变成了1,比如地址0xA0000900 原来的值是00000000,运行上面的代码后就变成了00010000. 以前没有在意,重启CCS,重新build,反复折腾几次后就好了,但是最近无论怎么重启,问题一直存在。
FPGA程序是调试过多年的固化版本,经过历届师兄师姐检验的,DSP程序是新编写的,所以我觉得大概率是DSP这边出了问题,但是不确定是代码的有问题还是CCS 6.1本身的问题,所以请问贵司专业的工程师,排除FPGA的问题,还有什么思考的思路?
Tony Tang:
回复 Bruce Xiangcai Zhang:
按你上面说的,对于FPGA来说,0xA0000800与地址空间0xA0000800~0xA00008FF中任一地址都是一样的,因为低位地址FPGA不看的,只要ADD[7:0] = [CE2, EA14, EA13, EA12, EA11, EA10, EA9, EA8]满足条件即可,其它地址线是什么状态FPGA不管的。
而且还不止低位地址这点空间,对于0xA0000800到0xAFFF8800这一段高位地址空间也都是一样的。所以你会在很多地址上看到同样的值,因为FPGA的比较器对这些地址都满足译码条件了。
Bruce Zhang1FPGA程序是调试过多年的固化版本,经过历届师兄师姐检验的,
不好说。
Bruce Xiangcai Zhang:
回复 Tony Tang:
hi,感谢耐心解答,
事实上正如你所说的:
Tony Tang0xA0000800与地址空间0xA0000800~0xA00008FF中任一地址都是一样的
,
Tony Tang对于0xA0000800到0xAFFF8800这一段高位地址空间也都是一样的
在memory browser里看到的确实是这样。但是注意到,我们的FPGA寄存器是按照0xA0000000(DPR0),0xA0000100(DPR1),0xA0000200(DPR2)……的规律编址的,不在前面quote里你说的两个区域,事实上正常工作的情况下,每个DPRx系列寄存器的值都是写什么就显示什么,现在的问题是,不同DPRx寄存器大部分位置也是写什么就显示什么,唯独的区别在于bit-16这一位,唯独这一位受任意一个DPRx寄存器赋值的影响,在整个CE2空间0xA0000000~0xAFFFFFFF上bit-16这一位的值都在同时翻转,写1的时候全部写1,清零的时候全部清零,这现象跟我们的设计原理明显不符。
PS,实验室有三块6713DSK,我昨晚换上一块新的DSK调试发现,CE2空间bit-16同时翻转的问题不再存在,这样一对比能大概率排除FPGA程序的问题了吧?难道6713DSK的硬件出问题了?