再谈fpga开发(不能转成verilog的c语言特性)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

用过vivado的同学都知道,vivado里面有一个hls工具,也就是用高层语言直接对硬件进行编程。本质上,它就是把c语言进行拆分,切成带有状态机和数据通路的verilog之后,再包装成ip,供其他模块使用。使用上其实十分方便,但是在使用的过程当中,还是有几点需要注意的,那就是有一些c语言特性其实没有办法进行综合、处理的。

1、不能有递归

c文件中如果有递归函数,其实是没有办法生成verilog代码的,比如像这样,

复制代码
int iterate(int data)
{
    if(1 == data)
    {
        return 1;
    }
    else
    {
        return iterate(data-1)+data;
    }
}

如果是代码当中遇到了递归,最好还是写成普通循环的格式去处理。

2、不能有死循环

硬件编程当中,循环的次数必须是一定的,或者有明确结束条件的,不存在死循环的情况。而在c语言编程当中,为了实现多线程编程,我们很容易做一些死循环的操作。这些死循环,一旦进去,基本是不会退出来的,直到程序结束为止。

复制代码
while(1)
{
    // add your code here
    sleep(1);
}

3、不能有动态内存分配

传统的c语言编程,数据的存储方式多种多样,除了全局变量、栈之外,就剩下堆。所谓的堆,其实就是动态内存分布。如果需要申请内存,那么直接malloc一下即可,释放的时候调用一下free。看上去很简单的malloc和free,在hls看来则是没有意义的,所以要想自己的c语言顺利变成verilog代码,不能有malloc和free函数。

4、标准函数、系统函数不能出现

这里的系统函数并不是用户自己编写的函数,而是os提供的libc函数。这些libc函数包括不限于时间函数、文件函数、信号函数、多线程函数等等。这些函数本来就是用户程序申请系统资源所用,并不是用来做专门的计算,所以并没有办法实现系统函数和verilog的翻译。

5、不要有指针运算

不管是数据指针,还是函数指针,这类操作都不支持。所以,如果遇到指针类数据,一般我们都是把它换成数组类操作,即这样,

复制代码
for(int i = 0; i < 100; i++)
{
    sum = array[i];
}

而不是这样,

复制代码
for(int* p = array[0]; p < &array[100]; p++)
{
    sum += *p;
}

6、少用浮点运算

虽然verilog支持一部分乘除,也支持一部分浮点运算,但是fpga上面处理浮点还是非常费资源的一个事情。因此,我们一般都是用查表,或者是直接用乘法代替除法的方式,来处理浮点计算。这一点其实和cpu是一样的。我们编写过mcu或者soc程序其实就知道,很多的没有硬件浮点的cpu,本身也是通过软浮点来实现的,所谓的软浮点就是库函数的意思。

因此fpga上面的浮点处理,最好做到下面几点,

1)浮点变成固定浮点数,即小数点后面几位是固定的;

2)浮点再转成整数计算;

3)除法变成乘法,特别是整除的除法;

4)三角函数、指数计算等等,通通变成查表计算;

5)想尽办法用加减法、左右移位代替浮点运算。

7、另外一种c转verilog办法

所以经过了上面的分析,我们也可以看出来,只有纯计算类、没有库函数、没有动态内存、没有指针、非无限循环、少浮点处理的c代码,比较好转成verilog。用hls虽然比较方便,但是要学习的东西比较多,个人觉得并不方便。

掌握了c转verilog的基本处理方法,也就是状态机+数据通路的方法,其实人工把c转成verilog也是可以的,只是用hls比较方便一点。

**此外随着chatgpt的流行,个人觉得可以在把握转换要领的情况下,用chatgpt来实现两者之间的转换,也是非常不错的一种方式。**效率并不一定比hls差。

相关推荐
szxinmai主板定制专家6 小时前
电力边缘 AI 落地难点剖析:RK 系列 + FPGA 异构平台在储能监控终端的 EMC 与算力优化
人工智能·fpga开发·arm+fpga·rk3588+fpga
szxinmai主板定制专家7 小时前
基于RK3588+FPGA+AI的储能电站边缘网关,实现电力数据采集与智能预警
arm开发·人工智能·fpga开发·rk3576·半导体设备
XMAIPC_Robot7 小时前
储能控制器产品化:ARM+FPGA整机高低温、EMC可靠性测试实战总结
arm开发·人工智能·fpga开发·arm+fpga·rk3588+fpga
szxinmai主板定制专家8 小时前
面向虚拟电厂协调控制:RK3588+FPGA+AI边缘控制器设计思路与算力评估
人工智能·嵌入式硬件·fpga开发·机器人·jetson·zynq·振动采集
XMAIPC_Robot11 小时前
国产FPGA替代Xilinx在储能电力采集场景可行性评估与移植经验
人工智能·算法·机器学习·fpga开发·rk3588+fpga
星夜离尘5611 小时前
Testbench不只看波形:用scoreboard抓住丢包、重复和乱序
fpga开发·verilog·testbench·scoreboard
狂奔蜗牛(bradley)11 小时前
EtherCAT 主站拓扑判定的三级防护:从去抖到振荡检测
人工智能·嵌入式硬件·fpga开发·架构
XMAIPC_Robot11 小时前
工商业储能EMS边缘计算:本地AI负荷预测,彻底摆脱云端依赖
人工智能·fpga开发·机器人·边缘计算·arm+fpga·rk3588+fpga
XMAIPC_Robot12 小时前
FPGA+ARM联合调试避坑:储能电力采样数据同步、丢包问题定位与根治方案,应用于储能EMS、微网控制器中
arm开发·人工智能·fpga开发·rk3588+fpga·rk3576+fpga