huanggeli / yolov3tiny-ZYNQ7000

a Real-time image recognition project with RTL accelerator and ZYNQ Architecture
MIT License
36 stars 6 forks source link

程序卡在 wait_done #2

Closed DragMou1204 closed 7 months ago

DragMou1204 commented 11 months ago

我已经仔细检查了硬件连线,vitis软件的中断部分也仔细和我的板子的中断例程进行了对比,还是接收不到apdone的中断,摄像头已经有显示了,请问您有什么意见吗,accel_conv的ip还需要在vivado中进行什么设置吗,引脚定义之类的?

DragMou1204 commented 11 months ago

image 我的工程中没有在design source处添加这个accel_conv,直接在block design导入的ip,应该没有影响吧

huanggeli commented 11 months ago

考虑检查以下几点: 1.硬件部分: accel conv的复位信号应该是正复位即peripheral_reset,与AXI通用IP通常采用的反复位reset_negative(resetn)不同 2.软件部分: 检查中断的绑定是否正确,中断的执行包括:中断信号->GIC->CPU->中断处理函数->回调函数 您需要检查外部中断在GIC中的编号是否正确(通常在头文件或源文件的开头中声明,zynq7000中的PL中断默认绑定编号是61),中断是否注册为CPU异常(通常在头文件或源文件的开头中声明,zynq7000的编号是5),mpsoc架构请自行查阅手册。 #define XIL_EXCEPTION_ID_IRQ_INT 5U //cpu异常绑定例子 若仍不能解决问题,则可以先使用中断例程熟悉中断的触发方式,而后逐个排查。 在本项目中,ap_done仅为一个简单的中断信号标志着任务完成,中断回调函数也仅修改了内存中的一个标志信号量,这个中断的处理并不复杂,如有条件可以在中断的各个过程逐级调试。

DragMou1204 commented 11 months ago

你说的这些我都检查了,我觉得不是中断的问题,我检查了很多遍中断了,也对比了很多网上的中断例子,实在是找不到原因,传输给dma和卷积计算ip的数据我也没改啊

huanggeli commented 11 months ago

我没有碰到过类似的问题,考虑其他细节呢?例如: 先拿逻辑分析仪ILA抓apdone的变化,有拉起就是中断问题,没拉起就是IP核内部的问题 然后检查IP核内部: 检查DMA位宽必须得是64位,DMA配置必须完全相同 然后拿ILA抓一下DMA给卷积IP的数据和回传的数据,方便的话截个图我看看

DragMou1204 commented 11 months ago

image apdone上升沿触发没结果,apdone没有升高电平,dma配置是完全相同的

DragMou1204 commented 11 months ago

怎么抓DMA给卷积IP的数据和回传的数据,没有触发的该怎么抓

huanggeli commented 11 months ago

apdone没拉起就是卷积内部的问题,DMA给卷积IP的数据是AXI Stream协议,传输肯定有握手信号,握手信号tvalid的拉起标志着传输开始,或者末尾标志tlast代表传输完成。抓上述两个信号的低到高跳变,跳变前后看tdata有没有传输数据

DragMou1204 commented 11 months ago

为什么还是什么都没呢,是我别的地方有问题吗

DragMou1204 commented 11 months ago

那个axi4 stream subset converter设置有什么讲究的吗,我有时设置的没有显示

huanggeli commented 11 months ago

那抓一下控制总线AXI lite control,这个是任务信息的传递,是CPU直接连接conv ip的传输信号线。如果AXI lite control有数据那就是DMA配置的问题,如果Lite control也没有数据,请确认是否正确使用了ILA。如果正确使用了ILA,blockdesign发我看看,另外抓一下其他的AXI信号线看看情况。

huanggeli commented 11 months ago

Axi4 stream subset converter的作用有几个,不同的converter作用也不同。 以源项目为例: 从相机输入端开始开始算,第一个converter用于把RGB565转RGB888 第二个(也就是preprocess前的converter)用于把图像的3通道转为4通道(第四通道补0) 第三个(也就是preprocess后的converter)用于把图像的4通道转为8通道(5-8通道补0,同上)

DragMou1204 commented 11 months ago

design_1.pdf

image 设置的slot0和slot1的所有valid上升触发,都没有触发,是我哪里设置错了吗

huanggeli commented 11 months ago

我看你design的slot0是连的控制线,这个不可能不触发的,否则就是AXI interconnect整个都没工作,如果图像能显示,你AXI连DMA的控制线也一定会有握手信号,考虑一下ILA使用方法是否正确:ILA启动后,需要在vitis运行项目程序才会有触发

DragMou1204 commented 11 months ago

我对accel_conv ip和dma 的axi-lite 的控制线和数据线在整个程序运行过程中进行了触发设置,全都没有触发,别的地方都是有触发的,我的ila设置应该没有问题,dma的设置也没有任何改动 image design_1.pdf 我怀疑可能是cpu对这两部分的软件设置部分存在问题,硬件连线我也检查了很多遍了,没有问题

DragMou1204 commented 11 months ago

image 这个0x10003超过32位了啊,这个数传输的正确吗

huanggeli commented 11 months ago

0x10003是20位呀,一个十六进制是4个bit,我这里是能跑的。你看一下是不是头文件的设置问题,就是#define关键字的配置,我的配置是针对zynq7000的。如果按你说的其他IP有反应这个没反应那就是硬件地址配置问题。

