深入浅出学Verilog--数据类型

这篇具有很好参考价值的文章主要介绍了深入浅出学Verilog--数据类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、数值类型

        在Verilog可以用4种数值来描述其构建的电路的电平逻辑,除了event类型real类型外,几乎所有的数据类型都可以用这4种数值来表示

  • 0:代表逻辑0,或者条件“
  • 1:代表逻辑1,或者条件“
  • x或X:代表未知值。意味着不确定,可能是逻辑0,也可能是逻辑1。
  • z或Z:代表高阻态,一般用于3态缓冲电路(tri-state buffer)。高阻态常见于该端口没有驱动的情况,其电平值与其所接的上拉或下拉电路有关。若连接到上拉电路,则电平值为逻辑1;反之则为逻辑0。

        不同的仿真软件对这些数值的显示可能各不相同,在xilinx的vivado软件这4种数值的显示是这样的:1是全覆盖的绿色横框;0 是绿色横条;x 是半覆盖的红色横框;z 是半覆盖的蓝色横框。

深入浅出学Verilog--数据类型,Verilog语法,fpga开发,Verilog,Xilinx,IC,FPGA,altera,数据类型,原力计划

2、数据类型

        Verilog中主要有两大类数据类型:

  • Net(网类):Net用来表示电路中的物理链接,例如不同门级电路间的连接就需要使用nets,类似实际电路中的电线。
  • Variable(变量类):变量用来存储电路中的数据,它会一直保存数据直到下一次改写。

2.1、Net类型

        Net用来构建电路中不同元素的物理连接,自身不存储任何数据,它的值只取决于所连接的驱动电路的值(默认值为z,即高阻态)。Net类数据下有很多子类型的数据,比如wire、tri、wand、wor、tri1等等,其中wire类型是最常用的,其他类型数据在实践中几乎不会被用到。

2.1.1、wire类型

        下图中的net_11就是一个net型数据(确切的说应该是wire数据),它左边连接着与门的输出端、右边连接着触发器的输入端。它自身不能存储任何数据,它的值取决于它左侧所连接的与门的输出端,然后它又将这个值赋给它右侧所连接的触发器。

深入浅出学Verilog--数据类型,Verilog语法,fpga开发,Verilog,Xilinx,IC,FPGA,altera,数据类型,原力计划

        下面是几种wire类型的声明方式:

wire        flag;                    //声明一个wire

wire        flag1,flag2;         //声明多个wire

wire        flag = 1'b0;         //声明wire的同时并赋值

      

2.1.2、其他net类型

        除了wire类型外,还有一些其他的net类型。由于verilog语言的灵活性,这些net类型几乎都可以使用wire类型 + 门级电路来构建,所以在实践中,这些类型一般都不会被使用。这里稍微了解一下就可以:

深入浅出学Verilog--数据类型,Verilog语法,fpga开发,Verilog,Xilinx,IC,FPGA,altera,数据类型,原力计划

2.2、Variable类型 

        Variable(变量)类型用来存储电路中的数据,它会一直保存数据直到下一次改写。Variable类型有reg、time、integer、real和realtime5个子类型,其中最为常用的是reg(寄存器)类型。

2.2.1、reg变量 

        reg和wire是verilog中最为常用的两种数据类型,它俩可以分别用来构建组合逻辑电路和时序逻辑电路。

        reg以时钟信号为基准,用来在电路中存储数据,触发器(flip-flop)就是一种典型的存储数据的电路。下面是几种reg变量的声明方式:

reg       flag;                    //声明一个reg

reg       flag1,flag2;         //声明多个reg

reg       flag = 1'b0;         //声明reg的同时并赋值

     

2.2.1、其他变量

integer整数

        整数变量用关键字 integer 来声明,声明时不用指明位宽--位宽和编译器有关(一般为32 bit)。在实践中,integer变量一般用作辅助使用(integer的引入并不会生成硬件电路),例如指定某个reg/wire的位宽(方便更改),或在循环语句中充当循环参数等。例如:

integer i;
always@(*) begin
    for (i=0;i<=5;i=i+1) begin
        ······
    end
end

real(实数)

        实数用关键字 real 来声明,可用十进制或科学计数法来表示。real 声明不能带有范围,默认值为 0。real 可以用来存储浮点数。例如:

real        data1 =1e3;
real        data2 = 3.14;

time、realtime(时间)

        time/realtime变量可以用保存仿真时间,位宽多为64bit,调用系统函数$time/$realtime可以获取当前仿真时间,time和realtime的区别在于,一个是存储整数变量(time),另一个存储实数变量(realtime)。例如:

time         t1  = 25;

realtime   rt1 = 2.5;

3、向量

        在声明wire或reg变量时,如果不指定范围,那么此时的wire/reg就是一个标量(scalar);反之,如果指定了范围,那么此时的wire/reg就是一个向量(Vector)。

        wire类型的向量与标量形式:

