草庐IT

Verilog HDL语言总结(全)

朴实妲己 2023-04-19 原文

目录

1 、Verilog HDL基本结构

2 、数据类型

(1)寄存器型

(2)线型

(3)符号常量

(4)寄存器数组

3 、 运算符

(1)算术运算符

(2)逻辑运算符

 (3)按位运算符

(4)关系运算符

(5)等式运算符

(6)移位运算符

(7)条件运算符

(8)拼位运算符

 4 、语句

(1)赋值语句

 (2)结构说明语句(always+initial)

(3)if语句 

 (4)case语句

 (5)循环语句(repeat+forever+while+for)


1 、Verilog HDL基本结构

1. Verilog HDL程序是由模块构成的。每个模块嵌套在module和endmodule声明语句中。

2 每个Verilog HDL源文件中只有一个顶层模块,其他为子模块。可以每个模块写一个文件。

3.每个模块要进行端口定义,并说明输入输出端口,然后对模块的功能进行行为逻辑描述。

4.模块中的时序逻辑部分在always块的内部,在always块中只能对寄存器变量赋值。

5.模块中对端口或其他wire型变量的赋值,必须在always块的外部使用assign语句,通常是将寄存器的值送出

6.程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。

7. 除了endmodule语句、begin_end语句和fork_join语句外,每个语句和数据定义的最后都要加分号

8.可用/*.....*/和//...对程序的任何部分作注释。加上必要的注释,可以增强程序的可读性

2 、数据类型

首先对数的表示方式进行讲解,Verilog只能表示二进制的逻辑值,可以为0,1,高阻,未知

如下图所示, 数在Verilog里面有3种表示

Verilog的数据类型分为 寄存器型(reg) 线型(wire) 符号常量(parameter) 寄存器数组

(1)寄存器型

之所以reg叫做寄存器型,是因为数字电路中的触发器只在时钟有效边沿到来的时候,保存的值才能够发生改变。

reg型信号的定义格式如下:
定义一个n位的寄存器变量 : reg [n-1:0]变量名;
定义m个n位的寄存器变量 : reg [n-1:0]变量名1,变量名2,....变量名m;

下面给出2个例子:
reg [7:0] a, b, c;    //a, b, c都是位宽为8位的寄存器
reg d;   //1位的寄存器d
 

(2)线型

wire型信号的定义格式如下:

定义一个n位的wire变量 : wire [n-1:0]变量名;

定义m个n位的wire变量 : wire [n-1:0]变量名1,变量名2,.变量名m;

下面给出2个例子:

wire [7:0] a, b, c;   // a, b, c都是位宽为8位的wire

wire d;    //d是1位的wire

(3)符号常量

如果用关键词parameter来定义一个标识符,代表一个常量,这个常量就被称为符号常量。

例如: parameter width=3;//符号常量width的值是3,如果未进行重定义,当在程序中出现width时就用3代替。

同样的,可以一次性定义多个符号常量,parameter idle=1,one=2,two=3,stop=4;//定义了4个符号常量。如果未进行重定义,当代码中出现idle就用1代替,出现one就用2代替,出现tow就用3代替,出现stop就用4代替。

但是符号常量可以被重定义,使用#即可

如下图,一开始time_delay=5  time_count=10,重定义之后time_delay=4  time_count=8

 

(4)寄存器数组

存储器实际上是一个寄存器数组。

存储器使用如下方式定义reg [ msb: lsb] memory1 [ upper: lower] 

(upper:lower)代表寄存器个数,(msb是最高有效位,lsb是最低有效位)代表每个寄存器的位数 

例如:

reg[3:0] mymem1[63:0];       //mymem1为64个4位寄存器的数组。

reg dog [1:5];         //dog为5个1位寄存器的数组。

dog[4]= 1;            //合法赋值语句,对其中一个1位寄存器赋值。

dog[1:51]= 0;      //合法赋值语句,对存储器大范围赋值。

3 、 运算符

(1)算术运算符

算术运算符说明
+
-
*
/
%取模(余数)

在进行整数的除法运算时,结果要略去小数部分,只取整数部分;

进行取模运算时( %) 结果的符号位采用模运算符中第一个操作数的符号。例如,-10%3结果-1,11%-3 结果为2。

在进行算术运算时,如果某一个操作数有不确定的值x,则整个结果也为不确定值x。

(2)逻辑运算符

逻辑运算符说明
&&逻辑与
||逻辑或
逻辑非

逻辑运算最常用于条件判断语句。逻辑运算只区分真假,而不管是什么数值。逻辑运算的输入4'ha1和4'h01是没有区别的,都是逻辑真,而0为逻辑假。一般来说,逻辑运算的结果要么为真(1)要么为假(0)

特例是如果有一个输入为未知X,那么结果也是X。

例如,4'ha1&&4h01是1,4'ha1&&4h00是0。

