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

文章目录

    • 前言
    • 正文
      • 合理的左值
      • 过程性赋值(Procedural assignment)
      • 连续赋值
      • 过程连续性赋值
    • 往期回顾

前言

何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:assignment.
它有三种基本形式:

  • 过程性赋值
  • 连续赋值
  • 过程连续赋值

正文

合理的左值

一个赋值语句有两个部分–右值(RHS)和左值(LHS),中间有一个相等的符号(=)或一个小于相等的符号(<=)。
下一节博文将看到,=为阻塞赋值,<=为非阻塞赋值。

在过程性赋值中,合理的左值应该是:

  • 变量(矢量/标量)
  • 向量reg、integer或time变量的位选择部分选择
  • 存储器(Memory word)
  • 上述任何一项的合并

过程赋值通常发生在块语句中,例如initial块,always块,还有task以及function中。

连续性赋值中,合理的左值应该为:

  • 线网(矢量/标量)
  • 矢量线网的位选择或部分选择。
  • 位选择和部分选择的合并

连续性赋值通常发生在assign中。

过程连续性赋值:

  • 线网或者变量(向量/标量)
  • 线网向量的位选择或者部分选择

RHS可以包含任何计算为最终值的表达式,而LHS表示一个线网或一个变量,RHS中的值被赋值给它。
例如:

module tb;reg clk;reg a, b, c, d, e;wire f, y;reg  z;// clk is on the LHS and the not of clk forms RHSalways #10 clk = ~clk;// y is the LHS and the constant 1 is RHSassign y = 1;// f is the LHS, and the expression of a,b,d,e forms the RHSassign f = (a | b) ^ (d & e);always @ (posedge clk) begin// z is the LHS, and the expression of a,b,c,d forms the RHSz <= a + b + c + d;endinitial begin// Variable names on the left form LHS while 0 is RHSa <= 0; b <= 0; c <= 0; d <= 0; e <= 0;clk <= 0;end
endmodule

过程性赋值(Procedural assignment)

过程性赋值发生在过程(procedures)中,如always、initial、task和函数中,用于将值放到变量上。变量将保持该值,直到下一次对同一变量的赋值。

当仿真在仿真时间内的某一时刻执行该语句时,该值将被放到变量上。这可以通过使用控制流语句,如if-else-if、case语句和循环机制来控制和修改我们想要的方式。

reg [7:0]  data;
integer    count;
real       period;initial begindata = 8'h3e;period = 4.23;count = 0;
endalways @ (posedge clk)count <= count + 1;

变量声明赋值

一个初始值可以在变量声明时被放置到变量上,如下图所示。这个赋值没有持续时间,并且在下一次对同一变量的赋值发生之前保持这个值。

注意,不允许将变量声明赋值用给数组。

module my_block;reg [31:0] data = 32'hdead_cafe;initial begin#20  data = 32'h1234_5678;    // data will have dead_cafe from time 0 to time 20// At time 20, data will get 12345678end
endmodule
reg [3:0] a = 4'b4;// is equivalent toreg [3:0] a;
initial a = 4'b4;

如果变量在声明过程中和initial块中的时间0被初始化,如下例所示,则不保证赋值顺序,因此变量值可以有8’h05或8’hee。

module my_block;reg [7:0]  addr = 8'h05;initialaddr = 8'hee;
endmodule

这种方式是不推荐的,正常人是不会这么做的。

reg [3:0] array [3:0] = 0;           // illegal
integer i = 0, j;                    // declares two integers i,j and i is assigned 0
real r2 = 4.5, r3 = 8;               // declares two real numbers r2,r3 and are assigned 4.5, 8 resp.
time startTime = 40;                 // declares time variable with initial value 40

连续赋值

这用于将值分配到标量线网和矢量线网上,只要RHS发生变化就会发生。它提供了一种不需要指定门的互连就能建立组合逻辑模型的方法,并使其更容易用逻辑表达式来驱动线网。

// Example model of an AND gate
wire  a, b, c;assign a = b & c;

