现在的位置: 首页 > 综合 > 正文

在FPGA上调试BOOTLOADER的经验总结

2014年01月07日 ⁄ 综合 ⁄ 共 1483字 ⁄ 字号 评论关闭

FPGA  DEBUG  FAQ

FPGA上单步跟踪调试程序的时候,遇到比较多的问题,现总结成FAQ如下:

1.[Q]:执行CPU TLBclear的时候有异常,PC为什么跳转到0xbfc00380异常?

[A]PC跳转到0xbfc00380,说明TLB填充异常,如果程序代码检查没有问题,则需检查FPGA的环境,比如修改CPU / DDRclock,经过测试,AXI总线clock修改为50M的时候,此问题解决。

2. [Q]:单步跟踪到跳转指令b copydone的时候,为什么跳出到0xbfc00200异常?

[A]:正常情况下这个跳转指令是不会有问题的,跳出到0xbfc00200表明FPGA运行有异常,这种奇怪的问题,可以首先怀疑CPUclock,修改AXI clock55M后,仍然有概率性跳出的问题,则继续分析BIT文件,重新综合一版BIT文件后,此问题解决。

3. [Q]AXI clock是否可以任意修改?

[A]AXI clock不是越小越好,也不是越大越好,一定要调到一个合适的经验值。验证如下:

60M,则执行TLB clear时挂掉;

50M,能单步跟踪很远,但是在执行b copydone的时候,会跳出到0xbfc00200异常;

40M,读DDR失败;

45MDDR下载失败;

80MDDR下载失败;

70MDDR下载失败;

55M,可以单步跟踪,一直执行到C语言的main主函数,OK

4. [Q]:为什么执行81000804:   cache   0,0(a1)这个非跳转语句的时候,直接跳到81000698:   mfc0    a0,config呢?

[A]:在跑copydone这段代码的时候,执行81000804:   cache   0,0(a1)这个非跳转语句的时候,直接跳到81000698:   mfc0    a0,config,这个很奇怪,而且是反复循环的这样跳转,经观察,并不是什么异常,后来发现tconcacheHS3000cache有差别,除了cache size不一样之外,cache channel也不一样,HS3000cache channel4路,而tconcache channel只有1路,修改cache 4路为1路之后,就ok了。

5. [Q]:为什么F8执行go的时候很快就停止了,PC指向了0xbfc00XXX

[A]start.S运行结束后,跳到了Cmain函数执行,需要在main函数中加入while(1)死循环进行测试,否则程序很快就跑完了。

6. [Q]:为什么无法写spi flash

[A]: 重新综合一个BIT文件后就可以了。

7. [Q]:为什么写spi flash后,重新上电,程序执行不对,串口没有打印?

[A]:首先huaya_uart.h文件中设UART_CLOCK为27500000。然后,DDR 没有初始化,即DDRreg文件没有编译进bin程序中去,将reg文件中的数据用汇编在start.S中写入相关寄存器,重新编译后,将gzrom.bin下载到spi flash,重新上电后,串口即有打印了。

8. 为什么FPGA加入CPU复位键后,调试器中下载到DDR中的程序没有运行?

[A]:上电后,CPU默认从0xbfc00000开始执行,则在调试器中下载程序到DDR的程序是不被执行的。要想从DDR开始执行,则应该去抢到优先执行权,比如先按住CPU复位键,执行inn, 此时调试器在不断的发送inn请求,然后release CPU复位键,则能进入DDR运行模式了。

抱歉!评论已关闭.