■对于逻辑与或:只有两个输入都是0的时候,逻辑或的结果才是0。
■对于逻辑非:当输入为非0值,输出就是0。

 (3)按位运算符

按位运算符说明
&按位与
|按位或
~按位取反
^按位异或
~^   ^~按位同或

按位运算符是对照数据的每一位进行运算, 例如0101&1100=0100,0101|1100=1101

ps:异或是指如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

同或是指如果a、b两个值不相同,则同或结果为0。如果a、b两个值相同,同或结果为1。

(4)关系运算符

关系运算符说明
<小于
<=小于等于
>大于
>=大于等于

关系运算符和逻辑运算符一般用于条件判断语句。

关系运算结果为1位的逻辑值1(真)或0(假),但也可能是x(未知)。关系运算符根据关系运算的结果是真还是假,用于条件判断。

关系运算时,若关系为真,则返回值为1;若声明的关系为假,则返回值为0;若某操作数为不定值x,则返回值也一定为x。

(5)等式运算符

等式运算符说明
==等于
!=不等于
===全等于
!==全不等于

"=="和"!="称作逻辑等式运算符,其结果由两个操作数的值决定。由于操作数可能是x或z,其结果可能为x。

"==="和"!=="常用于case表达式的判别,又称作case等式运算符。其结果只能为0和1。如果操作数中存在x和z,那么操作数必须完全相同结果才为1,否则为0。

注意"=="和"="是完全不同的,"="是对寄存器赋值使用的。

(6)移位运算符

移位运算符说明
<<左移
>>右移

a>>n中a代表要进行向右移位的操作数,n代表要移几位。a<<n表示将a逻辑左移n位。

这两种移位运算都用0来填补移出的空位。

例如a是一个5位的寄存器,那么a=4'b1001<<1,a的结果就是5'b10010。但是当a是一个4位的寄存器,那么a=4'b1001<<1,a的结果就是4'b0010。

(7)条件运算符

用法: assign wire类型变量=条件?表达式1:表达式2;

如果满足条件,变量=表达式1,否则,变量=表达式2

(8)拼位运算符

使用拼接运算符可以将变量任意组合后输出或送给另一个变量。

用法:{信号1的某几位,信号2的某几位,......信号n的某几位}

{m,-a,b[3:0],w,3'b101}等同于{a,b[3],b[2],b[1],b[0],w,1b'[1],1'b[0],1'b[1]}

{4{w}}等同于{w,w,w,w}

{b{3{a,b}}等同于{b,a,b,a,b,a,b}

 4 、语句

(1)赋值语句

 (2)结构说明语句(always+initial)

 

 ps:

 

(3)if语句 

 

 

 (4)case语句

 

 

 (5)循环语句(repeat+forever+while+for)

 

 

 

 

 

 

 

有关Verilog HDL语言总结(全)的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  5. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  6. ruby - 如何保持我不常用的编程语言技能 - 2

    关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby​​-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby​​有很大不同。由于我与ruby​​之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?

  7. ruby-on-rails - 如果特定语言环境中缺少翻译,如何配置 i18n 以使用 en 语言环境? - 2

    如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback

  8. ruby-on-rails - 如何通过 URL 更改语言环境? - 2

    在我的双语Rails4应用程序中,我有一个像这样的LocalesController:classLocalesController用户可以通过此表单更改其语言环境:deflocale_switcherform_tagurl_for(:controller=>'locales',:action=>'change_locale'),:method=>'get',:id=>'locale_switcher'doselect_tag'set_locale',options_for_select(LANGUAGES,I18n.locale.to_s)end这有效。但是,目前用户无法通过URL更改

  9. ruby - 一种语言如何被自身解释(如 Rubinius)? - 2

    我使用Ruby编程已经有一段时间了,现在只使用Ruby的标准MRI实现,但我一直对我经常听到的其他实现感到好奇。前几天我在读有关Rubinius的文章,这是一个用Ruby编写的Ruby解释器。我试着在不同的地方查找它,但我很难弄清楚这样的东西到底是如何工作的。我在编译器或语言编写方面从来没有太多经验,但我真的很想弄明白。一门语言究竟如何才能被自己解释?编译中是否有一个我不明白这有意义的基本步骤?有人可以像我是个白痴一样向我解释这个吗(因为无论如何这都不会太离谱) 最佳答案 它比你想象的要简单。Rubinius并非100%用Ruby编

  10. ruby-on-rails - ruby 真的是一种完全面向对象的语言吗? - 2

    Ruby是完全面向对象的语言。在ruby​​中,一切都是对象,因此属于某个类。例如5属于Objectclass1.9.3p194:001>5.class=>Fixnum1.9.3p194:002>5.class.superclass=>Integer1.9.3p194:003>5.class.superclass.superclass=>Numeric1.9.3p194:005>5.class.superclass.superclass.superclass=>Object1.9.3p194:006>5.class.superclass.superclass.superclass.su

随机推荐