DragMou1204 commented 11 months ago

dma和卷积ip的基地址设置都没有问题

DragMou1204 commented 11 months ago

dma模块需要软件配置吗,我看只有 image 这一部分有gua关于dma的配置

huanggeli commented 11 months ago

默认配置

#define X_AXI_DMA_SEND_RST_ADDR      XPAR_AXI_DMA_0_BASEADDR
#define X_AXI_DMA_SEND_ADDR_0        XPAR_AXI_DMA_0_BASEADDR+XAXIDMA_SRCADDR_OFFSET
#define X_AXI_DMA_SEND_ADDR_1        XPAR_AXI_DMA_0_BASEADDR+XAXIDMA_CR_OFFSET//channel control
#define X_AXI_DMA_SEND_ADDR_2        XPAR_AXI_DMA_0_BASEADDR+XAXIDMA_BUFFLEN_OFFSET//
#define X_AXI_DMA_RECV_RST_ADDR      XPAR_AXI_DMA_0_BASEADDR+0x30
#define X_AXI_DMA_RECV_ADDR_0        XPAR_AXI_DMA_0_BASEADDR+0x30+XAXIDMA_DESTADDR_OFFSET
#define X_AXI_DMA_RECV_ADDR_1        XPAR_AXI_DMA_0_BASEADDR+0x30+XAXIDMA_CR_OFFSET
#define X_AXI_DMA_RECV_ADDR_2        XPAR_AXI_DMA_0_BASEADDR+0x30+XAXIDMA_BUFFLEN_OFFSET
#define DMA_RESET_VAL               0x04
#define DMA_READREG_MASK            0x10003

软件初始化

void Setup_Accel_System(){
    Xil_Out32(X_AXI_DMA_SEND_RST_ADDR,0x04);//DMA MM2S发送口设置环通模式
    Xil_Out32(X_AXI_DMA_RECV_RST_ADDR,0x04);//DMA S2MM接收口设置环通模式
    usleep(1000000);
    Xil_Out32(X_AXI_DMA_SEND_ADDR_1,DMA_READREG_MASK); //0x10003 1bit启动DMA 0bit无意义 16bit设置中断阈值为1 ,即counter为1
    Xil_Out32(X_AXI_DMA_RECV_ADDR_1,DMA_READREG_MASK);//0x10003 同上,这是S2MM
    xil_printf("ACCEL System Setup Success!\n\r");
    return;
}

如果你确认XPAR_AXI_DMA_0_BASEADDR这个参数没有问题,那你看一看vivado硬件的地址配置对不对,就是block diagram那边设置的address map。

DragMou1204 commented 10 months ago

image 这个吗,这硬件导出地址是同步的啊,一样的

huanggeli commented 10 months ago

那看起来能排查的都排了,我暂时没有解决思路了,我近期会拿mpsoc的板子重构一下这个项目,如果我有碰到类似的问题会在这个贴子回复的。

DragMou1204 commented 10 months ago

好的,感谢您的解答

huanggeli commented 10 months ago

不客气,您解决了问题也可以留言解决方案提供大家学习

DragMou1204 commented 10 months ago

好的

DragMou1204 commented 10 months ago

image image 我看前两行代码是复位的意思吧,整个软件中都没有关于dma的控制,比如告诉dma读取地址都没有,是我哪里没有搞懂吗

huanggeli commented 10 months ago

DMA读取地址是在开始任务才传递的,初始化的代码就是这几行

---- 回复的原邮件 ---- | 发件人 | @.> | | 日期 | 2023年12月27日 19:29 | | 收件人 | @.> | | 抄送至 | @.>@.> | | 主题 | Re: [huanggeli/yolov3tiny-ZYNQ7000] 程序卡在 wait_done (Issue #2) |

image.png (view on web) image.png (view on web) 我看前两行代码是复位的意思吧,整个软件中都没有关于dma的控制,比如告诉dma读取地址都没有,是我哪里没有搞懂吗

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

huanggeli commented 7 months ago

您好,有用户反应wait ap done信号没反应的原因是移植过程中vdma2的错误配置导致的,可以考虑类似思路。

DragMou1204 commented 7 months ago

收到,我试试

---- 回复的原邮件 ---- | 发件人 | @.> | | 日期 | 2024年04月06日 22:20 | | 收件人 | @.> | | 抄送至 | @.>@.> | | 主题 | Re: [huanggeli/yolov3tiny-ZYNQ7000] 程序卡在 wait_done (Issue #2) |

您好,有用户反应wait ap done信号没反应的原因是移植过程中vdma2的错误配置导致的,可以考虑类似思路。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

DragMou1204 commented 7 months ago

我的 vdma2 配置跟您的项目一样,还是卡在这个地方

---- 回复的原邮件 ---- | 发件人 | @.> | | 日期 | 2024年04月06日 22:20 | | 收件人 | @.> | | 抄送至 | @.>@.> | | 主题 | Re: [huanggeli/yolov3tiny-ZYNQ7000] 程序卡在 wait_done (Issue #2) |

您好,有用户反应wait ap done信号没反应的原因是移植过程中vdma2的错误配置导致的,可以考虑类似思路。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>