【Verilog】二、Verilog基础语法

这篇具有很好参考价值的文章主要介绍了【Verilog】二、Verilog基础语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

前言

一、简单的Verilog知识

1.1、Verilog端口定义

1.2、Verilog的标识符

1.3、Verilog的逻辑值

1.4、Verilog的数字进制

1.5、Verilog的数据类型

1.5.1、reg型        

1.5.2、wire型

1.5.3、参数类型

1.6、Verilog的运算符

1.6.1、算术运算符

1.6.2、关系运算符

1.6.3、逻辑运算符

1.6.4、条件运算符

1.6.5、位运算符

1.6.6、移位运算符

1.6.7、拼接运算符

二、Verilog程序设计

2.1、Verilog程序框架搭建

2.2、Verilog程序注释

2.3、Verilog关键字

总结


前言

        上文我们对Verilog语言有了一定的了解,知道了Verilog语言是一种硬件描述语言,他能够在EDA工具上综合成实际的电路,在FPGA或者单片机开发领域有着很高的地位。

        我们学习一门语言,肯定需要学习它的语法结构,就像学习C语言一样,我们相应对某一事件重复操作,我们可以用for循环实现,这就是一种语法结构,弄清楚了会极大地提高我们的开发效率。Verilog语言的语法结构还是挺简单的,相信比其他语言来得容易。


一、简单的Verilog知识

1.1、Verilog端口定义

        下面我们看一端简单的代码来了解Verilog的端口定义基础知识:

        module adder(
            input  [2:0]  a       ,
            input  [2:0]  b       ,
            input         cin       ,

            output        count  ,
            output [2:0]  sum     
        );

                assign {count,sum} = a + b + cin;

        endmodule

        这个例子通过连续赋值语句描述了一个模块名为adder的三位加法器可以根据两个三比特数a、b和进位cin计算出和(sum)和进位(count)。

        通过这个例子,一个模块由module开头,endmodule结束,紧跟着module后面的是模块名。模块名后面括号里面的是输入输出端口信号,input为输入端口,output为输出端口,中括号里面是位宽,当没有指定位宽时默认为32位宽,{}叫做位拼接运输符,中间用逗号隔开,后面我们会细讲。

1.2、Verilog的标识符

        标识符用于定义模块名、端口名和信号名等,上面代码里的adder就是一个标识符,也是模块名。Verilog的标识符可以是任意一组数字、字母、下划线等符号的组合,但是标识符的第一个字符必须是字母或者下划线。

        标识符虽然可以任意定义,但是它是区分大小写的,比如Count和count就不是同一个标识符,这点需要注意。对于标识符的定义虽然没有限制,但是我们最好还是遵循一定的规则,以便于你以后回来对代码升级维护时一眼就能知道这个模块是干什么的。

关于标识符的规范,我这里有几个建议:

        ① 模块名定义最好见名知其意,定义的模块名最好和代码实现的功能相关,如sum等。

        ② 用下划线来隔开两个词组,看起来简单易懂,如cpu_addr就要比cpuaddr好很多。

        ③ 系统时钟和复位信号统一写法,系统时钟用clk,复位用rst_n。

        ④ 采用一些前缀或者后缀命名,如cnt_500ms、clk_50mhz等。

        ⑤ 参数统一大写,如TIME_SHOW。

        ⑥ 自定义的标识符不能与关键字同名。

1.3、Verilog的逻辑值

逻辑电路中一般有4种逻辑值,表示4种逻辑状态:

        逻辑 0:表示低电平,也就是对应电路中的接地(GND)。

        逻辑 1:表示高电平,也就是对应电路中的电源(VCC)。

        逻辑 X:表示未知态,有可能是高电平,也有可能是低电平。

        逻辑 Z:表示高阻态,即表示一个悬空状态。

