Verilog 变量声明与数据类型一
Verilog语法中最基本的数据类型有 线网(wire),寄存器(reg)和整数(integer)三种类型,这三种数据类型是可综合的数据类型,在Verilog 程序设计中被广泛使用。其它还有可以用于仿真的数据类型如 timer,real,字符串等变量都可以看作reg类型的扩展。wire,reg ,integer,timer,real是声明变量类型的关键字。变量必须先声明后使用,声明后变量的数据类型也就确定了。变量声明是模块(module)内惟一的,不能在同一个模块或函数内重复声明。
  1. 线网(wire):
线网(wire)类型表示逻辑单元或实例之间的连线,一般由逻辑单元的输出驱动。没有连接驱动的wire型变量的值为高阻’z’。
  • wire类型变量的使用:
  • wire型变量的声明与赋值
 
wire类型的变量只能由assign语句赋值,或在声明时赋初值。而且赋值的机会只有一次。
变量声明实例:
wire a, b;
wire c = 0;
wire d = 1'b1;
assign a = c;
声明a, b为线网类型,并将c的值赋给a, 此时a的为0;而且a只有这一次赋值机会。
变量c在声明的时候赋初值为0,此后c就一直保留该值,不能再给c赋值,也不能再次声明。
注意:wire类型的变量不能重复赋值。
  •  
  • 桥接
 
Wire 型变量作为中间变量可以实现桥接的作用。在下面的例子中可以看出,wire型变量起到变量之间值传递的作用。
实例1:
module wire_bridge
(
input a,b,ci,
output y,co
);
 
wire d, e, f;
 
assign d = a ^ b;
assign e = a & b;
assign f = ci & d;
assign y = d ^ ci;
assign co = e | f;
 
endmodule
wire变量在逻辑电路中的对应关系,简单的说就是起到连线的作用。
 
 
在例化模块之间传递变量。
实例2:
module fadder4
(
input ci,
input [3:0] a,
input [3:0] b,
 
output [3:0] y,
output co
);
 
wire co1,co2,co3;
 
// 例化 一位全加器,并重复使用4次
fadder1 fadder1_inst1
(
.ci (ci),
.a (a[0]),
.b (b[0]),
.y (y[0]),
.co (co1)
);
 
fadder1 fadder1_inst2
(
.ci (co1),
.a (a[1]),
.b (b[1]),
.y (y[1]),
.co (co2)
);
 
fadder1 fadder1_inst3
(
.ci (co2),
.a (a[2]),
.b (b[2]),
.y (y[2]),
.co (co3)
);
 
fadder1 fadder1_inst4
(
.ci (co3),
.a (a[3]),
.b (b[3]),
.y (y[3]),
.co (co)
);
 
endmodule
wire型变量只能在并发语句或例化模块中被赋值,如实例1中的 d,e,f和实例2中co1,co2,co3; 但wire型变量可以根据需要在并发语句或顺序语句中赋值给其他变量。
对wire型变量的变量赋值,只能采用并发语句赋值。变量定义时初始化时赋值和例化模块的输出赋值,wire型变量不能在顺序语句中被赋值。
寄存器(reg )类型:
寄存器(reg)是一种具有记忆功能的数据类型。用来表示存储单元,它会保持数据原有的值,直到被改写。一般分为锁存器和触发器两种。但无论哪一种建模,它们都只能在顺序语句中被赋值,而不能在并发语句中赋值。
例:
reg a; reg b; always@(*) begin a <= 1’b1; b <= 1’b0; end
而 assign a = 1’b1; 就是错误的;因为a是reg型变量。
与wire类型变量不同的时,在reg型变量声明时可以赋初值,而后续的顺序语句可以对该变量继续赋值,从而修改原值。而wire型变量只有一次赋值机会。
注意:在同一个顺序过程语句中可以对reg型变量多次赋值,后面的赋值会替代前面的赋值,充分利用这一特点,可以是程序更简洁。但不允许在多个顺序过程语句中对同一个reg型变量都赋值。
 
module reg_assign ( input clk, input a, input b, input sel, output c ); reg ma; //顺序过程语句1 always @(posedge clk) begin if(sel) ma <= a; end //顺序过程语句2 always @(posedge clk) begin if(!sel) ma <= b; end assign c = ma; endmodule
上面的例子红色部分是有问题的,虽然reg 型变量允许被多次赋值,但不能在不同的顺序过程中多次赋值。上面的代码可以修改如下:
module reg_assign
(
input clk,
 
input a,
input b,
 
input sel,
output c
);
 
reg ma;
 
