Verilog中共有19种数据类型。

基本的四种类型: reg型、wire型、integer型、parameter型。

其他类型:large型、medium型、small型、scalared型、time型、tri型、trio型、tril型、triand型、trior型、trireg型、vectored型、wand型和wor型。

这14中数据类型除time外都与基本逻辑单元建库有关。

A、常 量

(1)数 字

整数,整型常量即整常数有以下4种进制表示形式:1)二进制(b或B);2)十进制(d或D);3)十六进制(h或H);4)八进制(o或O)。

数字表达式分为三种:

1)<位宽><进制><数字>,这是最完整的形式。

2)<进制><数字>,数字的位宽采用默认位宽(不同的机器系统不同,至少32位)。

3)<数字>,采用默认进制(十进制)。

示例:(位宽指的是时间所占位数,而不是指十六进制有几位。如示例二,每一位十六进制数字需要4位二进制数字表示,所以2位十六进制的位宽为8)

8'b10101100    //位宽为8的二进制数字10101100

8'ha2               //位宽为8的十六进制数字a2

x值和z值:在数字电路中,x代表不定值,z代表高阻值。一个x可以定义十六进制的4位,八进制的3位。z的表示方式同x相同,另外z亦可以用“?”来表示。(case块中用得较多)

4'b10x0            //位宽为4的二进制数从低位数起第二位为不定值

4'b101z            //位宽为4的二进制数从低位数起第一位为高阻值

12'dz               //位宽为12的10进制数,其值为高阻值(形式一)

12'd?               //位宽为12的10进制数,其值为高阻值(形式二)

8'h4x               //位宽为8的十六进制数,其低4位为不定值

负数:在位宽前面加一个减号,减号必须在数字定义表达式的最前面。

-8'd5               //代表5的补数(采用8位二进制表示)

下划线:用于区别开数字的表达式以提高程序的可读性。不能用在位宽和进制的地方,只能用在数字之间(数字前也不可以)。

16'b1010_1011_1111_1010    //合法形式

常量未加标志时,默认为32位的十进制数,字母用八位的ASCII值表示。

"AB"=16'b01000001_01000010             //字符串AB,为十六进制数16'h4142

(2)参数型(parameter)

用parameter来定义一个标志符代表一个常量,称作符号常量,他可以提高程序的可读性和可维护性。parameter是参数型数据的关键字,在每一个赋值语句的右边都必须是一个常数表达式。即该表达式只能包含数字或先前已经定义的参数。

parameter     msb=7;                 //定义参数msb=7

parameter     r=5.7;                   //定义r为一个实型参数5.7

parameter     byte_size=8,byte_msb=byte_size-1;        //利用常数表达式赋值

参数型常量经常用于定义延迟时间和变量宽度。在模块和实例引用时,可以通过参数传递改变在被引用模块或实例中已经定义的参数。

本书(1)(p31)介绍了两种方法:

1)引用实例时,通过参数的传递来改变已经定义的参数值。    Decode   #(4,0) D1(A4,F16)

2)在多层次的模块中,改变参数需要使用defparam命令。     defparam   Test.T.B1.P=2;         //Test、T、B1分别是高层模块中的底层模块实例。

B、变 量

网络数据类型表示结构实体之间的物理连接。网络数据类型的变量不能储存数值,而且必须受到驱动器(门或连续赋值语句assign)的驱动。

(1)wire型,默认为高阻值z。

网络数据类型包括 wire型 和 tri型 数据。

wire用于表示单个门驱动或者连续赋值语句驱动的网络数据类型;

tri型则用来表示多驱动器驱动的网络型数据。

如果没有定义wire和tri的逻辑强度,在多驱动元的情况下逻辑值会发生冲突,从而产生不确定值。(z的优先级最低,x的优先级最高)

wire / tri 0 1 x z

0

0 x x 0
1 x 1 x

1

x

x x x x

z

0 1 x z

wire经常用来表示以assign为关键字的组合逻辑信号。Verilog程序模块中输入输出的信号类型默认时自动定义为wire型。参数定义格式如下;

wire [n-1,0] 数据名1,数据名2...数据名i;          //表示共有 i 条总线,每台总线内有n条线路。或者 wire [n,1] 数据名1,数据名2...数据名i;

[n-1,0] 和 [n,1] 表示该数据的位宽为n。如:

wire      a;            //定义了1个1位的wire数据

wire    [7,0] b;       //定义了1个8位的wire数据

wire    [4,1] a,b;    //定义了2个4位的wire数据

(2)reg型,默认为不定值x。

寄存器是存储单元的抽象,寄存器数据类型的关键字是reg。常用来表示always模块内的指定信号,代表触发器。在always模块内被赋值的每一个信号都必须定义成reg型。格式与wire型类似:

