---
title: 学FPGA（从Verilog到hls）
url: "https://www.fpgalearn.com/9598.html"
kind: article
id: 9598
excerpt: hls，全称为high level synthesis。也就是说从更高一级的语言来完成电路的综合。从前，编写fpga只有一个方法，都是编写verilog类似的硬…
published_at: 2025-07-20
author: 二牛学FPGA
tags: fpga入门, FPGA培训, FPGA工程, fpga教程
word_count: 1355
source: "https://www.fpgalearn.com"
---

# 学FPGA（从Verilog到hls）

> 标签：fpga入门、FPGA培训、FPGA工程、fpga教程
> hls，全称为high level synthesis。也就是说从更高一级的语言来完成电路的综合。从前，编写fpga只有一个方法，都是编写verilog类似的硬…

> hls，全称为high level synthesis。也就是说从更高一级的语言来完成电路的综合。从前，编写fpga只有一个方法，都是编写verilog类似的硬…

hls，全称为high level synthesis。也就是说从更高一级的语言来完成电路的综合。从前，编写fpga只有一个方法，都是编写verilog类似的硬件语言。但是如何用c、c++编写可综合的逻辑，这就变得很重要了，毕竟c、c++工程师比fpga的工程师要多得多。
1、hls的重要性
从某种意义上，hls会极大拓展目前fpga的应用领域。相比较mcu、arm soc来说，fpga目前还是集中于信号采样、数字信号处理、模数转换这些场景。但是在目前比较兴起的人工智能领域，fpga着墨不多，一个相反的例子就是gpu。从前gpu只是一个图形加速器，后来连续在游戏和人工领域不断发力，使得gpu的应用领域越来越多，关联公司的规模也越来越大。
2、c语言和并发的悖论
c语言本身是一个串行代码，它和并发并不完全一致，从这方面来说，可以看成一个周期为1的特殊fpga代码。所以，在设计的过程中，难点不在于语言本身，而是在于并行的思维。c语言本身不直接变成网表，也是先变成verilog语言，再转成网表的。要实现这一步，就要在c语言上做一些修改和限制，这就是hls的初衷。
3、verilog和waveform不能丢
此外，hls改造后，如何判断hls是不是想要的效果，除了看综合效果后，也需要看对应的waveform，这点无可取代。不要指望代码编写好，就有一个立马的性能改善效果。
4、先编写c代码，再优化hls
对于软件工程师来说，先保证c逻辑没问题，再一步一步优化。优化的方法基本就是添加各种directive，也就是pragma标志。基本方法是三种，1、边收集数据边处理；2、并发；3、流水线。本质上都是各种串行限制，减少算法的latency。
5、hls仍然需要时序图、波形图设计
hls一般都是默认做串行处理，比如下面一段代码，
```
for(int i = 0; i < 10; i++)
{
    b[i] = a[i] + c + d;
}
```
如果没有任何的说明，那基本上就是loop body里面的运算代码顺序执行10次。如果需要进行显式的加速，可以把循环打开、用pipeline，这样基本就可以加速处理。加速不是没有代价的，基本的方法都是空间换时间，这中间有一个权衡，算法可能快了，但是资源也可能不够了。一个巧妙的办法，就是先设计图形，等testbench的时候，把测试的图形和设计的图形进行对比，这样就可以达到事半功倍的效果，不过度优化也是很重要的。
6、注意接口、内存、hls提供的函数
hls怎么和bus接口沟通，函数里面的内存怎么映射，这里面hls都提供了很好的方法。此外，对于一般的函数功能，hls也提供了对应的优化，尤其是opencv提供的一些函数，hls都有对应的版本。
7、学习hls的另一个思路
如果需要把fpga应用到更多的场合，那么hls至少从目前来说还是必由之路。
ps：
很多人可能很难理解，既然fpga做算法这么烦，为什么还要用。我想主要还是因为低频的fpga算法性能可以和数倍于自己的soc一样好，电路相对还简单一点，成本、供应链也没那么紧张。尤其是对于非标产品来说，特别合适。