wire  [3:0]  n0;        //4位宽的向量wire

wire           n1;        //单位宽的标量wire

深入浅出学Verilog--数据类型,Verilog语法,fpga开发,Verilog,Xilinx,IC,FPGA,altera,数据类型,原力计划

        reg类型的向量与标量形式:

reg  [3:0]  d0;        //4位宽的向量reg

reg           d1;        //单位宽的标量reg

深入浅出学Verilog--数据类型,Verilog语法,fpga开发,Verilog,Xilinx,IC,FPGA,altera,数据类型,原力计划

        向量最左端的值被称为最高有效位MSB(Most Significant Bit),最右端的值被称为最低有效位 LSB(Least Significant Bit)。MSB和LSB的值可以是任意整数(正整数、负整数和零),而且MSB即可以大于LSB,也可以小于LSB,但两者不能相等(相等就是标量了)

        对于向量,可以根据其地址,来对某一位或某几位进行操作。

位操作(bit-selsct)

        可以通过地址索引的方式,对向量中的某一位进行选取和操作,这就是位操作bit-selsct。例如:

深入浅出学Verilog--数据类型,Verilog语法,fpga开发,Verilog,Xilinx,IC,FPGA,altera,数据类型,原力计划

reg  [7:0] addr;         //声明一个8位宽的reg型变量(向量)addr

addr [0] = 1'b1;        //直接对addr的第0位进行操作,将其赋值为1

addr [3] = 1'b0;        //直接对addr的第3位进行操作,将其赋值为0

部分操作(part-selsct) 

        既然可以通过地址作为索引,来对向量的某一位进行操作,那么必然也可以通过多位地址来对向量的多位进行操作,这就是部分操作part-selsct。例如:

深入浅出学Verilog--数据类型,Verilog语法,fpga开发,Verilog,Xilinx,IC,FPGA,altera,数据类型,原力计划

reg  [31:0] addr;                //声明一个32位宽的reg型变量(向量)addr

addr[23:16] = 8'h23;         //直接对addr的第16~23位进行操作,将其赋值为8'h23,即8'b0010_0011

        Verillog 还支持指定 bit 位后固定位宽的向量域选择访问。开始位可以是变化的,但是位宽必须固定为常数,这个语法在循环等语句中非常实用。

  • [start_bit+:width]    //从start_bit开始向上递增width位
  • [start_bit-:width]    //从start_bit开始向下递减width位

 reg  [31-:8]  addr1;        //等价于 reg  [31:24] addr1。实践中起始位31可以变化,位宽固定为8,等于选取该变量的某个8位

 reg  [0+:8]   addr2;        //等价于 reg  [0:7]   addr2。实践中起始位0可以变化,位宽固定为8,等于选取该变量的某个8位

4、数组和存储器

4.1、数组

        在 Verilog 中可以声明 reg, wire, integer, time, real类型的数组(Array)。数组维数没有限制,其中的每个元素可以是标量或者向量。

reg         y1[3:0];                //1维数组,共有4个元素,每个元素位宽为1(即标量)

reg [3:0] y2[3:0];                //1维数组,共有4个元素,每个元素位宽为4

reg [3:0] y3[3:0][15:0];       //2维数组,共有4*16 = 64个元素,每个元素位宽为4

         数组与向量一样,也可以通过地址索引的方式进行访问。

y1 = 0;                        //非法赋值--不能同时对4个元素赋值

y1[0] = 1'b0;               //对y1的第0个元素赋值为1'b0

y2[2] = 4'b1111;          //对y2的第2个元素赋值为4'b1010

y3[2] [1] = 4'b1100;    //对y3的第2行、第1个元素赋值为4'b1100

        需要注意的是,向量是一个单独的元件,其位宽为 n;而数组则由多个元件组成,其每个元件的位宽为 n 或 1。尽管他们的访问方式类似,但它们在定义上就有所区别。

reg [n-1:0]   rega;           // rega是一个reg向量,它只有一个元件,位宽为n

reg  mema [n-1:0];         // mema 是一个数组,它有n个元件,每个元件的位宽为1

4.2、存储器

        存储器(Memory)就是一种一维寄存器数组,它可以用来构建 RAM(可读写) 或 ROM(仅可读)。

深入浅出学Verilog--数据类型,Verilog语法,fpga开发,Verilog,Xilinx,IC,FPGA,altera,数据类型,原力计划

reg [7:0] mem [255:0];        //可以理解为构建了一个256个格子的存储器,每个格子都可以存储8个bit的数据文章来源地址https://www.toymoban.com/news/detail-722076.html


  • 📣您有任何问题,都可以在评论区和我交流📃!
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net
  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

