闲庭信步使用图像验证平台加速FPGA的开发:第二课——RGB转YCbCr的FPGA硬件编程详解

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注知识星球:成工fpga,关注即送200GB学习资料,链接已置顶!)

图像由RGB转YCbCr的原理和公式在上个系列都有专门的章节讲过,本篇主要讲解FPGA的硬件编程实现

如下是RGB转YCbCr的公式,只要是稍微有FPGA编程经验的人员都知道这个公式是没有办法直接用FPGA进行硬件编程的,因为公式中有小数的乘法

学习过计算机的都知道,数据在内存中是以二进制的形式存储的,不是0就是1,根本没有存储小数点的说法,在这种情况下,我们首先要把小数转换成小数。

怎么把小数转换成整数呢?最简单的方法就是移位,上面公式中,小数点右移3位,小数就全部变成整数了,也就是数据扩大了1000倍,结果计算完毕后,再缩小1000倍即可。

上面的思路是对的,但是有问题。数据扩大1000倍计算完毕后每个数据都要除以1000,我们都知道,除法运算非常消耗逻辑资源的,而且很多时候1个时钟周期无法完成一次的除法操作,非常容易造成时序的违规

那能不能避免除法运算呢?这个是可以的。上面我们也说过了内存中是按照二进制对数据进行存储的,二进制中数据左移n位相当乘以2的n次方,数据右移n位相当除以2的n次方,那我们在让数据由小数变成整数的时候,不是乘以1000,而是乘以2的n次方,那公司计算完毕后,直接将结果的第n位舍弃,就是完成的数据的除法,几乎没有消耗逻辑资源。

如下,我们把公式的系数扩大512倍,也就是2的9次方,这其实是对数据进行了一些近似,如果想让误差更小可以将数据扩大1024倍,2048倍......相比于除法运算,适当的近似还是非常值得的

公式的系数有小数变成了整数,那就可以进行FPGA的硬件编程了,不过编程前还有两个问题需要提前考虑一下,一个就是这个公式的实现使用组合逻辑还是时序逻辑实现,如果使用时序逻辑需要几个周期;而是公式中有加减法,计算过程中怎么保证结果不要超出图像数据格式的范围,也就是不要超出0-255。

首先第一个问题,公式中是3个数的加减乘操作,最好不要用组合逻辑,因为如果一个时钟周期内无法计算出来结果,而下个时钟周期新的数据到来,计算的结果就会乱掉了。使用了时序逻辑,建议最少使用2个时钟周期完成公式的计算,这是不计资源的消耗,让所有的乘和加减并行运算,其中一个时钟周期完成所有的乘法,第二个时钟周期完成所有的加减;当然3个时钟周期更合理一些,将三四个数的加减分两个时钟周期来完成,同时判断数据是否超出范围。

第二个问题,成工一般建议加减法分别进行计算,最后再根据加减法分别的结果判断大小后再进行最后的判断。好处就是不需要过多考虑如果不够减数据补码错误的问题。

其实了解了上面的这些,FPGA的硬件编程就变得非常的简单了,成工直接上RTL代码。

首先就是定义了公式的系数参数和中间的计算变量。

第一个时钟周期完成了乘法的运算,并将结果先缩小8倍。

第二个时钟周期分别完成加法和减法(如果有)的计算,并将结果又缩小了8倍;第三个时钟周期完成最终的计算结果,并判断数据是否超出规定的范围。

最后计算花费了3个时钟周期,需要将场同步,行同步和数据有效信号都延时3拍,以便和转换后的的结果对齐

在src文件夹下的top文件中,例化rgb2ycbcr模块。

在仿真文件tb_image_sim中,对第二个initial块进行如下的操作,146行是测试平台输出的转换结果,148行是等一副图片处理完毕,161行到165行是比对图像测试平台的转换结果和FPGA硬件仿真结果的比对。

最后我们双击sim文件夹下的top_tb.bat文件,完成系统的自动化仿真。

可以看到在modelsim的Transcript有如下的打印信息,发现图像测试平台的转换数据和FPGA硬件仿真的转换数据并不一样,每个通道的数据只打印了一个数据是因为成工在compare_chnl_image这个task中,遇到第一个不一致的数据就跳出比对并打印。仔细观察一下,比对的数据虽然不一样,但是差距并不大,都是差1,我们前面也分析了,FPGA的硬件编程处理是对公式的系数进行了放大和近似,最后缩放直接用的是低位截断,所以才照成结果有差异

打开img文件夹,可以看到图像测试平台的仿真结果和FPGA硬件仿真的结果基本是一样的,至少说明了我们设计的FPGA代码应该没有什么问题。

如果想让比对的结果一样,那图像测试平台也要按照FPGA硬件编程的思路进行设计,如下在img_process_pkt包中新建一个rgb2ycbcr_fpga的task,基本就是按照上述的FPGA硬件设计思路进行的设计,如下所示。

仿真文件tb_image_sim中,对第二个initial块仅仅对146行进行修改,将task由rgb2ycbcr改为rgb2ycbcr_fpga。

重新进行仿真,modelsim的Transcript有如下的打印信息,这次图像测试平台和FPGA硬件仿真的结果就完全一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值