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. EXPORT_SYMBOL的正常使用

    1.EXPORT_SYMBOL的作用是什么? EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以 ...

  2. ESXI密码正确无法登录

    场景描述: 今天新安装了一个VMware ESXi 6.5的系统,密码仍然用的习惯采用的密码.但在使用中,无论是使用vSphere Client连接,还是在vCenter Server中添加这台ESX ...

  3. openwrt通过gre回源

    创建  ip tunnel add GRE网卡名 mode gre local 本地LAN IP remote SERVER LAN IP ttl 255  ip link set GRE网卡名 up ...

  4. 如何理解JavaScript中常用的4种排序算法?

      如何理解JavaScript中常用的4种排序算法? 冒泡排序 冒泡排序是我们在编程算法中,算是比较常用的排序算法之一,在学习阶段,也是最需要接触理解的算法,所以我们放在第一个来学习. 算法介绍: ...

  5. Vue+element ui 笔记

    1)可以直接拿过来就用的样式 https://www.cnblogs.com/xiao987334176/p/14188413.html 2)对Table里面的每一项全部设定为选中 mounted() ...

  6. Dynamics 365 登录后网页显示空白

    检查IIS的站点,身份验证,是否禁用了windows身份验证以及匿名身份认证:如果是,则启用

  7. redis 和docker等名词了解

    redis redis产生 redis是MySQL数据库经常直接面对大量的读写访问,面对比较复杂的数据据操作,会导致数据库I/O反映缓慢或者奔溃: 有人研究学习CPU从内寸直接读取数据,把MYSQL经 ...

  8. SpringBoot 配置内部tomcat https双向验证

    1.在application.properties或者application.yml配置文件中加入 server: port: 8443 ssl: key-store: classpath:xxxx. ...

  9. python下载.msg文件的附件

    .msg文件,outlook邮件的一种保存方式 方式一:使用win32com库,不过要安装outlook才行 import win32com.client import os def get_atta ...

  10. mongoDB日常操作03

    MongoDB中导出csv文件1.找到mongoDB的安装目录,bin目录2.通过控制台进入bin目录  例: cd E:\java\mongoDB\bin\3.测试mongo.exe能否运行  例: ...