文章目录

  • 前言
  • 正文
    • 变量可以取什么样的值?
    • 变量的取值意味着什么?
    • 主要的数据类型
    • 其他数据类型
      • integer
      • time / realtime
      • real
      • 例子
    • Verilog的字符串
  • 写在最后

前言

这是本系列的第三篇博文,依然很基础,这个系列文章,主要是在没有其他事情的时候,休闲所作!
如问,有没有意义,我觉得对我来说是有意义的:

  • 首先,对于我写博客的条理性来说,是有意义的,以前写博客,想到什么写什么,现在需要条理性,也是对知识的一种回顾!
  • 其次,对于初学者以及看我博客的人来说,可以作为一种资料来源用作参考!
  • 最后,保持写作,写着写着也许就有思路了呢?

我的微信公众号: FPGA LAB

正文

本篇博客讲的是Verilog HDL中的数据类型,我最常用的数据类型,无非就三种,reg、wire,integer;其中integer 主要在for 循环中使用。

变量可以取什么样的值?

变量的取值有四种,由于是数字电路,固然是0和1,那第三种、第四种呢?
高阻态 Z以及未知态X。我们在仿真中常见到这两种状态,有的时候还弄得人很不爽快!

  • 何为高阻态?

高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,类似于引脚悬空,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定。

更详细的解释见博客:

三态之高阻态

FPGA基础知识极简教程(8)详解三态缓冲器

  • 何为未知态?

未知态,顾名思义,代表不知道的逻辑值,可以是0也可以是1.

如下总结:

logic value meaning
0 represents a logic zero, or a false condition
1 represents a logic one, or a true condition
x represents an unknown logic value (can be zero or one)
z represents a high-impedance state

示意图:

变量的取值意味着什么?

Verilog是一种硬件描述语言,用于描述触发器,与非门等等一系列的硬件逻辑,因此,其逻辑取值应该在硬件电路中有所对应!

  • 逻辑1代表着电源电压Vdd,逻辑0代表着接地!
  • 未知态X可以是0也可以是1,这与布尔代数有所差异,其表示无关!
  • 高阻态Z表示未连接任何导线,悬空。

主要的数据类型

主要的数据类型,莫过于reg类型和wire类型,Verilog几乎可以用这两种类型通吃了。

  • wire类似于将两个部件在电路板上连接起来:

它用于硬件实体之间的连接,因此不会存储任何值,仅仅起到连接元件的作用:

如果需要多个连线,还可以设置wire的位宽,相当于将几个线捆扎在一起:

wire [3:0] n0;

最后关于wire类型需要注意的是,重复声明或定义是不合规的。

module design;wire    abc;wire   a;wire   b;wire   c;wire    abc;   // Error: Identifier "abc" previously declaredassign abc = a & b | c;
endmodule
  • reg类型变量可用于数据的存储,其可以看做是register的缩写,也即是寄存器!

如下:

上面的定义,相当于分别定义了一个4bit的存储空间和一个8bit的存储空间,可以用来存储数值。

下图显示了,这种变量在硬件电路中的等价:

其他数据类型

integer

除了wire以及reg型变量,另一个比较常用的便是integer数据类型了,它表示了32bit的数据宽度,用来存储整型值,我们在for循环中常常用到它,例如:

for(integer i = 0; i < 10; i = i + 1) begin
//......
end

或者:

integer i = 0;
for(i = 0; i < 10; i = i + 1) begin
//......
end

time / realtime

这两种类型一般用于仿真,time类型是一个无符号,64bit宽的数据类型,可以用来存储仿真时间用于调试。
realtime的区别在于仅存储浮点型数据。

例如:

    time        end_time;           // end_time can be stored a time value like 50nsrealtime    rtime;              // rtime = 40.25ps

real

real型变量可以存储浮点值,可以像整数和reg一样进行赋值。

如:

    real        float;              // float = 12.344  - can store floating numbers

例子

module testbench;integer    int_a;         // Integer variablereal     real_b;       // Real variabletime     time_c;       // Time variableinitial beginint_a   = 32'hcafe_1234;   // Assign an integer valuereal_b   = 0.1234567;     // Assign a floating point value#20;             // Advance simulation time by 20 unitstime_c   = $time;       // Assign current simulation time// Now print all variables using $display system task$display ("int_a   = 0x%0h", int_a);$display ("real_b   = %0.5f", real_b);$display ("time_c   = %0t", time_c);end
endmodule

仿真结果:

