再谈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差。

相关推荐
qq_小单车12 小时前
xilinx-DNA
fpga开发·xilinx
Flamingˢ14 小时前
FPGA中的嵌入式块存储器RAM:从原理到实现的完整指南
fpga开发
Flamingˢ15 小时前
FPGA中的存储器模型:从IP核到ROM的深度解析与应用实例
网络协议·tcp/ip·fpga开发
FPGA小c鸡1 天前
【FPGA深度学习加速】RNN与LSTM硬件加速完全指南:从算法原理到硬件实现
rnn·深度学习·fpga开发
Aaron15881 天前
通信灵敏度计算与雷达灵敏度计算对比分析
网络·人工智能·深度学习·算法·fpga开发·信息与通信·信号处理
博览鸿蒙2 天前
IC 和 FPGA,到底区别在哪?
fpga开发
思尔芯S2C2 天前
FPGA原型验证实战:如何应对外设连接问题
fpga开发·risc-v·soc设计·prototyping·原型验证
Flamingˢ2 天前
FPGA实战:VGA成像原理、时序详解与Verilog控制器设计与验证
fpga开发
FPGA_小田老师2 天前
xilinx原语:OSERDES2(并串转换器)原语详解
fpga开发·lvds·xilinx原语·oserdese·并串转换
Blossom.1182 天前
从数字大脑到物理实体:具身智能时代的大模型微调与部署实战
人工智能·python·深度学习·fpga开发·自然语言处理·矩阵·django