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

相关推荐
sz66cm14 小时前
FPGA基础 -- 无毛刺时钟切换(glitch-free clock switching)
fpga开发
Blossom.11815 小时前
把AI“绣”进丝绸:生成式刺绣神经网络让古装自带摄像头
人工智能·pytorch·python·深度学习·神经网络·机器学习·fpga开发
电子凉冰15 小时前
FPGA强化-VGA显示设计与验证
fpga开发
XINVRY-FPGA16 小时前
XC7A100T-2FGG484I Xilinx Artix-7 FPGA
arm开发·嵌入式硬件·fpga开发·硬件工程·信息与通信·信号处理·fpga
cmc102816 小时前
129.FPGA绑定管脚时差分管脚只绑_p是不行的,tx与rx只绑一个也不行
fpga开发
望获linux16 小时前
【实时Linux实战系列】FPGA 与实时 Linux 的协同设计
大数据·linux·服务器·网络·数据库·fpga开发·操作系统
cycf16 小时前
系统同步输出延迟分析(七)
fpga开发
国科安芯16 小时前
高辐射环境下AS32S601ZIT2型MCU的抗辐照性能与应用潜力分析
网络·人工智能·单片机·嵌入式硬件·fpga开发
爱吃汽的小橘1 天前
用串口控制DAC
fpga开发
FPGA_ADDA1 天前
RFSOC27DR+VU13P 6U VPX板卡
fpga开发·信号处理·adda射频采集·rfsoc27dr·vu13p