Verilog算法入门

一、什么是算法?

算法就是按步就班地解决问题,也就是解决问题的办法。

算法是个很泛的概念,并不是一定得包含高深的数学公式。

二、用Verilog语言实现的算法跟C语言实现的算法有何区别?

Verilog是完全可以自主地设计硬件,而C语言则是依赖于CPU,依赖于现成的硬件。

Verilog做出来的算法执行速度往往比C的要快,这也是我们使用Verilog最好的理由。

然而,较为复杂的算法,就很难使用Verilog实现。

三、怎样用Verilog实现算法?

1、直接法。直接把公式、逻辑关系转成Verilog。

2、间接法。把C语言、MATLAB的M语言等现成的算法转成Verilog。

3、混合法。比如在ZYNQ等ARM+FPGA的异构芯片中,把算法的一部分工作交给ARM,另一部分交给FPGA,也就是C与Verilog混合。

4、偷懒。使用现成的IP核。

下面详细地介绍直接法、间接法和混合法。

四、直接法。

1、把数学公式转成Verilog。

先回想起数电里最基础的数字电路:与或非门、选择器、计数器、移位寄存器、加法器、乘法器、RAM/ROM等。

把复杂的数学公式拆分成若干个简单的计算步骤,再对应于基本的数字电路,并画出电路图(熟练后可以不画)。

另外还要考虑数字在FPGA中的表示方式,推荐计算机组成原理的《定点与浮点》。

还有一些较难计算的函数,如:三角函数、开方、e的n次方等,可以使用Cordic算法。

2、把逻辑关系转成Verilog。

一个数学公式常常包含优先级,也就是先算一部分,后算一部分,这也是属于逻辑关系。

这时,可以使用状态机、计数器、流水线操作等,理清它们的逻辑关系。

不包含数学公式的算法,也是使用该方法处理。

五、间接法。

由于MATLAB的M语言可以转成C语言,而且C语言是一种较为贴近硬件层的语言(单片机使用C语言开发就是最好的证明)。这里就以C语言转Verilog为例。

与直接法类似,也是先把C语言往基本的数字电路靠拢,并画出电路图(熟练后可以不画)。


具体的代码,可以参考本博客的《最大公约数Stein算法之verilog实现》。

这里需要特别注意的一点,不一定要照着C语言一步一步转换。

你可以先得到C语言算法的输入和输出,自己构造里面的电路,也就是把C语言当成一个黑匣子。


实际在写代码时,不一定需要使用C和Verilog混合语言开发(防歧义)。

其中的逻辑关系,也是跟直接法一样的处理方法。

此外,要尽量避免做FPGA不擅长的计算,如:求余、迭代等。要把这些计算转化成FPGA擅长的,如:加法、移位、查表等。

当然,计算结果可以做取舍,只要精度符合要求即可。

六、混合法。

混合法适用于异构芯片,如ARM+FPGA。在ARM中可以使用C语言,在FPGA中可以使用Verilog语言。

这样,我们把各自擅长的任务分配给不同的架构。

操作系统、人机交互、复杂的协议栈交给ARM。(低速、非实时、变化较多)

高速接口、大吞吐量的数据、重复性高且简单的运算交给FPGA。(高速、实时、变化较少)

一种图像识别的框图,如下图所示。


其中算法的处理,跟间接法一样。但是这里多了一个接口。

接口,说白了,就是搬运数据,把FPGA的数据搬到ARM。这里需要考虑速率、接插件使用时的便利性。

1、速率。

FPGA出来的数据要以多快的速率,才让ARM无误地接收。一般像这种大量的数据搬运,在ARM中可以使用DMA。

2、接插件使用时的便利性。

比如,传图像有并行RGB、VGA、DVI、HDMI、DP、LVDS、USB、PCIE等接口。

选用不同的接口,要考虑ARM底层的驱动是否易写、座子的体积、是否支持热插拔等。

七、其它问题。

使用Verilog做算法,最基本的还是要发挥出FPGA最擅长做的事,把FPGA不擅长的交给其它芯片。

关于工程师具体做什么样的算法,还是要看相关的算法书籍,也就是要把理论学好(可以参考《如何学习FPGA》第五点),才能做出算法。

Verilog只是表达算法的一种工具。


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/k331922164/article/details/78204093

猜你喜欢

转载自blog.csdn.net/kebu12345678/article/details/80567980