每当b或c的值发生变化时,RHS中的整个表达式将被计算,a将被更新为新的值。

注意:我们仍然可以在线网声明的时候进行连续赋值,例如:

wire  penable = 1;

但我们必须谨慎使用,因为一个网只能声明一次,所以一个网只能有一次声明赋值。

也就是说,一旦我们在声明wire变量的时候进行了连续赋值,后面则不能再次连续赋值,否则就是多驱动。

过程连续性赋值

这种赋值类型貌似很少听过,但却是存在。
有两种类型:

  • assign ... deassign
  • force ... release

assign … deassign

这将覆盖变量的所有过程性赋值,并通过使用与deassign相同的信号来停用。变量的值将保持不变,直到变量通过过程化或过程化连续赋值获得新的值。赋值语句的LHS不能是位选择、部分选择或数组引用,但可以是一个变量或变量的连接。

reg q;initial beginassign q = 0;#10 deassign q;
end

为了测试,我仿真了一下,仿真文件:

module assign_tb();reg q;initial beginassign q = 0;#10 deassign q;#10 q = 1;#10 $finish;endendmodule

按照语法描述,应该是前20ns都保持为assign赋值0,之后为1;
assign deassign

仿真结果显示也为如此。

force…release

这些语句与assign… deassign语句类似,但也可以应用于网和变量。LHS可以是网的位选择、网的部分选择、变量或网,但不能是数组的引用和变量的位/部分选择。force语句将覆盖所有其他对变量的赋值,直到使用释放关键字释放它。

reg o, a, b;initial beginforce o = a & b;...release o;
end

为了测试,我们设计如下仿真文件:

`timescale 1ns / 1ps
//
// Engineer:reborn lee
// Create Date: 2020/07/18 17:36:02
// Module Name: assign_tb
//module assign_tb();reg o, a = 1, b = 1;initial beginforce o = a & b;#10 a = 0;b = 0;o = 1;#10 a = 1;b = 1;o = 0;#20 release o;#10 a = 1;b = 1;o = 0;#10 a = 0;b = 1;o = 1;#10 $finish;endendmodule

现在对这段简单的测试程序进行分析:
在一开始的时候,由于a和b的初始值都为1,又:

  force o = a & b;

因此,o的值为1;
经过10ns,a和b的值被赋值为0,因此o应该为0,但是此刻:

// force o = a & b;#10 a = 0;b = 0;o = 1;

我们尝试将o拉高;
同样在过10ns:

//initial begin//  force o = a & b;//#10 a = 0;//b = 0;//o = 1;#10 a = 1;b = 1;o = 0;

我们再次尝试将o拉低;
从如下仿真图中可以看出均为成功。
release之前
这说明,在release之前,对变量o的所有操作都被忽视了。

继续看,在release之后,我们对o的操作都是成功的:

release之后

往期回顾

Verilog初级教程(13)Verilog中的块语句

Verilog初级教程(12)Verilog中的generate块

Verilog初级教程(11)Verilog中的initial块

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

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

交个朋友

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

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

相关文章

嵌入式开发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来表示表格中的一行,有几行就…

Excel小技巧,隔行变色,多行变色

Excel小技巧&#xff0c;隔行变色&#xff0c;多行变色&#xff0c;间隔色&#xff0c;关键在于公式&#xff1a; mod(row(),x)y 其中x指期望的每隔&#xff08;x-1&#xff09;行变色&#xff0c;y等于每隔的第(y1)行&#xff1b; 比如&#xff1a;mod(row(),2)0 用来设置每…

[蓝桥杯/java/算法]A——隔行变色

&#x1f9d1;‍&#x1f393;个人介绍&#xff1a;大二软件生&#xff0c;现学JAVA、Linux、MySQL、算法 &#x1f4bb;博客主页&#xff1a;渡过晚枫渡过晚枫 &#x1f453;系列专栏&#xff1a;[编程神域 C语言]&#xff0c;[java/初学者]&#xff0c;[蓝桥杯] &#x1f4d6…