1.4、Verilog的数字进制

        在Verilog语言中的进制格式主要有二进制、八进制、十进制和十六进制,一般我们常用的就是二进制、十进制和十六进制。

        ① 二进制:只有0和1两字符,满二进一,4’b0010表示4位二进制数字0010;

        ② 八进制:满八进一,4'o0011表示4位八进制数字0011;

        ③ 十进制:满十进一,4'd2表示4位十进制数字2;

        ④ 十六进制:满十六进1,4'ha表示4位十六进制数字a,十六进制的计数方式为0~f。

在进制换算中我们还需要注意:

        ① 换算为二进制后位宽的总长度 > 与数值进制符号对应的数值的实际位数时,则自动在与数值进制符号对应的数值的左边补0。如2'd10换算成二进制为4'b1010,则把2'd10补位为4'd0010。

        ② 换算为二进制后位宽的总长度 < 与数值进制符号对应的数值的实际位数时,自动截断与数值进制符号对应的数值左边超出的位数。

        ③ 数字中的下划线没有任何意义,只是为了提高可读性,如25_0000与250000相同。

1.5、Verilog的数据类型

        在Verilog语法中,主要有三大数据类型,分别是寄存器类型,线网类型和参数类型。

1.5.1、reg型        

        寄存器是数据存储单元的抽象。寄存器数据类型的关键字是reg,通过赋值语句可以改变寄存器储存的值,但reg类型只能在always语句和initial语句中被赋值,并且它的值从一个赋值到另一个赋值过程中被保存下来。如果该过程语句描述的是时序逻辑,即always语句中带有时钟信号,则该寄存器变量对应为寄存器;如果该过程语句描述的是组合逻辑,即always语句中没有时钟信号,则该寄存器变量对应为硬件连线。寄存器类型的却省值是X,寄存器的数据类型有很多种,如reg、integer、real等,但我们常用的就是reg类型。  

1.5.2、wire型

      wire型数据常用来表示用于以assign关键字指定的组合逻辑信号。 线网类型表示Verilog结构化元件间的物理连线,它的值由驱动元件的值确定。如果没有驱动元件连接到线网,线网的缺省值为z(高阻态)。 

1.5.3、参数类型

        所谓参数其实就是一个常量,我们在状态机定义、数据大小定义时都会用到参数,由于它可以在编译时修改参数的值,因此它又常被用于一些参数可调的模块中,使用户在实例化模块时,可以根据需要配置参数。

        参数类型可以分为全局参数类型和局部参数类型,所谓全局参数类型是指该参数不仅在本模块中实用,在其他模块中还可以调用该参数。而局部参数类型就只在当前模块中有效。

1.6、Verilog的运算符

        Verilog HDL语言的运算符范围很广,运算符按其功能可分为:①算术运算符、②关系运算符、③逻辑运算符、④条件运算符、⑤位运算符、⑥移位运算符、⑦拼接运算符。

1.6.1、算术运算符

       Verilog中的算术运算符有:+、-、*、/ 、%

        算术运算符就是我们常说的加减乘除,数字逻辑处理有时候也需要进行数字运算,所以需要算术运算符。在Verilog语法中常用到了算术运算有+、-、*、/和%。值得注意的是,Verilog实现乘法和除法比较浪费逻辑资源,一般能进行移位的我们用移位替代。

1.6.2、关系运算符

        Verilog中的关系运算符有:> 、< 、>= 、<= 、==、!= 

        关系运算符主要是用来做一些条件判断的,在进行关系运算符时,如果声明的关系是假的,则返回值0,如果声明的关系是真的,则返回值1;所有关系运算符都有着相同的优先级。

1.6.3、逻辑运算符

        Verilog中的逻辑运算符有: ! 、&& 、 || 

        逻辑运算符是连接多个关系表达式用的,可实现更加复杂的判断,一般不单独使用,都需要配合具体语句来实现完整的意思。

1.6.4、条件运算符

        Verilog中的条件运算符有: ?:

        条件运算符一般用来构建从两个输入中选择一个作为输出的条件选择结构,功能与always中的if - else语句差不多。

1.6.5、位运算符

        Verilog中的位运算符有:~、&、|、^

        位运算符是一类基本的运算符,可以把他们当成与、或、非逻辑门看待。

