开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)

1.简述 在上一部分中,使用Matlab将图片转化为txt的数据文件,现在使用这些数据进行逼近真实情况下的Modelsim仿真;同时简单说明下RTL代码中不太好理解的地方;
2.vivado block图 红框就是算法模块,我以前是将摄像头采集模块(也就是蓝框的模块)与算法模块封装成一个IP的,后面发现换不同的摄像头的话整个模块就需要修改,比较麻烦。所以这次将两部分独立开。同时为了方便调节阈值,算法模块整合成带AXI slave接口的模块,同时将识别目标坐标值传到ARM计算距离值。
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

3.算法模块结构 红色框为code文件层次,黑色框是AXI save接口的模块(可以使用vivado直接生成),所有的算法模块都例化在这模块下。橘橙色框中就是算法模块,其中camera_sync模块将摄像头采集模块中因为数据拼接造成的 2个Pclk 1个data 重新生成新的 1个Pclk 1个data 摄像头时序,这样方便后面算法处理;Bin_filter模块中包括RGB2YCbCR处理、阈值二值化以及腐蚀滤波;bounding_box模块获取目标物体的上下左右的坐标以及对目标包围盒框选;
在tb_sim直接例化算法模块的顶层进行仿真,tb中导入Matlab生成的txt数据文件,模拟一个从摄像头采集模块过来的真实摄像头时序,提高仿真的可靠性;
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

4.算法模块code的疑惑点 1)camera_sync模块
vsync_i信号是摄像头的场同步信号,如下图所示,一帧图像开始时会有一段时间为高电平,为了保证生成的新摄像头时序完整,将这个信号取反与复位信号相与,得到一个新的复位信号,在开始新的一帧图像时将这个模块中的所有信号复位,保证长时间运行数据不会出错。
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

2)Bin_filter模块
下图就是RGB2YCbCr,由于FPGA浮点运算比较困难,所以将系数全部乘以128整数化。
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

5.仿真tb文件 1)txt数据读取
通过readmemh函数读取txt文件数据,存到cam_L_data_mem和cam_R_data_mem数组中;
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

2)生成摄像头时序
(1)由于摄像头采集模块是2个Pclk和1个data,所以col_num就是640x2,加上120空闲时钟;row_num 480x1400,再加上8000空闲;开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

(2)注意这里产生新的时序与上面仿真模拟的时序不一样,如下图,FRAME_VALID和LINE_VALID分别为场同步和行同步信号;
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

(3)产生新的行同步信号;
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

(4)产生新的场同步信号;
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

(5)从数组中获取图像数据;
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

6.仿真波形 (1)tb生成的摄像头时序,与上面的datasheet时序图基本一致。
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

(2)生成的新的图像时序
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

(3)红框整个算法得到的目标坐标值与Matlab仿真的数字相差不大。与前面浮点整数化影响计算精度。
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

7.SDK软件 橘色框是AXI slave配置二值化的阈值;红框读取目标坐标;
蓝框做均值滤波;绿框是计算距离,分母参数是从Matlab仿真的那个公式计算出来的;
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

8.识别效果 识别效果如图,颜色识别受光线影响比较大,所以识别较暗区域比较困难。第二图是串口打印的数据,距离在48和49中间浮动,与实际物理距离相比,误差不大,当然这个精度容易受到环境的影响,如果想提高精度最简单办法,将摄像头的镜头换成无畸变的,同时尽量将两个摄像头固定在一条线上。
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

9.仿真工程的使用 我的工程是用的vivado2019.1与Modelsim10.6d,仿真不知道能不能兼容其他版本的;当然都需要编译好vivado的库以及在vivado中完成仿真的设置;
进入到仿真工程里的下图所示的目录下,双击simulate.bat就可以启动modelsim进行自动化仿真;这部分不明白的可以看我的这篇文章:
modelsim 自动化 独立仿真vivado ip核工程
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

10.AXI slave接口使用 我生成了16个寄存器的AXI slave,目前写的只用了0-7,读的用了0和1;其他方便以后扩展使用;注意第二张图,读的0和1寄存器是接的坐标数据,用于arm读取,其他默认接的写入寄存器;
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

11.总结 【开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)】到这里FPGA双目测距开源项目做完了,有任何疑问或者建议都可以通过公众号私聊我;这部分有两个FPGA工程,一个是用于算法仿真的,另外一个就是完整的工程了;
两个工程关注我的公众号:芯王国,后台回复 双目测距完整工程 双目测距仿真工程可获得。
开源项目(FPGA双目测距|FPGA开源项目:双目测距(三)之FPGA算法实现以及Modelsim仿真)
文章图片

    推荐阅读