Verilog初级教程(10)Verilog的always块

博文目录

    • 写在前面
    • 正文
      • 语法
      • 什么是敏感列表?
      • always块是用来干什么的?
      • 如果没有敏感列表怎么办?
      • 时序逻辑实例
      • 组合逻辑实例
      • 注意事项
    • 参考资料


写在前面

由于刚毕业,又发生了很多事,在进入工作的准备期,就这样一停更很多日,接下来几天也将如此,直到生活稳定下来。
这个简单的教程还没有完成,继续吧。


正文

Verilog中的always块是Verilog中最常用的一个语法点,可以这么说,你稍微进行一个正常的设计都会用到always块,时序逻辑一定会用到,组合逻辑也很可能会用到。
参考互联网资料,我们从如下几个方面讲解always块语法。


  • 语法
  • 什么是敏感列表?
  • always块是用来做什么的?
  • 如果没有敏感列表会怎样?
  • 例子
  • 时序逻辑设计实例
  • 组合逻辑设计实例

语法

语法很简单,如何按照结构划分可以分为:

always @ (event)[statement]always @ (event) begin[multiple statements]
end

第一种是块内只有一条语句,不需要使用begin end;第二种是有多条语法,需要使用begin end包裹起来。
这其实都是废话。我们推荐全部都用begin end包裹起来,这样形式比较固定,比较方面阅读以及形成固定风格。

我们按照下面方式划分,时序逻辑和组合逻辑区别划分:
划分组合逻辑以及时序逻辑的依据是敏感列表里面的内容有没有边沿事件?

  • 组合逻辑语法:
always @ (level event) begin[multiple statements]
end

括号内部的敏感列表仅仅为电平事件,例如:

always@(a,b,c,d) beginout = a&b&c&d;
end

这样写的缺点在于有的时候,敏感列表过多,一个一个加入太麻烦,容易忘掉,为了解决这个问题,verilog 2001标准说可以使用*替换敏感列表,表示缺省,编译器会根据always块内部的内容自动识别敏感变量。
如:

always@(*) beginout = a&b&c&d;
end

这样就方便很多。

  • 时序逻辑语法:

时序逻辑的always块将内部敏感列表包括了边沿事件,一般是时钟边沿。

always @ (edge event) begin[multiple statements]
end

例如我们描述一个同步复位的D触发器,可以这样描述:

always@(posedge i_clk) beginif(i_rst) beginq <= 0;endelse beginq <= d;end
end

这表示当检测到时钟上升沿时,判断是否复位有效,如果有效对输出复位,否则采样输入d值。

当然时序逻辑敏感列表中的边沿事件不一定只是时钟,也可以是其他边沿,例如描述一个异步复位的D触发器:

always@(posedge i_clk or negedge i_rst) beginif(i_rst) beginq <= 0;endelse beginq <= d;end
end

这表示当检测到时钟上升沿或者复位的上升沿时,都会触发always块内部的语句。
但是明显看出,复位的优先级更高,也就是说,当检测到复位的上升沿时,无论时钟边沿是否检测到都执行复位操作,否则,当检测到时钟上升沿时,采样输入值d。

什么是敏感列表?

这里提一嘴吧,敏感列表就是触发always块内部语句的条件。

在下面的代码中,每当信号a或b的值发生变化时,always块中的所有语句都会被执行。

// Execute always block whenever value of "a" or "b" change
always @ (a or b) begin[statements]
end

always块是用来干什么的?

always块是Verilog中用来描述组合逻辑以及时序逻辑的语法。
在这上面的语法小节中也说过了。
需要补充的是一个设计中可以有多个always块,或者说一定有很多个always块。
这些硬件块都是相互独立同时工作的。每个块之间的连接是决定数据流的原因。为了模拟这种行为,一个always块被做成一个连续的过程(硬件不可能断断续续工作),当敏感列表中的一个信号变化时,它就会被触发并执行一些动作(always块内的语句)。

如果没有敏感列表怎么办?

这个话题比较有意思,你可能说怎么可能没有敏感列表?其实,还真的可以没有敏感列表,这是仿真中的用法。我们经常使用没有敏感列表的always来表示不断的触发,用此特性来生成时钟。
例如:


always #10 clk = ~clk;

其实,always块内的敏感列表就是为了控制内部语句什么时候触发的。那么可以理解为一种定时,如果没有了敏感列表,则为零延迟,那么就会不断的触发,如下:

// always block is started at time 0 units
// But when is it supposed to be repeated ?
// There is no time control, and hence it will stay and
// be repeated at 0 time units only. This continues
// in a loop and simulation will hang !
always clk = ~clk;

上面显示的示例是一个always块,它试图反转信号clk的值。该语句每0个时间单位执行一次。因此,由于语句中没有延迟,因此它将永远执行。

这是没有意义的,我们正确的做法应该给一个定时或延迟:

即使敏感度列表为空,也应该有其他形式的时间延迟。always如下所示,通过构造中的延迟语句来提前仿真时间。现在,每10个时间单位完成一次时钟反转。