1.6.6、移位运算符

        Verilog中的移位运算符有:<< 、>>

        移位运算符包括左移运算符和右移运算符,左移运算符相当于乘法,右移运算符相当于除法。如果a = 8‘b00000011,将其左移两位得a = 8'b00001100。

1.6.7、拼接运算符

        Verilog中的位拼接运算符有:{}

        这是C语言中所不具备的运算符,假设有两个4bit的数a = 4'b0011 和 b = 4'b1100,则将其进行位拼接为{a,b} = 8'b00111100。

在Verilog语法中,运算符也是有优先级的,下面是verilog中的运算符优先级表格:

【Verilog】二、Verilog基础语法

二、Verilog程序设计

2.1、Verilog程序框架搭建

         在经过上面是基本知识点的介绍之后,我们对Verilog语法也有了一定的了解。那么我们利用Verilog进行程序设计的话也是有一定的框架的,有了这个框架,可以极大地提高我们的代码可读性和可移植性,对别人学习你的代码也是非常友好的。但这样的框架结构并不是唯一的,下面是我常用的程序框架。

【Verilog】二、Verilog基础语法

        我个人是习惯用这样的框架来编写程序的,首先是输入输出定义,然后是需要用到的参数,后续需要修改参数的话也是很方便的,接下来就是状态机参数定义(如果需要用到状态机),然后是需要用到的中间信号定义。接下来就是程序的主体部分了,主体部分也是先写状态机,然后写满足状态机的条件(计数器以及其他条件),最后写输出。

2.2、Verilog程序注释

        作为一个程序设计者,必要的程序注释还是要有的,注释不仅仅是为了给别人看,而是让自己一眼明了该程序的功能,如果你长时间没有去接触这个程序,那么有可能这个程序所实现的功能你也会忘记,就算你自己会弄明白,但也要花费一定的时间,但如果我们对程序写一些中文或者英文注释,那么我们一眼就能看出这个程序是干什么的了。

        在Verilog语言中,程序的注释可分为单行注释和多行注释,如果是对单行注释,那么只需要注释符号 // 后的全都是注释的内容;如果是多行注释,就像上面框架那样,那么注释符号 /*     */内的是注释内容。

2.3、Verilog关键字

        Verilog语言和C语言一样,都因编写需要定义一些关键字,这些关键字是识别语法的关键。所以我们在对模块或者信号进行命名时不要与所保留的关键字一样。下面是Verilog语法中所有的关键字。

【Verilog】二、Verilog基础语法

         看到这么多关键字,是不是人都傻了!但是别慌,虽然有这么多关键字,但是我们刚开始实际用到的并不多,等你全部都能用上的时候,你已经是这个领域的大佬级人物了。下面我就来盘点一些我们经常用到的关键词,其实没几个。

        1、module(模块开始定义),2、endmodule(模块结束定义),3、input (输入端口定义),4、output(输出端口定义),5、inout(双向端口定义),6、parameter(参数定义),7、wire(wire型信号定义),8、reg(reg型信号定义),9、always (产生reg信号语句关键字),10、assign(产生wire信号语句关键字),11、begin....end (相当于括号),12、posedge/negedge(时序电路标志),13、case(Case语句开始标志),14,endcase(Case语句结尾标志),15、default(Case语句默认分支标志),16、if ....else(if/else语句),17、for(for语句标志)。

        注意保留关键字全部都是小写哦!!!!!


总结

        这篇文章总结了一些Verilog语法中最基础的一些东西,也对Verilog程序设计框架做了简单的介绍,总体来说还是比较简单的。如果大家需要用到其他的关键字,还是得去看一看Verilog语法相关的书籍,书上讲的肯定要详细一点的,我这里只是简单总结一下。文章来源地址https://www.toymoban.com/news/detail-407129.html