ncsim> run
int_a   = 0xcafe1234
real_b  = 0.12346
time_c  = 20
ncsim: *W,RNQUIE: Simulation is complete.

Verilog的字符串

字符串在reg中被还原,reg变量的宽度必须足够大,以容纳字符串。字符串中的每个字符代表一个ASCll值,需要1个字节。如果变量的大小小于字符串,那么Verilog会截断字符串的最左边的位。如果变量的大小大于字符串,那么Verilog会在字符串的左边添加0。


// "Hello World" requires 11 bytesreg [8*11:1] str = "Hello World";         // Variable can store 11 bytes, str = "Hello World"
reg [8*5:1]  str = "Hello World";         // Variable stores only 5 bytes (rest is truncated), str = "World"
reg [8*20:1] str = "Hello World";         // Variable can store 20 bytes (rest is padded with zeros), str = "         Hello World"

下面举一个例子进行仿真:

module testbench;reg [8*11:1] str1;reg [8*5:1]  str2;reg [8*20:1] str3;initial beginstr1 = "Hello World";str2 = "Hello World";str3 = "Hello World";$display ("str1 = %s", str1);$display ("str2 = %s", str2);$display ("str3 = %s", str3);end
endmodule

仿真结果:

ncsim> run
str1 = Hello World
str2 = World
str3 =          Hello World
ncsim: *W,RNQUIE: Simulation is complete.

写在最后

  • 个人微信公众号:FPGA LAB

  • 知乎:李锐博恩

  • FPGA/IC技术交流2020

Verilog初级教程(3)Verilog 数据类型相关推荐

  1. Verilog初级教程(23)Verilog仿真中的显示任务

    文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...

  2. Verilog初级教程(21)Verilog中的延迟控制语句

    文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...

  3. Verilog初级教程(20)Verilog中的`ifdef 条件编译语句

    文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...

  4. Verilog初级教程(15)Verilog中的阻塞与非阻塞语句

    文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...

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

    文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...

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

    文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...

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

    文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...

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

    博文目录 写在前面 正文 Verilog算术运算符 Verilog关系运算符 Verilog等价运算符 Verilog逻辑运算符 Verilog位元运算符 Verilog移位运算符 参考资料 交个朋友 ...

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

    博文目录 写在前面 正文 按顺序排列的端口连接 按名称排列的端口连接 未连接/悬空端口处理 关于模块端口的说明 参考资料 交个朋友 写在前面 此系列相关博文: Verilog初级教程(6)Verilo ...

  10. Verilog初级教程(19)Verilog中的参数

    文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...

最新文章

  1. pyspider爬虫学习-文档翻译-About-Projects.md
  2. DataGridView控件60招(一)
  3. codevs 2612 最有分解方案 (贪心)
  4. 跨越跨域大山,前端不得不知道的Ajax
  5. c/c++整理--c++面向对象(5)
  6. 初涉c#设计模式-Iterator Pattern
  7. windows下socket开发tcp程序 简单例子
  8. 【剑指offer】二叉搜索树转双向链表,C++实现
  9. 基于docker使用jenkins集成sonar
  10. Asp.NET MVC 技术参考:http://kb.cnblogs.com/zt/mvc/
  11. 英文环境中Wine微信不能显示中文
  12. php代码写一串新年祝福,新年祝福QQ留言代码_把幸福装的满满的
  13. [今日阅读] [TSE 2019] - Mining Fix Patterns for FindBugs Violations
  14. ForkJoinPool的使用及基本原理
  15. android 插屏广告代码,插屏实现说明
  16. 高德地图ar步行导航使用教程分享
  17. 删除Word文档空白页的方法,日常必备!
  18. HTTP请求的过程与TCP连接的过程
  19. Linux 之 开机自启动
  20. 【MySQL】DDL(Data Definition Language)数据定义语言之操作数据库

热门文章

  1. shutdown命令远程关机
  2. java jar 版本号_java – 获取JAR文件版本号
  3. 2019中南大学考研计算机考试,中南大学2019年全国硕士研究生入学考试《计算机网络》考.PDF...
  4. 查询页面代码运行时间
  5. android webview 更新,Android WebView缓存没更新解决方案
  6. solidworks activator未响应_SolidWorks之初识工程图
  7. 虚拟机无法访问主机mysql_解决虚拟机linux端mysql数据库无法远程访问
  8. java tm 安装在哪里,安装以及配置Java环境
  9. java validation_java bean validation 参数验证
  10. 北京科技大学智能视觉参赛队伍 - 对于比赛总结