实验室项目需要,需要将在服务器段跑出的网络参数配置到FPGA上,一种方法是直接利用verilog或者vhdl直接去写一个网络的前向传播模型,另一种就是用 C/C++ 来描述网络的前向传播模型,然后利用Vivado的HLS将其转化为硬件描述语言——verilog或者vhdl。第一种方法资源利用率高,但需要考虑时序和并行性(硬件语言设计的两个重要因素),这一点比较困难;第二种方法相对高效且容易一点;作为一个新手,本着先将流程跑通的想法,我选择了第二种方法作为首次尝试的方法,通过高亚军老师的视频课来学习的,附上链接:https://www.bilibili.com/video/av41246874
先来谈谈CPU、GPU、DSP、FPGA之间的区别:https://blog.csdn.net/Qiuoooooo/article/details/81779583
对于一个软件工程师,应该掌握的程度:
总结起来就一句话“怎样能使得我们用C/C++转化成的HDL代码可以高效运行?”
CAD-CAE-EDA
- Computer Aided Design
- Computer Aided Engineering
- Electronic Design Automation
在EDA这个阶段,最典型的特征就是出现了硬件描述语言——VHDL和Verilog;
到了现在,就出现了ESL(电子系统级设计方法)这个概念,它的本质是在说在ESL这个阶段我们希望采用具有更高抽象度的方式去描述系统行为,所以在这个阶段有两个显著特征:
在算法描述完成后,需要一个相应文本来测试我们的算法,
下面来看一下对于这几个过程的实例:
Scheduling and Binding Example的例子如下,下面这个例子比较简单,所以只有一个状态C0;
扩至逻辑的提取例子,有四个状态,在C0状态执行b+c,C1状态产生x和数组的地址,C2状态执行相应的乘法操作,C3状态将结果写入y数组的对应位,如此循环几次,直到到达循环边界退出循环。需要注意的是,生成的控制状态(左下)和状态机(右下)不是一一对应的,但它们之间非常接近。
Directives的两种方式:
将每个directive以directives.tcl格式作为一个Tcl命令单独存放,以"#"作为标识;
优势在于:每个solution都有独立的directives,如果这个solution需要重新综合,那么只有这个solution下面的directive会起到作用;不足之处在于:如果C source code文件需要被给到第三方,那么需要将directives.tcl包含其中,对于一个代码需要获得同样的综合结果,那么同样的directives.tcl必不可少。
将每个directive嵌入到C/C++源码中,以pragma格式出现,"%"作为标识;
优势在于:如果C source code文件需要被给到第三方,不需要单独将directives.tcl交付,对于一个代码需要获得同样的综合结果,也不需要额外的directives.tcl;不足之处在于:如果一个solution需要重新综合,那么所有的directives都要被执行。
几点小技巧: