0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog设计过程中的一些经验与知识点

FPGA之家 来源:时沿科技 作者:Nemo_Yxc 2022-03-15 12:19 次阅读

“ 本文主要分享了在Verilog设计过程中一些经验与知识点,主要包括块语句、阻塞赋值和非阻塞赋值 以及结构说明语句(initial, always, task, function)

01块语句

  • 顺序块 begin…end

    • 块内的语句是按照顺序执行的;

    • 块内的每条语句延时控制都是相对于上条语句结束的时刻;

    • 仿真时,执行到最后一条语句该语句块执行结束。

  • 并行块fork…end

    • 块内的语句是按照独立的同时开始执行的;

    • 块内的每条语句延时控制都是相对于程序进入该语句块的时刻而言;

    • 仿真时,所需最长时间的语句执行结束后,该语句块执行结束。

例:

reg  [7:0]    l1,l2;  reg[7:0]k1,k2;initialbeginl1=0;l2=0;#15l1=2;#10l2=8;endinitialforkk1=0;k2=0;#15k1=2;#10k2=8;join
仿真结果如下:

c6f5f9e0-9198-11ec-952b-dac502259ad0.png

从仿真结果可以看出:在顺序块中,15ns的时候,l1被赋值为8’h2,在25ns的时候,l2被赋值为8’h8;而在并行块中,10ns的时候,k2被赋值为8’h8,在15ns的时候,k1被赋值为8’h2。可以很容易明白顺序块和并行块的特性。

02阻塞赋值和非阻塞赋值

  • 阻塞赋值(Blocking)

阻塞赋值用“=”表示:在赋值时,先计算等号(“=”)右边部分的值,这时赋值语句不允许其他的语句干扰,直到赋值完成,也就是说“阻塞”是指在当前的赋值完成前阻塞其他类型的赋值任务
  • 非阻塞赋值(Non_Blocking)

非阻塞赋值用“<=”表示:在赋值操作时刻开始计算非阻塞赋值右边部分的值,赋值操作结束时刻才更新左边部分。

例1:组合逻辑中的阻塞与非阻塞

阻塞代码如下:
always@(a,b,c,d)  begin    i1 = a & b;    i2 = c & d;    i3 = i1 & i2;end
仿真结果如下:

c71bc0a8-9198-11ec-952b-dac502259ad0.png

非阻塞代码如下:
always@(a,b,c,d)  begin    i1 <= a & b;    i2 <= c & d;    i3 <= i1 & i2;end

仿真结果如下:

c73d7d74-9198-11ec-952b-dac502259ad0.png

可以看出i1和i2在阻塞和非阻塞中结果相同,但是i3的结果却不同。这是因为在阻塞赋值中,i3的赋值使用的是i1和i2更新后的值,而非阻塞赋值中i3的赋值则使用的是i1和i2更新前的值。要想解决这一问题,则需要将“always@(a,b,c,d)”改成“always@(a,b,c,d,i1,i2)”代码如下:
always@(a,b,c,d,i1,i2)  begin    i1<=a&b;    i2 <= c & d;    i3 <= i1 & i2;  end
仿真结果如下:

c75bfbbe-9198-11ec-952b-dac502259ad0.png

综上,组合逻辑中更适合用阻塞赋值语句。

例2:时序逻辑中的阻塞和非阻塞。

以反馈振荡器的代码为例。非阻塞赋值代码:
always@(posedge  clk,posedge  rst)    begin      if(rst)  a1 <=0;      else    a1 <=a2;    endalways@(posedge  clk,posedge  rst)    begin      if(rst)  a2 <=1;      else    a2 <=a1;end

阻塞赋值代码:

always@(posedge  clk,posedge  rst)  begin      if(rst)   b1 = 0;      else      b1 = b2;  endalways@(posedgeclk,posedgerst)  begin      if(rst)   b2 = 1;      else      b2 = b1;  end

仿真结果如下:

c77723c6-9198-11ec-952b-dac502259ad0.png

可以看出阻塞赋值语句并不能达到我们想要的效果;而且综合后阻塞赋值语句中,无法确定哪个always块中的时钟沿先到达,哪个always块中的时钟后到达,所以存在一个冒险竞争的问题。综上,时序逻辑中更适合用非阻塞赋值语句。

03结构说明语句(initial, always, task, function

  • 语句initial

语法格式如下:
initial begin  // Add code hereend
一般initial语句用于测试文件的编写;但是随着编译器的进步,现在也可以综合,常用于一些变量的初始化。无论是用在什么场景,initial语句只执行一次。
  • 语句always

语法格式如下: always <时序控制> <语句>

例1:生成仿真时的信号波形

always可以用于仿真时的波形生成:always #5 clk = ~clk;这个例子就形成了一个周期为10ns(时间单位ns根据`timescale确定)的方波,常用来描述时钟信号(如果将#5去掉,那么会生成一个延迟为0的无限循环跳变过程,会发生仿真锁死,这是不推荐的)。仿真结果如下:

c79f5666-9198-11ec-952b-dac502259ad0.png

例2:

实现锁存器和触发器

always@(posedge  clk or posedge   rst)   begin    if(rst)  cnt <= 0;      else    cnt <= cnt + 1;  endalways@(posedge  clk , posedge   rst)  begin    //add codesend
多个敏感事件可以用“or”或者“,”区分(rst为复位信号,可以是posedge也可以是negedge)。

c7c624a8-9198-11ec-952b-dac502259ad0.png

例3:实现组合逻辑

利用always实现组合逻辑时,要将所有的信号放进敏感列表,而时序逻辑中则不需要。
always@(aorborc)  beginx=x+1;end
上面的代码表示,a、b、c中任意电平发生变化,begin…end语句就会被触发。仿真结果如下所示:

c7e60fde-9198-11ec-952b-dac502259ad0.png

always@(a or b or c or d or e)     begin       out = a + b + c + d + e;end
如上所示,因为敏感列表比较长,容易写错,所以Verilog又提供了两个特殊的符号:@*和@(*)。简化代码如下:
always@(*)beginout=a+b+c+d+ e;end
仿真结果如下图所示:

c808a6a2-9198-11ec-952b-dac502259ad0.png

注意:always模块内被赋值的每一个信号都必须定义为reg型。
  • 语句task

语句task的定义:

task <任务名>;

<端口及数据类型声明语句>;

<语句1>;

<语句n>;

endtask

示例代码如下:
reg      [7:0]      j,k,i,x;  always@(posedge  clk  or posedge  rst)    begin      if(rst)        begin          i <= 0;          j <= 0;          k <= 0;          x <= 0;          task1(i,j,k);        end      else        begin          i <= i + 1;          x <= i + 10;          task1(i,j,k);        endend  task task1;      input    [7:0]      i;      output   [7:0]      j1;      output   [7:0]      k1;    begin      j1 = i + 10;      k1 = i + 11;    endendtask
仿真结果如下图所示:

c825969a-9198-11ec-952b-dac502259ad0.png

  • 语句function

函数(function)的目的是返回一个用于表达式的值。

语句function的定义:

function<返回值的类型或范围>(函数名)

<端口说明语句>

<变量类型说明语句>

begin

end

endfunction

示意代码如下:
  reg      [7:0]      i,j;  reg      [8:0]      sum_data;    always@(posedge  clk  or posedge  rst)    begin      if(rst)        begin          i <= 100;          j <= 31;          sum_data <= sum(i,j);        end      else        begin          i <= i + 1;          j <= j + 2;          sum_data <= sum(i,j);        end    end
  function  [8:0]  sum;    input  [7:0]  i1;    input  [7:0]  j1;      begin        sum = i1 + j1;      end  endfunction

仿真结果如下图所示:

c85401ba-9198-11ec-952b-dac502259ad0.png

注意:initial、always、task和function都是可以综合的。

原文标题:Verilog基础知识学习笔记(二)

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132147
  • Verilog
    +关注

    关注

    28

    文章

    1325

    浏览量

    109298
  • 程序
    +关注

    关注

    114

    文章

    3630

    浏览量

    79527
收藏 人收藏

    评论

    相关推荐

    在学习STM32的过程中积累的一些知识点

    包括:1.断言机制函数assert_param2.USART串口使用printf()函数重定向问题3.类型修饰符volatile4.触摸屏学习5、BMP(Bitmap-File)图形文件6、FatFs文件系统源码结构都是根据资料总结的一些比较零碎的知识
    发表于 10-04 22:45

    工程师总结了一些C语言的知识点

    仅供大家参考,想起和我讨论吗,可以加下我的QQ2685896890,黄老师、嵌入式C/单片机C/标准C知识点知识点1:嵌入式C、标准C、单片机C区别
    发表于 07-25 10:23

    请问学习LLC电源需要掌握一些什么知识点

    我是个刚学习电源的萌新,请问学习LLC电源需要掌握一些什么知识点
    发表于 03-05 21:42

    初学者学习Verilog HDL的步骤和经验技巧

    习的过程中也要逐步积累这些知识经验。此外,还可以学习一些SOC方面的知识,这里不仅仅是指的Nios II。后面继续学习,不断学习,持续学习
    发表于 04-30 08:30

    电机与电气控制基础的知识点

    电机就是我们平时俗称的“马达”,电机是依据电磁感应定律实现电能转换或传递的种电磁装置。电机的主要作用是产生驱动转矩,作为用电器或各种机械的动力源。而电机与电气控制技术的一些基础的知识点是不论是在学习还是工作中都是需要牢记的。今
    发表于 01-22 06:54

    求大佬分享一些System Verilog的学习经验

    求大佬分享一些System Verilog的学习经验
    发表于 06-21 06:29

    使用WiFi的过程中总结的一些经验

    简述在我们做项目开发,经常会用到WiFi,这次给大家分享下我在使用WiFi的过程中总结的一些经验,这次用到的是esp8266WiFi模块
    发表于 08-05 07:30

    记录一些飞控开发过程知识点

    写在前面开这个专栏的目的主要是深感自己对飞控软件、算法的知识点过于杂乱,很久没有进行系统的总结了,因此决定写几篇文章记录一些飞控开发过程知识点。主要是针对
    发表于 08-06 09:59

    记录一些飞控开发过程知识点

    写在前面开这个专栏的目的主要是深感自己对飞控软件、算法的知识点过于杂乱,很久没有进行系统的总结了,因此决定写几篇文章记录一些飞控开发过程知识点。主要是针对
    发表于 08-09 08:40

    关于RTC时钟的知识点

    :STM32之RTC实时时钟这个里面比较详细,还添加了例程。STM32 RTC实时时钟这个链接里面详细讲述RTC的主要的几个寄存器。下面记录一些关于rtc的知识点:RTC 时钟源 (R...
    发表于 08-11 08:27

    讲讲ROM、RAM、Flash的一些零碎知识点

    篇主要讲讲ROMRAMFlash的一些零碎知识点,网上也能找到很多资料。1 ROM1.1概述  只读存储器(Read-only memory, ROM),当然从广义上来讲,也有一些
    发表于 11-03 07:58

    嵌入式开发过程中遇到的知识点记录

    前言本篇主要是对嵌入式开发过程中遇到的一些很小的知识点进行记录,就像阅读篇英语文章,碰见一些不认识的,不熟悉的单词,语法,查阅资料搞懂记录
    发表于 12-14 07:37

    Verilog HDL数字系统设计教程》(第四版)学习笔记 part1 Verilog数字设计基础——第知识点总结

    本教材,第四版是它的最新版本。在学习的过程中,博主对每章的知识点进行了梳理,对其中重要的知识点(博主认为的)都做了归纳,当然也有些知识点
    发表于 03-22 10:26

    Verilog逻辑设计中的循环语句和运算符

    “ 本文主要分享了在Verilog设计过程中一些经验知识点,主要包括循环语句(forever、repeat、while和for)、运算符。”
    的头像 发表于 03-15 11:41 4179次阅读

    Verilog系统函数和边沿检测

    “ 本文主要分享了在Verilog设计过程中一些经验知识点,主要包括Verilog仿真时常用的系统任务、双向端口的使用(inout)、边沿
    的头像 发表于 03-15 13:34 1787次阅读