从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是自家的厨房,想吃什么就作什么,固然可能你技术很差,作得没有餐厅好,也可能你手艺不错,比餐厅好不少。

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

相关文章
相关标签/搜索