always #10 clk = ~clk;

当然,这种没有敏感列表的显示延迟,是不能综合的,只能用于仿真。

时序逻辑实例

下面显示的代码定义了一个名为tff的模块,该模块接受数据输入,时钟和低电平有效复位。每当在时钟的上升沿发现d为1 时,输出就会反相。此处,该always块在clk的上升沿或rstn的下降沿触发。

module tff (input  		d,clk,rstn,output reg 	q);always @ (posedge clk or negedge rstn) beginif (!rstn)q <= 0;else beginif (d)q <= ~q;elseq <= q;endend
endmodule

组合逻辑实例

开始的语法讲解中其实也举了一些组合逻辑以及时序逻辑的例子,这里在给出使用always块设计组合逻辑的一个例子:
如下图:
组合逻辑
使用always块描述这个逻辑:

module combo (	input 	a,input	b,input	c,input	d,output reg o);always @ (a or b or c or d) begino <= ~((a & b) | (c^d));endendmodule

注意事项

  • always块内被赋值的变量(左值)都应该为reg类型。

本系列相关博文链接:

Verilog初级教程(9)Verilog的运算符

Verilog初级教程(8)Verilog中的assign语句

Verilog初级教程(7)Verilog模块例化以及悬空端口的处理

Verilog初级教程(6)Verilog模块与端口

Verilog初级教程(5)Verilog中的多维数组和存储器

Verilog初级教程(4)Verilog中的标量与向量

Verilog初级教程(3)Verilog 数据类型

Verilog初级教程(2)Verilog HDL的初级语法

Verilog初级教程(1)认识 Verilog HDL

芯片设计抽象层及其设计风格

Verilog以及VHDL所倡导的的代码准则

FPGA/ASIC初学者应该学习Verilog还是VHDL?

  • 个人微信公众号: FPGA LAB

  • 个人博客首页

  • 注:学习交流使用!


参考资料

  • 参考资料1

  • 参考资料2

  • 参考资料3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254239.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

verilog 入门教程

verilog 入门教程 1.1 什么是Verilog HDL? 1.2 Verilog的历史 1.3 Verilog的主要描述能力 2.1 Verilog-模块 2.2 Verilog-时延 2.3 Verilog-assign语句 2.4 Verilog-initial语句 2.5 Verilog-always语句 2.6 Verilog的结构化描述形式 2.7 Verilog-混合设计描述方式 2.8 Veri…

Verilog初级教程(14)Verilog中的赋值语句

文章目录 前言正文合理的左值过程性赋值&#xff08;Procedural assignment&#xff09;连续赋值过程连续性赋值 往期回顾 前言 何为赋值语句&#xff1f;即将值放到线网或者变量上&#xff0c;这种操作称为赋值&#xff0c;英文&#xff1a;assignment. 它有三种基本形式&…

嵌入式开发Verilog教程(二)——Verilog HDL设计方法概述

嵌入式开发Verilog教程&#xff08;二&#xff09;——Verilog HDL设计方法概述 前言一、Verilog HDL语言简介1.1 Verilog HDL语言是什么1.2 Verilog HDL设计复杂数字电路的优点1.2.1 传统设计方法——电路原理图输入法1.2.2 Verilog HDL设计方法与传统设计方法相比较的优势1.2…

嵌入式开发Verilog教程(三)——Verilog HDL基本语法汇总(上)

嵌入式开发Verilog教程&#xff08;三&#xff09;——Verilog HDL基本语法汇总&#xff08;上&#xff09; 前言一、简单的Verilog HDL模块1.1 Verilog HDL程序简单模块1.2 Verilog HDL程序模块结构1.3 Verilog HDL程序模块端口定义1.4 Verilog HDL程序模块内容 二、Verilog H…

SANXIN-B01开发板verilog教程V3电子版

今天给大侠带来“SANXIN-B01开发板verilog教程V3-郝旭帅团队电子版”,V3版本更新了后几章节的高级设计部分,获取电子版资料,请点击左下角阅读原文,跳转叁芯智能科技官方技术论坛下载,或者登录网址www.sxznfpga.com下载。 叁芯智能科技-郝旭帅团队打造“FPGA 设计与研发”学…

Verilog 教程

第一章&#xff1a;Verilog 简介 1.1 Verilog 教程 1.2 Verilog 简介 1.3 Verilog 环境搭建 1.4 Verilog 设计方法第二章&#xff1a;语法要素 2.1 Verilog 基础语法 2.2 Verilog 数值表示 2.3 Verilog 数据类型 2.4 Verilog 表达式 2.5 Verilog 编译指令 第三章…

ol中不同区域加载不同底图

概述 写一篇水文&#xff0c;讲讲如果在openlayers中实现不同的区域加载不同的底图。 效果 实现 通过tileUrlFunction实现不同切片地址的请求。 <!DOCTYPE html> <html><head><title>XYZ</title><link rel"stylesheet" href&qu…

数电/数字电子技术期末考前突击复习(小白稳过,看这一篇就够了)