到了这里,关于深入浅出学Verilog--数据类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA信号处理系列文章——深入浅出理解多相滤波器

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 多相滤波是,按照相位均匀划分把数字滤波器的系统函数H(z)分解成若干个具有不同相位的组,形成多个分支,在每个分支上实现滤波。 采用多相滤波结构,可利用多个阶数较低的滤波来实现原本阶数较

    2024年02月05日
    浏览(76)
  • 【FPGA学习记录3-1】Verilog语法之Verilog的数据类型

    写在前面 本科时学过FPGA的相关课程,因此对于Verilog相关语法的学习重在回顾。 1.Verilog的数据类型 Verilog 最常用的 2 种数据类型就是 线(wire)与寄存器(reg) ,其余类型可以理解为这两种数据类型的扩展或辅助。 1.1wire类型 wire 类型表示硬件单元之间的物理连线,由其连接

    2024年02月02日
    浏览(46)
  • 【深入浅出C#】章节 5: 高级面向对象编程:泛型编程和集合类型

    高级面向对象编程是在基础面向对象编程的基础上进一步深入和拓展的一种编程范式。它强调封装、继承和多态的概念,并引入了泛型编程和集合类型等高级特性。高级面向对象编程提供了更灵活、可扩展和可复用的代码结构,能够帮助开发者构建更复杂、更高效的应用程序

    2024年02月16日
    浏览(61)
  • 大数据-玩转数据-深入浅出K8S

    Docker 是一个开源的、轻量级的容器引擎,和 VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少,性能很高。但是,Docker 对应用程序的隔离不如虚拟机彻底,所以它并不能完全取代 VMware。 在传统的开发过程中(我之前的开发过程),以

    2024年02月04日
    浏览(55)
  • 深入浅出堆—C语言版【数据结构】

    二叉树概念博客 :http://t.csdn.cn/XIW84 目录 1. 了解堆 1.1 堆的概念 1.2 堆的性质: 1.3 堆的结构图片 1.3.1 小堆 1.3.2 大堆 2. 堆的实现 2.1 插入数据进堆 2.2 向上调整函数 2.3 堆的删除 2.4 向下调整 3. 堆的应用 3.1 建堆(两种方式) 3.1.1 建堆方式1 3.1.2 建堆方式2 3.2 堆排序  3.3 堆的

    2024年02月04日
    浏览(49)
  • 深入浅出 SQL Server CDC 数据同步

    SQL Server 是一款老牌关系型数据库,自 1988 年由 Microsoft、Sybase 和 Ashton-Tate 三家公司共同推出,不断迭代更新至今,拥有相当广泛的用户群体。 如今,我们提到 SQL Server 通常指 Microsoft SQL Server 2000 之后的版本。 SQL Server 2008 是一个里程碑版本,加入了大量新特性,包括 新的语法

    2024年02月12日
    浏览(42)
  • 【数据结构与算法篇】深入浅出——二叉树(详解)

    ​👻内容专栏:《数据结构与算法专栏》 🐨本文概括: 二叉树是一种常见的数据结构,它在计算机科学中广泛应用。本博客将介绍什么是二叉树、二叉树的顺序与链式结构以及它的基本操作,帮助读者理解和运用这一重要概念。 🐼本文作者: 花 蝶 🐸发布时间:2023.6.5

    2024年02月08日
    浏览(50)
  • 深入浅出二叉树— C语言版【数据结构】

    目录 ​编辑 1.树概念及结构 1.1树的概念 1.2 树的相关概念 ​1.3 树的表示 2.二叉树概念及结构   2.1概念 2.2 特殊的二叉树 2.3 二叉树的性质  2.4 简单二叉树题目练习  2.5 二叉树的存储结构 2.5.1 顺序存储——堆 2.5.2 链式存储 树是一种 非线性的数据结构 ,它是由n(n=0)个有

    2024年02月03日
    浏览(78)
  • 【大数据】深入浅出 Apache Flink:架构、案例和优势

    Apache Flink 是一个强大的开源流处理框架,近年来在大数据社区大受欢迎。它允许用户实时处理和分析大量流式数据,使其成为 欺诈检测 、 股市分析 和 机器学习 等现代应用的理想选择。 在本文中,我们将详细介绍什么是 Apache Flink 以及如何使用它来为您的业务带来益处。

    2024年01月17日
    浏览(48)
  • 探索数据的奥秘:一份深入浅出的数据分析入门指南

    书籍推荐 入门读物 深入浅出数据分析 啤酒与尿布 数据之美 数学之美 数据分析 Scipy and Numpy Python for Data Analysis Bad Data Handbook 集体智慧编程 Machine Learning in Action 机器学习实战 Building Machine Learning Systems with Python 数据挖掘导论 Machine Learning for Hackers 专业读物 Introduction to Semi-Su

    2024年01月21日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包