reg [n-1,0] 数据名1,数据名2,...数据名i;

reg [n,1]  数据名1,数据名2,...数据名i;

reg数据可以赋正值,也可以赋负值。但是当一个reg数据是一个表达式的操作式时,它的值被当做无符号值,即正值。如:4位的reg被赋值为-1,在表达式中为+15.

reg型只是表示被定义的信号将被用在always模块中,并不是说reg型数据就一定是存储器或触发器的输出。

(3)memory型(特殊的reg)

在Verilog中通过对reg数据建立数组来对存储器进行建模,用来买哦书RAM ROM和reg文件。verilog中没有多维数组存在,memory型数据是通过扩展reg型数据的地址范围实现的。存储器的地址索引必须是常数表达式(n-1,m-1等必须是常量,符号常量也可以)。如:

reg      [n-1,0] 存储器名[m-1,0];

reg      [n-1,0] 存储器名[m,1];

在这里[n-1,0]定义了存储器中每一个存储单元的大小,即n位寄存器。存储器名后面的[m-1,0],表示定义的存储器中有多少个这样的寄存器。

reg     [7,0] mem[255,0];           //256个8位寄存器的存储器mem

reg     [n-1,0] rega;                   //一个n位的寄存器

reg     mema[n-1,0]                   //n个1位的寄存器形成的存储器

rega = 0;                                  //合法,对n位的寄存器赋值位0

mema = 0;                               //非法,不能对完整的存储器直接赋值

mema[3] = 0;                          //合法,将mema中第三个存储单元赋值为0

Verilog中基本的数据类型相关推荐

  1. 萌新食用:Verilog中wire和reg数据类型的区别

    萌新食用:Verilog中wire和reg数据类型的区别 最近恰好在学习数电相关知识扯到Verilog中的wire与reg类型数据的区别: 总的来说,其实就一句话:wire相当于物理连线,而reg相当 ...

  2. Verilog 中 wire 和 reg 数据类型区别

    两者差别很大,完全不能取消. 在Verilog中,wire永远是wire,就是相当于一条连线,用来连接电路,不能存储数据,无驱动能力,是组合逻辑,只能在assign左侧赋值,不能在always @ 中 ...

  3. FPGA的设计艺术(18)如何使用Verilog中的数组对存储器进行建模?

    前言 Verilog中的二维数组很有用,可以使用for以及generate for配合二维数组进行使用,可以代替大量寄存器的场合,其实大量同类寄存器可以使用存储器进行代替,Verilog中可以使用二维 ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. ROS关于cv_brige的使用
  2. WebView你真的熟悉吗?看了才知道
  3. 78.Zabbix监控Nginx
  4. YbOJ-网格序列【拉格朗日插值】
  5. 写一些脚本的心得总结系列第3篇------同步数据到其他表
  6. windows虚拟机_iOS 版虚拟机:在 iPhone 上运行 Windows 系统
  7. hp-ux ftp启动_您可以做12项免费的事情来快速启动UX设计事业
  8. Linux执行U盘里内程序,Linux 最小系统挂载U盘(SD、TF卡)并执行程序
  9. vue加载中展示【nprogress(进度条)Lottie(动画)】
  10. oracle用户新建和授权,oracle创建用户及受权
  11. python nlp文本摘要_NLP(十一) 提取文本摘要
  12. 代码弱鸡竟然在CSDN写烘焙博客
  13. postgresql-timescaldb_extention
  14. latex 公式换行_如何在微信公众号中!编辑出漂亮的数学公式?
  15. 组合数学$1排列组合
  16. 通过SnmpWalk获取服务器状态信息
  17. MYSQL的函数与Navicat的使用
  18. Work20230417
  19. python pandas csv 写文件_Pandas读写CSV文件的方法介绍(附代码)
  20. ZBrush中的皮肤纹理该怎么添加

热门文章

  1. 2021年春季学期-信号与系统-第八次作业参考答案-第四小题
  2. 2021年春季学期-信号与系统-第二次作业参考答案-第十小题
  3. php ckey=6,ThinkPHP6 核心分析(十):事件
  4. matlab如何进对图像进行透视变换,在Matlab中实现透视变换的方法 | 学步园
  5. 安卓java修改按钮大小_android弹出activity设置大小的方法
  6. 初级脚本Ubuntu18-20.04版本以上设置静态IP地址
  7. oracle链接字符串java,java连Oracle连接字符串写法
  8. FPGA之道(52)状态机的概念
  9. HDLBits 系列(18) BCD码计数器的设计
  10. 入门架构——单机高性能