//顺序过程语句1
always @(posedge clk)
begin
if(sel)
ma <= a;
else
ma <= b;
end
 
assign c = ma;
 
endmodule
wire型变量与reg型变量都可以使用向量(vector)进行声明;
如 : wire [3:0] a, b;
reg [3:0] c, d;
向量的运算遵循运算符的规则,细节参见verilog 运算符。

Verilog 变量声明与数据类型一的更多相关文章

  1. javascript的变量声明、数据类型

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. javascript的变量声明和数据类型

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. JavaScript中变量声明以及数据类型

    JavaScript变量 变量名必须以字母或下划线("_")开头 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做) 变量名称对大小写敏感(y 和 Y 是不同的变量) 变量可 ...

  4. JavaScript 基础 (变量声明, 数据类型, 控制语句)

    创建: 2017/09/16 更新: 2017/09/24 更改标题 [JavaScript 概要]-> [JavaScript 基础] 完成: 2017/09/25 更新: 2017/10/0 ...

  5. java变量的声明和数据类型

    一.关键字 java程序语言的关键字只有53个.具体如下: 访问控制:private.protected.public 修饰类.方法.属性和变量:abstract.class.extends.fina ...

  6. Javascript用途,语法特点,难点,调试工具,引入方式,命名规范,变量声明及赋值,数据类型,运算符

    JavaScript用来干什么 数据的验证 将动态的内容写入到网页当中(ajax) 对事件做出相应 读写html当中的内容 检测浏览器 创建cookies 模拟动画 语法特点 基于对象和事件驱动的松散 ...

  7. c++中变量声明和变量定义的区别。2016年12月6日

    整个流程: 1.程序告诉cpu,程序将要使用一个变量.(暂时不一定用到,先说一下.) 2.程序告诉CPU,程序现在就要使用一个变量.(现在就用) 3.cpu按照这个变量的类型,把内存划分出几个单位(b ...

  8. JavaScript学习01 语言简介、基本使用和变量声明

    JavaScript语言简介.基本使用和变量声明 JavaScript是网景(Netscape)公司开发的一种基于客户端浏览器.面向对象.事件驱动式的网页脚本语言. JavaScript的前身叫Liv ...

  9. js常用函数、书写可读性的js、js变量声明...

    1.Array类型函数 array.concat(item...) 函数功能:关联数组,实现数组相加功能,但并不影响原先数组,concat返回新数组. array.join(separator) 函数 ...

  10. 不可或缺 Windows Native (2) - C 语言: 常量,变量,基本数据类型

    [源码下载] 不可或缺 Windows Native (2) - C 语言: 常量,变量,基本数据类型 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 常量 变量 基本 ...

随机推荐

  1. pip python的包成功,但是import的时候报错

    今天,一位同学线上反馈import python包失败了,同时附带两张图: 图1.报错代码 图2.报错提示 结合上面两个图片,我们发现这个同学import全部失败,初步怀疑该同学的本地环境上没有num ...

  2. BIP 两个请求成功后,才能做某一件事

    //保存前校验 let SetXStatus = 0; viewModel.on("beforeSave", function (args) { let _this = this; ...

  3. pytorch的inverse算子转onnx失败

    https://github.com/microsoft/onnxruntime-extensions/blob/main/tutorials/pytorch_custom_ops_tutorial. ...

  4. onnxruntime源码解析之C接口实现

    onnxruntime的C接口,位置为include/onnxruntime/core/session/onnxruntime_c_api.h. 上述文件包含了C函数的声明,对应的实现在onnxrun ...

  5. vue super flow 多种形状

    1 <template> 2 <v-container class="workflow-container" grid-list-xl fluid> 3 & ...

  6. oracle to_char函数的用法

    select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual; 其中,HH24代表是24小时制的,mi代表分钟,不要写为mm

  7. 综合java admin后台记录

    在新冠将来未来的气氛下,做一些年终封箱吧,这个事没做完,但暂时可能也没时间做,待来年了 https://hooray.gitee.io/fantastic-admin/ https://github. ...

  8. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M5:test (default-test) on project

    updated to from jdk16 Java jdk 8 or 11 to support jenkins Build run. Plugin management tags aligned ...

  9. 08 安装虚拟机:Windows 10

    08 安装虚拟机:Windows 10 在安装虚拟机之前,总是要有安装来源媒体(例如:ISO映像之类),方可顺利进行.在Proxmox VE中有几种将ISO档置入Proxmox VE的方式,本节介绍其 ...

  10. geoserver官网

    https://www.osgeo.cn/geoserver-user-manual/index.html