博主&#xff1a;命运之光 专栏&#xff1a;期末考试必过and不挂科and争高分&#x1f636;‍&#x1f32b;️还有其他科目的考试突击日后会陆续更新 ✨✨✨✨✨点赞&#xff0c;关注&#xff0c;收藏不迷路✨✨✨✨✨ &#x1f984;前言&#xff1a;总结了期末数电大概率可能…

windows 10下载安装mysql5.7

MySQL数据库在日常使用是非常的频繁的&#xff0c;不管是线上还是线下。下面我就分享出我安装MySQL5.7的一步一脚印的教程&#xff0c;本教程只针对windows版本。 下载 MySQL官网下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 选择对应的系统和版本…

【明解STM32】中断系统理论基础知识篇之中断寄存器功能原理

目录 一、前言 二、寄存器概述 三、NVIC寄存器组 四、SCB寄存器组 五、中断屏蔽寄存器组 六、总结 一、前言 在之前的STM32的中断系统理论基础知识之基本原理及NVIC中&#xff0c;分别中断的基本原理&#xff0c;中断的管理机制和中断的处理流程进行了较为详细的论述&…

mysql.exe下载_mysql8 windows 下载安装

一. 下载 点击download 可以注册登录&#xff0c;嫌麻烦的话直接点击NO&#xff0c;thanks… 开始下载 二. 安装 下载完成后得到一个zip包 我是安装板和解压即用版都下了&#xff0c;但用的解压即用版本&#xff0c;比较方便 解压mysql-8.0.17-winx64.zip&#xff0c;得到mysql…

MySQL 64位安装教程,不需要配置my.ini文件

一、下载安装包&#xff0c;官网下载 下载网址&#xff1a;https://dev.mysql.com/downloads/mysql/ 2、MySQLWorkbench 8.0.25下载 二、进行MySql压缩包安装方式配置。 不需要配置环境变量&#xff0c;不需要配置mini文件。下载是这些&#xff0c;自己改一下文件夹名字&…

mysql下载安装(清华源)

鉴于网上大多数MySQL方法均是上官网下载&#xff0c;然而像我这样普通电脑&#xff0c;普通带宽&#xff0c;普通配置的电脑&#xff0c;上那些官网的速度确实不敢恭维&#xff0c;因此写了这篇文章&#xff0c;举个例子&#xff0c;我在家中的是最普通的10M带宽&#xff0c;上…

MySQL 5.6 (Win7 64位)下载、安装与配置图文教程

MySQL是目前十分流行的一种关系型数据库管理系统。官网推出的安装包有两种格式&#xff0c;分别是&#xff1a;ZIP格式和MSI格式。其中MSI格式的可以直接点击安装&#xff0c;按照它给出的安装提示进行安装&#xff0c;一般MySQL将会安装在C:\Program Files\MySQL\MySQL Server…

C++ queue类成员介绍

目录 &#x1f914;queue模板介绍&#xff1a; &#x1f914;queue特点&#xff1a; &#x1f914;queue内存图解&#xff1a; &#x1f914; queue的成员函数 &#x1f50d;queue构造函数&#xff1a; &#x1f50d;queue赋值函数&#xff1a; &#x1f50d;queue判断函…

video标签学习 xgplayer视频播放器分段播放mp4

文章目录 学习链接目标video标签自带视频和制作的视频区别video标签的src属性本地视频文件前端代码播放效果 服务器视频文件示例1后端代码前端代码播放效果 示例2后端代码前端代码播放效果 示例3后端配置前端代码播放效果 video对象video对象创建和获取video的属性video的方法v…

spring cloud Alibaba之Nacos Discovery--服务治理 (二)

接着上一篇文章 搭建的微服务环境, 实现nacos 注册中心实战操作案例 一. 服务治理介绍 先来思考一个问题 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 &#xff08;ip&#xff0c;端口&#xff09;等硬编码到了代码中&a…

PHPMySQL基础(五):模拟登录后跳转+会话存储功能实现

PHP&MySQL基础&#xff08;一&#xff09;:创建数据库并通过PHP进行连接_长风沛雨的博客-CSDN博客 PHP&MySQL基础&#xff08;二&#xff09;:通过PHP对MySQL进行增、删、改、查_长风沛雨的博客-CSDN博客 PHP&MySQL基础&#xff08;三&#xff09;:处理查询SQL返…

excel用条件格式设置隔行变色

1、选中要设置隔行变色的区域 2、点击条件格式—>新建规则—>使用公式确定要设置格式额单元格 3、输入公式 mod(row(),2) 0&#xff0c;点击格式按钮&#xff0c;选择填充的颜色&#xff0c;点击确定。如下图所示&#xff1a; 4、在新建格式规则窗口中点击确定&#x…

Web|设置隔行变色的单元格

问题 表格在日常生活中使用的非常的多,比如excel就是专门用来创建表格的工具,表格就是用来表示一些格式化的数据的,比如:课程表、银行对账单。在网页中也可以来创建出不同的表格。在HTML中,使用table标签来创建一个表格,在table标签中使用tr来表示表格中的一行,有几行就…