到了这里,关于【Verilog】二、Verilog基础语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 深入浅出学Verilog--基础语法

    深入浅出学Verilog--基础语法

            Verilog的语法和C语言非常类似,相对来说还是非常好学的。和C语言一样,Verilog语句也是由一连串的令牌(Token)组成。1个令牌必须由1个或1个以上的字符(character)组成,令牌可以是: 注释(Comment) 空白符(White space) 运算符(Operator) 数字(Number) 字符串(

    2024年02月09日
    浏览(16)
  • 【FPGA Verilog开发实战指南】初识Verilog HDL-基础语法

    【FPGA Verilog开发实战指南】初识Verilog HDL-基础语法

    就是用代码来描述硬件结构 语言有VHDL与Verilog HDL Verilog HDL 是从C语言来的,学的快 ###例子 也叫保留字,一般是小写 module 表示模块的开始 endmodule 模块的结束 模块名 一般与.v文件的名字一致 输入信号 input 输出信号 output 既做输入也做输出 inout 需要一些变量和参数对输

    2024年02月21日
    浏览(13)
  • Verilog基础语法(13)之case语句

    Verilog基础语法(13)之case语句

    case语句检查给定的表达式是否与列表中的其他表达式之一相匹配,并据此进行分支。它通常用于实现一个多路复用器。 如果要检查的条件很多,if-else结构可能不合适,因为它会综合成一个优先编码器而不是多路复用器。 一个Verilog case语句以case开始,以endcase结

    2024年02月14日
    浏览(8)
  • Verilog基础语法(7)之generate块

    verilog中的generate块可以称为生成块,所谓生成,可以理解为复制。如果不太好理解,下面我们继续使用generate块。 generate块应用的场合通常是对模块进行批量例化,或者有条件的例化,使用参数进行控制对哪些模块进行例化,或者例化多少。 不仅限于模块例化,当同一个操作

    2024年02月13日
    浏览(10)
  • Verilog基础语法(6)之initial块

    Verilog基础语法(6)之initial块

    initial块可以理解为一个初始化块,在initial的起始位置的语句在0时刻即开始执行,之后如果遇到延时,则延时之后执行接下来的语句。其语法如下: 如果initial中有多条语句,则置于begin …end之间。 初始块是不可综合的,因此不能将其转化为带有数字元素的硬件原理图。因此

    2024年02月04日
    浏览(7)
  • ASIC-WORLD Verilog(5)基础语法下篇

    ASIC-WORLD Verilog(5)基础语法下篇

            在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:http://asic-world.com/verilog/veritut.html       

    2023年04月17日
    浏览(9)
  • ASIC-WORLD Verilog(4)基础语法上篇

            在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:http://asic-world.com/verilog/veritut.html         这

    2023年04月10日
    浏览(10)
  • verilog基础语法,wire,reg,input,output,inout

    概述: 输入输出是模块的端口,寄存器是数据存储介质,线用于把各个电路关联起来,形成一个数据流通通道,进行形成具有具体功能的电路模块。线是信息关联与传递的介质,也是可以称为信息流通的管道。在FPGA中的基本定义为wire,reg,input,output,inout。只有正确的认识到

    2024年04月24日
    浏览(11)
  • FPGA_学习_04_Verilog基础语法和Modelsem仿真

    FPGA_学习_04_Verilog基础语法和Modelsem仿真

    前言:对于以前学过C/C++/C#的作者来讲,Verilog的基础语法算是 特别简单 的。本文主要介绍Verilog的基础语法和Modelsem仿真。 FPGA开发是以模块为基础的,每个可 综合 的.v文件都是一个模块,模块由 module 和 endmodule 来声明。在这两个的内部,完成模块功能的实现。 在Vi

    2024年02月05日
    浏览(5)
  • Verilog基础语法(4)之模块和端口及其例化和处理

    Verilog基础语法(4)之模块和端口及其例化和处理

    Verilog进行FPGA/IC设计值,通常划分为各个子模块,木模块之间可能相互例化,并在顶层统一例化,并连接成一个顶层模块文件。 基本的模块模板: 如果模块内的变量位宽参数化,则模块模板为: 例化带参数的模块: 端口类型/端口描述 input 设计模块只能使用其input端口从外部

    2024年02月13日
    浏览(9)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包