当前位置:首页 > 新闻资讯 > FPGA之家动态 >

【从0开始学FPGA-07】Verilog:赋值语句和块语句

时间:2024-08-02      来源:网络搜集 关于我们 0

 一个多年老硬件攻城狮,开始从0学FPGA......

小编通过Vivado学习了几个例程,基本把软件环境搞通了,最大的体会是回到Verlilo的学习,只有把Verilog这门语言学会了,才能在实际的开发中得心应手。需求是输入,算法是核心、语言和开发环境是工具,真所谓“巧妇难为无米之炊”。

01

赋值语句

在 Verilog HDL,语言中,信号有两种赋值方式:非阻塞(Non_Blocking)赋值方式"<="( 如 b<= a;)

(1)在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用;

(2)块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值得到的;

(3)在编写可综合的时序逻辑模块时,这是最常用的赋值方法。

注意:非阻塞赋值符“<=”与小于等于符“<=”看起来是一样的,但意义完全不同,小于等于符是关系运算符,用于比较大小,而非阻塞赋值符用于赋值操作。

阻塞(blocking)赋值方式"="(如b=a;)(1)赋值语句执行完后,块才结束;(2)b的值在赋值语句执行完后立刻就改变的;(3)在时序逻辑中使用时,可能会产生意想不到的结果。非阻塞赋值方式和阻塞赋值方式对于程序设计非常重要。问题主要是对“always块内的reg型信号的赋值方式不易把握。“always”模块内的reg型信号都是采用下面的这种赋值方式:b<=a:这种方式的赋值并不是马上执行的,也就是说,“always”块内的下一条语句执行后,b并不等于 a,而是保持原来的值,“always”块结束后,才进行赋值。而阻塞赋值方式,如下所示:b=a;这种赋值方式是马上执行的,也就是说执行下一条语句时,b已等于a。尽管这种方式看起来很直观,但是可能引起麻烦。“非阻塞语句用于时序逻辑电路,阻塞语句用于组合逻辑电路”阻塞语句和非阻塞语句进一步的区别解释可参考这个老哥的解释:https://blog.csdn.net/Jackiezhang1993/article/details/84315983

02

块语句

块语句通常用来将两条或多条语句组合在一起,使其在格式上看更像一条语句。块语句有两种:一种是 begin_end 语句,通常用来标识顺序执行的语句,用它来标识的块称为顺序块;另一种是 fork join语句,通常用来标识并行执行的语句,用它来标识的块称为并行块。

顺序快begin_end

(1)块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。

(2)每条语句的延迟时间是相对于前一条语句的仿真时间而言的。

(3)直到最后一条语句执行完,程序流程控制才跳出该语句块。

顺序快格式如下:

begin

                语句1;

    语句2;

    语句3;

       .

       .

       .

    语句n

            end

或者:

begin:块名

                        语句1;

    语句2;

    语句3;

       .

       .

       .

    语句n

           end

并行块fork_join

(1)块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行。

(2)块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的。

(3)延迟时间是用来给赋值语句提供执行时序的。

(4)当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。

并行快格式如下:

            fork

                语句1;

    语句2;

    语句3;

       .

       .

       .

    语句n

            join

或者:

fork:块名

                        语句1;

    语句2;

    语句3;

       .

       .

       .

                     语句n

          join

在并行块和顺序块中都有一个起始时间和结束时间的概念。对于顺序块,起始时间就是第一条语句开始被执行的时间,结束时间就是最后一条语句执行完的时间。而对于并行块来说,起始时间对于块内所有的语句是相同的,即程序流程控制进入该块的时间,其结束时间是按时间排序在最后的语句执行结束的时间。

当把一个块嵌入另一个块时,块的起始时间和结束时间是很重要的。至于跟在块后面的语句只有在该块的结束时间到了才开始执行。也就是说,只有该块完全执行完后,后面的语句才可以执行。

在fork_join块内,各条语句不必按顺序给出,因此在并行块里,各条语句在前还是在后是无关紧要的。

举例使用顺序快和并行块输出相同的时序波形:

顺序快:

parameter d=50;  //声明d是一个参数

reg[7:0] r;  //声明r是一个8位的寄存器变量

begin       

        #d r=h35;   //由一系列延迟产生的波形

        #d r=hE2;

        #d r=h00;

        #d r=hF7;

        #d  ->end wave; //->表示触发事件 end_wave使其翻转

end

并行快:

parameter d=50;  //声明d是一个参数

reg[7:0] r;  //声明r是一个8位的寄存器变量

fork       

        #d r=h35;   //由一系列延迟产生的波形

        #100 r=hE2;

        #150 r=h00;

        #200 r=hF7;

       #250  ->end wave; //->表示触发事件 end_wave使其翻转

join

----------------------------------------------------------

参考书籍:【《Verilog数字系统设计教程》夏宇闻 】

----------------------------------------------------------USB 3.0 拓展坞】推荐淘宝店铺“电子eStore

"所卖的这款,多种线材规格可供选择。

    【淘宝】https://m.tb.cn/h.gZJVQdaMnpeXidv?tk=KFDgWIhO2oS CZ0016 「绿联usb3.0扩展器集分线器hub拓展坞u盘转换外接插头延长线一拖四」点击链接直接打开 或者 淘宝搜索直接打开

----------------------------------------------------------------

----------------------------------------------------------------

关注小编一起学FPGA......


注明:本内容来源网络,不用于商业使用,禁止转载,如有侵权,请来信到邮箱:429562386ⓐqq.com 或联系本站客服处理,感谢配合!

用户登陆

    未注册用户登录后会自动为您创建账号

提交留言