Verilog中的一些语法和技巧x

更新时间:2022-09-28 13:41:16 阅读: 评论:0

1
1、
2、黑金版的1PGA型号:CYCLONE11LP2C8Q208CS
3、Reg型的数据类型默认初始值为X。reg型数据可以赋正值也可以赋负值,但是当一个reg型数据是一个表达式的操作数的时候,他的值被当做无符号数及正值。
4、在数据类型中?和Z均表示高阻态。
5、Reg型只表示被定义的信号将用在“always"模块内,并不是说reg型一定是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出但是并不一定总是这样。
6、Verilog语言中没有多维数组的存在。Memory型数据类型是通过扩展reg型数据的弟子和范围来生成的。其格式如下reg[n-1:0]存储器名[m-1:0];
7、在除法和取余的运算中结果的符号和第一个操作数的符号位是相同的。
8、不同长度的数据进行运算:两个长度不同的数据进行位运算时,系统会自动地将两者按有端对齐,位数少的操作数会在相应的高位用0填满以便连个操作数安慰进行操作。
9、==二与!二二二和二二与!二二的区别:后者称为逻辑等是运算符,其结果是2个操作数的值决定的。由于操作书中某些位可能不定值x和高阻态z结果可能是不定值X。而二二二和!二=二运算符对操作数的比较时对某些位的高阻态z和不定值x也进行比较,两个操作数必须完全一致,其结果才是1,否则是0.
10、非阻塞和阻塞赋值方式:非阻塞赋值方式(如a<=b)上面语句所赋得变
量值不能立即被下面语句所用,(2)快结束后才能完成这次赋值操作3在编写克综合的时序逻辑模块时这是最常用的赋值方法。阻塞赋值(如a=b)
赋值语句执行完后,块才结束2b的值在赋值语句完成后立即执行3在时序逻辑使用中,可能产生意想不到的结果。
11、模块的描述方式:(RTL为寄存器传输级描述)
“(1)数据流描述方式:数据流行描述主要用来描述组合功能,具体用
“assign"连续赋值语句来实现。分为两种a、显式连续赋值语句;
2
连线型变量类型[连线型变量为快]连线型变量名
Assign#(延时量)连线型变量名=赋值表达式;显式连续赋值语句包含了两条语句;第一条是对连线型变量的进行类型说明的说明语句;第二句是对这个已得到声明的连线型变量进行连续赋值语句。影视赋值语句:连线型变量类型(复制驱动强度)[连线型变量位宽]#(延时量)连线性变量名=赋值表达式。隐式连续赋值语句是把连线性变量说明语句和连线性变量连续赋值语句结合在一条语句中。他可以对连线型变量进行说明的同时进行连续赋值。
Assign连续赋值语句的功能是:当赋值表达式中的变量的只发生变化时,重新计算赋值表达式的值,并在指定的时延后将得到的结果赋给左端的连线性变量。
Assign只能实现组合功能。而reg型数据可以可以存储过程赋值的最终结果。端口默认为连线性的不用定义一般,只要输入发生变化输出马上发生变化。
(2)行为描述方式:
A、initial语句:此语句只执行一次。
B、always语句:次语句循环执行。
只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持所有值不变。以上两种语句在0时刻并发执行。
(3)、结构描述方式
结构描述是通过实例进行描述的方法,他将verilog中预定义的基本元件实例嵌入到语言中,监控实力的舒服,一旦其中任何一个发生变化,便重新运算并输出。
在verilogHDL中可以使用如下结构描述部件:
A、用户自己定义的模块b、用用户自定义元件UDPc、内置门级元件d、内置开关级元件
(4)混合型描述
11、连续赋值语句与过程赋值语句的区别:
我觉得这个在刚开始学****verilog时,是会有一些疑问的!
a、从语法上来看,连续赋值语句由“assign”关键词来表示,而过程赋值语句中则不包含
b、连续赋值语句中左侧的被赋值数据类型必须是线网型数据,而过程赋值语句
3
中的被赋值数据类型则必须是寄存器类型的变量
c、连续赋值语句不能出现在过程快(initial过程快或者always过程块)中,而过程赋值语句则只能出现在过程快中
d、连续复制语句主要用来对组合逻辑电路进行建模以及对线网型数据间的连接进行描述,而过程赋值语句主要用来对时序逻辑电路进行行为描述
e、连续赋值语句对被赋值线网型数据的赋值是“连续的”(即连续复制语句产生作用后,赋值表达式中的信号的任何变换都将立即反映到被赋值线网型数据的取值上,这也是我们有时会使用“连续驱动”这个术语的原因),而在过程赋值语句情况下,只有在过程赋值语句被执行时才执行赋值操作,语句执行完后被赋值变量的取值不再受到赋值表达式的影响.
12、间隔符和注释符:verilogHDL中的间隔符包括空格(\b)、tab(\t)、换行符(\n)以及换页符。
注释符有2种://和/*.*/后为多行注释符用于对多行语句注释;前者
为单行注释符,只对注释符所在的行有效。
13、数值:下划线除了不可以放于数值的首位意外,可以随意用在整型数和实型数之间,他们对数值的大小没有任何的影响,只是为了提高可读性。
在verilog中有二进制(b或者B)、十进制(d或者D)、八进制(o或者O)、十六进制(h或者H)
格式:<size>'<ba-format><number><size>用于指定所表示数的位宽,在数值的表示中式可以缺省的.位宽小于数值的实际位数时,相应的高位部分被忽略;当位宽大于实际的位数,且数值的最高位是0或者1时,相应的高位补零;当位宽高于数值的实际位数,但数值的最高位是x或者z时相应的高位部分补x或者z。二进制中的x或者z表示一位处于x或者z,八进制的表示三位,十六进制的表示4位。
14、实型数及其表示方法
VerilogHDL中的实数可以用十进制与科学计数法两种格式来表示,如果采用十进制数格式,小数点两边必须有数字,否则为非法字符。
4
如3.8E102.1e-9;
15、字符串字符串是用双引号括起来的字符序列,他必须包含在同一行中,不能分成多行书写。如字符串用作verilogHDL表达式或赋值语句中的操作数,则字符串被看做8位的ASCII值序列,即一个对应8位的ASCII码。
在verilog中采用寄存器变量来存储字符串,寄存器变量的位数要大于字符串的最大长度。需要注意的是,verilogHDL中并不需要特殊位来存储终止符。可以采用标准操作符对字符串进行诸如连接类的操作。在操作过程中字符串变量位数大于字符串的实际长度,则字符串变量的高位补零。
Reg[8*12:1]stringvar
Initial
Beginstring=“hellowoeld!”;
End
特殊字符:\n换行符\ttab键\\符号\
\*符号*\ddd三位八进制数表示的ASCII值%%符号%
16、数据类型
(1)、物理数据类型:分为连线性和寄存器型变量可以取0、1、x、z,中的
认可一个。X表示一个位置初始状态的变量,或者由于多个驱动源试图将其设定为不同的值而引起的冲突性连线性变量,z表示高祖状态或浮空量。物理类型数据分为连线型和寄存器型亮中连线型数据对应的是硬件电路的物理信号连线,没有电荷的保持作用(trireg除外)。连线型数据必须有去动员驱动,有两种方式对他进行驱动:一种是结构描述中把它连接到一个们或者模块的输出端;二是用连续赋值语句assign对其进行复制。当没有驱动源对其驱动时,他将保持高阻态
连线型数据
功能描述
Wire,tri
两种常见类型
Wor,trior
多重驱动时,具有线或特性的连线型
Wand,triand
多重驱动时,具有线与特性的连线型
Tri1
上拉电阻
Tri0
下拉电阻
Supp.lyl
电源线,逻辑1
5
Supply。
电源线,逻辑0
VerilogHDL中的连线型数据及其功能描述寄存器数据对应的是具有保持作用的硬件电路与元件,如触发器、锁存器等。如reg没初始化则将为x缺省为一位。
两种数据的区别:寄存器型数据保持最后一次的赋值,而连线型数据需要有持续的驱动。寄存器数据的驱动刻意通过过程赋值语句实现,过程赋值语句只能出现在过程语句后面的过程块语句中。
存储区:verilog中采用寄存器数组来表示存储器,用来对R0M,RAM或寄存器文件进行建模。数组中的每一个寄存器均称为一个元素,用不同的索引来寻址。Reg[16:1]mem[5:1]申明16位5字的存储器与寄存器。
(2)、抽象数据类项
有整型integer时间型time实型real参数性parameter
17、运算符
算术运算符:包括+-*/%是二元运算符。如果操作数为寄存器或者连线型则为无符号数;如果为整型或者实型,则刻意是有符号数。当用基数格式表示整数时,一定是无符号数;两个操作数中的一个为x则记过为X。
18、按位运算符和逻辑运算符:!是逻辑非而~是按位操作的非即按位取反。例如:对于
!(3==2)的结果是1;而后者对为进行操作~(0、0、1、0)=1101;
19、归约运算符:归约运算是对单个的操作数进行归约的递推运算,最后的结果是一位的二进制数。具体过程:先讲操作数的第一位和第二位进行归约运算,然后将运算结果与第三位进行归约运算,以此类推,直到最后一位。格式(&b)
19、移位运算?!不会
20、条件运算符:verilogHDL中只有唯一的一种三目运算符,及条件运算符有三个操作数。如第一个操作数为逻辑1,则算子返回第二个操作数;如第一个操作数为逻辑0,则返回第三个操作数;如第一个操作数为高阻态或未知态则按下表给出的逻辑,将第二个和第三个操作数按位比较得到结果。
6
21、连接和复制:连接运算是将多个小的表达式合并成一个大的表达式。VerilogHDL中用符号{,,}实现多个表达式的链接运算,各个表达式之间用“,”隔开。
复制运算符{{}}将一个表达式放入双重花括号内,而复制因子放在第一个括号内,用来指定复制的次数。
运算符
描述
[]
为选择或部分选择
()
圆括号
~!
逻辑非或按位非
I、、I小、ZXZX、
&|&1
归约运算符
+—
单目算术运算符
{}
链接运算符
*/%
算术运算符
+—
双目运算符
<<>>
以为运算符
>>=V>=
关系运算符
二二!=
相等运算符
&
按位与
zxzxr\jr\jzx
•••
按位异或或异或非
|
按位或
&&
逻辑与
||
逻辑或
:
条件表达式
8
二、模块的基本结构
1、行为描述的结构:
Module<模块名〉(〈端□列表〉)
模块端口说明
参数定义(可选)
数据类型说明
过程快(initial过程块或always快,可有一个或多个)
连续赋值语句
任务定义(tast)(可选)
函数定义(function)(可选)
其中:数据类型说明用来对模块中用到的各类变量类型进行说明,如果某个变量
没有进行数据类型说明,则他的类型缺省为连线类型(wire)。
上面列出的各个模块组成项可以是任意次序出现,但是端□说明和数据类型说明必须出现在端□和数据被引用之前。
2、(1)在行为描述模块中出现的每个过程块(always过程块或者initial过程块)都代表一个独立的进程。
(2)在进行仿真时,所有的过程块的执行都是从0时刻开始并行的执行。
(3)每一个过程块内部的多条语句的执行方式可以是顺序执行的(当快定义语
句为beginend时的情况),也可以是并行执行的(块定义语句是fork-join
时的情况)。
(4)always和initial过程块都是不能嵌套使用的。
3、initial过程块:
Initial语句块而语句块的格式为:<块定义语句>:<块名>块内局部变量;时间控制1行为语句;
。。。。。。。。
时间控制n行为语句;
<块定义语句2>
其中:块定义语句刻意是“beginend”语句组,或者时“fork,join"语句组。<块名>为可选项,块名可以乘早一个局部作用域。定义块名的过程快成为“有名块”,在有名块下可以定义局部变量,有名块内部语句的执行刻意被
8
disable语句中断。
块内局部变量说明也是可选项,只有在有名块中才能定义局部变量,并且块内局部变量只能是寄存器类数据类型。
行为语句可以是如下语句中的一种:过程赋值语句(阻塞型或非阻塞型过程赋值语句)过程连续赋值语句(assign/deassign或force/relea语句组)if条件分支语句ca条件分支语句循环控制语句(forever、repeat、while、for循环语句)wait等待语句disable终端语句事件触发语句(event——trigger)任务调用语句(用户自定义的任务或系统任务)。
Initial过程块的使用只要是面向功能模拟的,他通常不具有可综合性。Initial过程块通常来描述测试模块的初始化、监视、波形生成等功能行为;而对硬件功能模块的行为描述中,initial过程块常常用来对只需执行一次的过程进行描述,例如刻意用来寄存器的初始化!
4、always过程块:
Always过程块是由“always”过程语句和语句块组成的,他的格式为:
Always@(敏感事件列表)
语句块
其中语句块的格式为:
〈块定义语句1这里一般是begin或者fork>:<块名〉
块内局部变量说明;
时间控制1行为语句1;
。。。。。。
时间控制n行为语句n;
<块定义语句2这里一般是end>
说明:@(敏感事件列表)是可选项,带有敏感事件列表的语句块被称为“由事件控制的语句块”他的执行守敏感事件的控制。敏感事件是有OR连接起来的一个或者多个表达式,只要发生了敏感事件列表所列出的多个事件中的任何一个,就启动后面语句块的执行。敏感事件列表实际上代表了一个事件控制类型的时间控制。
9
他的块内定义语句也分为串行块和并行块。
5、always和initial语句的区别:always语句过程语句后面可以有一个敏感事件列表,该敏感事件列表的作用是来激活always过程块语句的执行,而initial语句后面则不允许有敏感事件列表。如果always的敏感事件列表是缺省的则认为触发条件始终被满足。
6、always过程块的使用只要是对硬件功能模块的行为进行描述,他可以是在测试模块中用来对视中进行描述。利用always过程块可以实现锁存器和触发器他也可以用来实现组合逻辑。
在用always过程块视线组合逻辑时要注意将所有的输入信号都列入敏感事件列表中,而在使用always过程块实现时序逻辑时却不一定要将所有的输入信号都列入敏感事件列表。
7、串行块:begin:〈块名〉
快内局部变量
时间控制1行为语句1;
。。。。。。
时间控制n行为语句n
End
其中:块内局部变量刻意是reg型声明语句、integer型变量声明语句及real型变量声明语句。他的语句是顺序执行的。
8、并行块和串行块的格式是相同的,只是它的关键字是fork-join,而且他的语句是并行执行的。而且并行块和串行块是可以嵌套使用的。
三、行为描述:时间控制和赋值控制
1、时间控制可以用来对过程块中各条语句的执行时间进行控制,时间控制分为两类:
(1)、延时控制:为行为语句的执行指定一个延时时间的控制方式
(2)、事件控制:为行为语句的执行指定触发事件的时间控制方式其中时事件控制方式又可以分为两类:边沿触发事件控制和电平敏感事件控制
2、延时控制格式为:
#<延迟时间>行为语句;
或者
10
#<延迟时间>;
其中:#是延时控制的标识符,“<延迟时间>”是一个直接指定的延迟时间量,他是以多少个仿真时间单位的形式给出的,可以是一个立即数、变量和表达式。
如延迟时间为x或者z那么延迟控制等小于零延迟控制。如果为负值,是以该负值的二进制补码值作为实际的延时量。
3、边沿触发控制分为四种格式:
第一种:@<事件表达式>行为语句;第二种:@<事件表达式>;
第三种:@(〈事件表达式1>or<事件表达式2>。。。or<事件表达式n>)行为语句;第四种:@(〈事件表达式l>or<事件表达式2>。。。or<事件表达式n>);其中事件表达式有三种形式:
<信号名>
Podge<信号名〉
Negedge<信号名>信号名可以是任意数据类型的标量或矢量。
第一种事件表达式形式:代表的触发事件是<信号名>所指定的信号发生了某种逻辑变化(不论是整条便还是负跳变)。它是信号出了保持稳定太意外的任意一种变化过程。
第二种表示正跳变可以是下列中的一种:0——X0——z0——1x——1z——1
第三种表示负跳变可以是写列中的一种:1x1z10x0
Z——0.
4、用always过程块实现组合逻辑功能
(1)事件表达式内不能能包含“podge"和“negedge"关键词,也就是说敏感事件列表中的事件表达式智能是前面所述的第一种现在敏感时间列表中。
5、电平敏感事件控制(wait语句)与边沿触发事件控制不同,在电平敏感事件控制方式下启动语句执行的触发条件是某一个指定的条件为真。有三种形式:
第一种:wait(条件表达式)语句块;
第二种:wait(条件表达式)行为语句;
第三种:wait(条件表达式);
6、过程赋值语句:过程赋值语句是使用于两种结构化过程块(initial和always过程块)中的赋值语句。在过程块中智能使用过程赋值语句(不能在过程块中出现连续赋值语句),同时过程赋值语句也只能用在过程块中。

本文发布于:2022-09-28 13:41:16,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/78/192631.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:语法   技巧   Verilog
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图