TI中文支持网
TI专业的中文技术问题搜集分享网站

用6713DSK的EMIF读写FPGA 寄存器,配置为32位异步存储器,调试过程中对某个寄存器进行写操作时,其他所有寄存器的值都会同时变化

你好,

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的硬件出问题了?

赞(0)
未经允许不得转载:TI中文支持网 » 用6713DSK的EMIF读写FPGA 寄存器,配置为32位异步存储器,调试过程中对某个寄存器进行写操作时,其他所有寄存器的值都会同时变化
分享到: 更多 (0)