从C/C++到Verilog的思维模式转换

我不是一个好的C/C++程序员,只会用VC6.0的MFC写一些小程序,在接触MinGW之前对编译器和Makefile完全没有概念(即使是之后,也不明白)。后来学习Verilog语言,算是对编译有了一定地认识。

说说我为什么会接触Verilog这种软件领域稀有的语言吧(因为它是硬件描述语言,全名是Verilog HDL)。我专业跟图像处理有很大关系,导师认为用软件写算法处理速度已经不可能再快的,除非有极其昂贵的集群式计算机组,因此他想用FPGA来实现部分算法,这样的话学习Verilog就是必不可少的了。

编译好的C/C++语言的程序都是顺序执行的,即CPU需要一条指令一条指令地执行,而且每一条指令都属于CPU的特定的指令集。拿乘法为例,有的CPU需要多条指令来完成,有的CPU需要一条多周期指令来完成,而极少数高端CPU仅需要一条单周期指令来完成。编译器对代码的优化,也仅仅是对各种指令序列的等效替换,不会创造新的指令。

FPGA不同,它是一张白纸,你需要在上面设计寄存器、连接关系、指令集等,可以把一个4*4矩阵相乘的操作设计成一个拥有32个专用寄存器单周期完成的指令,酷吧!在CPU上这可是需要64个乘法和48个加法的运算。有人会想,乘法和加法必须有先后关系,即使所有的64个乘法都是并行实现的,为什么加法也可以在同一个周期内完成呢?有没有人会这么想?反正我一开始是这么想的,但是后来理解了,周期说白了就是时间嘛,我的低端的FPGA的时钟是100MHz,就是10ns一个周期,以光速走可以走3m,如果一个组合逻辑电路的等效延时小于10ns,等效长度小于3m,那完全可以在一个周期内完成。

从C/C++转Verilog最让我头大的就是里面的“非阻塞赋值 <=”,它所有的语句从上到下都是同时执行的,而不是按顺序。比如:

always @(posedge clk)

if (!rst_n)

    begin

        Var1 <= 1;

        Var2 <= 2;

    end

else 

    begin

        Var1 <= Var2;

        Var2 <= Var1;

    end

这实际上是每一个周期执行一次交换,第一次的结果是Var1 = 2; Var2 = 1; 而不是C/C++语言认为的Var1 = Var2 = 2; 这就是时序逻辑!

打个不恰当的比喻,CPU是一家中餐厅,菜单上有什么,你就可以点什么;FPGA是自家的厨房,想吃什么就做什么,当然可能你技术不好,做得没有餐厅好,也可能你手艺不错,比餐厅好很多。

组合逻辑、时序逻辑,很强大!写得有点乱,欢迎拍砖~~~~~

你可能感兴趣的:(从C/C++到Verilog的思维模式转换)