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

相关推荐
智塑未来16 小时前
FPGA开发板怎么选?先看资质、案例与研发底盘
fpga开发
minglie11 天前
黑金AX301的SDRAM
fpga开发
hahaha60161 天前
HLS高层次综合设计技巧--高层次综合设计探讨
fpga开发
minglie11 天前
黑金AX301的EEPROM 24LC04
fpga开发
Hello-FPGA1 天前
量子计算滨松c15550-22up单光子相机与PCIe1004采集卡
人工智能·计算机视觉·fpga开发
9527华安2 天前
FPGA实现CameraLink转SFP光口,基于GT Transceivers Wizard Aurora8B10B编解码架构,提供4套工程源码和技术支持
fpga开发·sfp·cameralink·aurora8b10b·transceivers
ALINX技术博客2 天前
【期刊共读】如何应对 FPGA 短缺常态?
嵌入式硬件·fpga开发·fpga
156082072193 天前
短波接收机灵敏度测试
fpga开发
Riwuarua3 天前
从近似0基础开始FPGA开发 -- part.6 逻辑设计与状态机
fpga开发
LCG元3 天前
【实战】Vivado FPGA 从零实现 UART 串口收发:波特率生成、状态机设计与仿真调试
fpga开发