扫一扫,分享给好友
上次分享了基于FPGA的线性插值的背景和方法原理,今天分享 方法原理的验证。 通常FPGA的开发分为电路功能设计、设计输入、功能仿真、综合优化、综合后仿真、实现、布线后仿真、板级仿真以及芯片编程与调试等主要步骤。 考虑到本算法需要做多次的迭代运算,如果程序没有设计好,可能导致陷入死循环,导致无法输出的结果。此时就需要利用仿真测试查找逻辑上的问题。 FPGA通常可以通过编写测试用例,利用modelsim等仿真软件进行分析。但是考虑到使用modelsim仿真软件需要对测试用例的编写以及对modelsim有一定的了解,对于部分情况下可能存在困难。 编程语言只是一种工具,因此相同的算法可以利用不同的语言实现。C语言对于迭代处理很容易编写,并且方便调试。因此,可以先利用C语言验证方法,再利用Verilog语言实现。这样可以减少后期的调试工作,加快程序开发进程。 利用VS2019创建工程,编写代码如下:
for (int i = 30; i < 41; i++) { int XH = 41; int YH = 141; int XL = 30; int YL = 137; int YM = YL; int XM = XL; while (i != XM) { if (i > XM) { XL = XM; YL = YM; XM = (XH + XL) / 2; YM = (YH + YL) / 2; } else { XH = XM; YH = YM; XM = (XH + XL) / 2; YM = (YH + YL) / 2; } } //Y2为利用线性插值直接计算得到的值,此处为了模拟FPGA做除法会损失小数,因此把除法和乘法分开处理。 int Y2 = (141 - 137) * (i - 30) ; Y2 = Y2 / (40 - 30) + 137; int YC = Math.Abs(YM - Y2);//YC为两个方法的计算结果之差 //YM为利用中间点插值计算的结果 string cc = i + "\t" + YM + "\t" + Y2 + "\t" + YC + "\r\n"; sw.Write(cc); } sw.Close();
计算的结果如下表: 从表中可以看出,此种方法可以计算出线段中任意一点的Y值。
但是次方法也存在着问题: 1,如果线段两端的Y值差别增大,误差也会增大。 2,迭代的次数会随着两端X值的增大而增大。 3,不能够计算当需要计算的值和右端点重合时,会陷入死循环。因此实际做算法时候需要单独判断。
此种验证方法只是提供一种FPGA开发的思路,可供参考。如果有需要,可以添加公众号:日三省吾身,后台留言交流。
下次将继续分享FPGA的代码实现和modelsim仿真。
每次转变,总会迎来很多不解的目光,有时甚至是横眉冷对千夫指。但对顺境逆境都心存感恩,使自己用一颗柔软的心包容世界。柔软的心最有力量。 ——林清玄
只看该作者
举报
不客气,欢迎交流。
发布
fpga
紫光同创FPGA权威开发指南,原厂携手小眼睛科技威廉希尔官方网站 专家联合编著
AIBOX-3588M,为终端提供算力,基于RK3588平台!
教程!FPGA DDR4读写实验(1)
【有奖提问】关于盘古1K2K开发板你有什么想知道的?一起来留言获取答案吧!
盘古22K开发板
盘古200 pro开发板
盘古50 pro开发板
盘古50K开发板
盘古100 pro开发板
FPGA在图像处理领域的优势有哪些?
电子发烧友网
电子发烧友论坛