verilog-5操作符教学讲解课件_第1页
verilog-5操作符教学讲解课件_第2页
verilog-5操作符教学讲解课件_第3页
verilog-5操作符教学讲解课件_第4页
verilog-5操作符教学讲解课件_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

复习常数:整数和实数

《位数》`《基数》《值》标识符:模块名、端口名及实例名必须以英语字母(a-z,A-Z)起头,或者用下横线符(_)起头。其中可以包含数字、$符和下横线符。逻辑值:0、1、x和z数据类型:Nets

表示器件之间的物理连接,用assign连续赋值语句,zRegister通过过程赋值语句驱动,x标量与矢量第五讲Verilog运算符算术运算符按位运算符逻辑运算符缩减运算符移位运算符关系运算符等式运算符条件运算符运算符类型运算符优先级注意“与”操作符的优先级总是比相同类型的“或”操作符高。操作符类型符号连接及复制操作符一元操作符算术操作符逻辑移位操作符 关系操作符相等操作符按位操作符逻辑操作符条件操作符{}{{}}!~/%+-<<>>><>=<======!=!==&^~^|&&||?:最高最低优先级运算符的分类单目运算符只有一个操作数,且运算符位于操作数的左边双目运算符有两个操作数,各位于运算符的两边三目运算符属于这一类的只有条件运算符(?:)一个Verilog中的大小(size)与符号Verilog根据表达式中变量的长度对表达式的值自动地进行调整。Verilog自动截断或扩展赋值语句中右边的值以适应左边变量的长度。当一个负数赋值给无符号变量如reg时,Verilog自动完成二进制补码计算.modulesign_size;reg[3:0]a,b;reg[15:0]c;initialbegina=-1;//a是无符号数,因此其值为1111b=8;c=8;//b=c=1000#10b=b+a;//结果10111截断,b=0111#10c=c+a;//c=10111endendmodule说明Reg型数据的缺省初始值是不定值,Reg型数据可以赋正值,也可以赋负值。但当一个表达式中的操作数是Reg型数据时,他的值被当作无符号值,即正值。算术运算符注意:将负数赋值给reg或其它无符号变量使用2的补码算术。如果操作数的某一位是x或z,则结果为x在整数除法中,余数舍弃模运算中使用第一个操作数的符号用算术运算符进行RTL描述时,最终生成的电路性能与使用的综合工具有关。有些工具不支持乘法、除法及求模电路1.算术操作结果的长度算术表达式结果的长度由最长的操作数决定。在赋值语句下,算术操作结果的长度由操作符左端目标长度决定。考虑如下实例:reg[0:3]Arc,Bar,Crt;reg[0:5]Frx;...Arc=Bar+Crt;Frx=Bar+Crt;第一个加的结果长度Arc长度决定,长度为4位。第二个加法操作的长度同样由Frx的长度决定(Frx、Bat和Crt中的最长),长度为6位。在第一个赋值中,加法操作的溢出部分被丢弃;而在第二个赋值中,任何溢出的位存储在结果位Frx[1]中。在较大的表达式中,中间结果的长度如何确定?在VerilogHDL中定义了如下规则:表达式中的所有中间结果应取最大操作数的长度(赋值时,此规则也包括左端目标)。实例:wire[4:1]Box,Drt;wire[1:5]Cfg;wire[1:6]Peg;wire[1:8]Adt;...assignAdt=(Box+Cfg)+(Drt+Peg);表达式右端的操作数最长为6,但是将左端包含在内时,最大长度为8。所以所有的加操作使用8位进行。例如:Box和Cfg相加的结果长度为8位。2.无符号数和有符号数执行算术操作和赋值时,注意哪些操作数为无符号数、哪些操作数为有符号数非常重要。无符号数存储在:•线网•一般寄存器•基数格式表示形式的整数有符号数存储在:•整数寄存器•十进制形式的整数下面是一些赋值语句的实例:reg[0:5]Bar;integerTab;...Bar=-4'd12;//寄存器变量Bar的十进制数为52,向量值为110100。Tab=-4'd12;//整数Tab的十进制数为-12,位形式为110100。-4‘d12/4//基数格式的为无符号数,结果是-1。-12/4//结果是-3因为Bar是普通寄存器类型变量,只存储无符号数。右端表达式的值为'b110100(12的二进制补码)。因此在赋值后,Bar存储十进制值52。在第二个赋值中,右端表达式相同,值为'b110100,但此时被赋值为存储有符号数的整数寄存器。Tab存储十进制值-12(位向量为110100)。注意在两种情况下,位向量存储内容都相同;但是在第一种情况下,向量被解释为无符号数,而在第二种情况下,向量被解释为有符号数。例modulearithops();parameterfive=5;integerans,int;reg[3:0]rega,regb;reg[3:0]num;initialbeginrega=3;regb=4'b1010;int=-3;//int=1111……1111_1101end

注意integer和reg类型在算术运算时的差别。integer是有符号数,而reg是无符号数。initialfork#10ans=five*int;//ans=-15#20ans=(int+5)/2;//ans=1#30ans=five/int;//ans=-1#40num=rega+regb;//num=1101#50num=rega+1;//num=0100#60num=int;//num=1101#70num=regb%rega;//num=1#80$finish;joinendmodule按位操作符名称记号定义说明或例子位运算符~按位取反~A=5’b00110&按位与A&B=5’b10001|按位或A|B=5’b11101^按位异或A^B=5’b01100^~,~^按位同或A~^B=5’b10011A=5’b11001;B=5’b10001位运算符可直接用来逻辑门硬件建模,但要注意对于矢量是按照位生成逻辑门的,多用于编码/解码器硬件建模modulebitwise();reg[3:0]rega,regb,regc;reg[3:0]num;initialbeginrega=4'b1001;regb=4'b1010;regc=4'b11x0;endinitialfork#1num=~rega;//num=0110#10num=rega&0;//num=0000#20num=rega®b;//num=1000#30num=rega|regb;//num=1011#40num=regb®c;//num=10x0

#50num=regb|regc;//num=1110#60$finish;joinendmodule

按位操作符对矢量中相对应位运算。regb=4'b1010regc=4'b1x10num=regb®c=1010;位值为x时不一定产生x结果。如#50时的or计算。当两个操作数位数不同时,位数少的操作数零扩展到相同位数。a=4'b1011;b=8'b01010011;c=a|b;//a零扩展为8'b00001011逻辑运算符逻辑运算符&&逻辑与A和B的与为A&&B;||逻辑或A和B的或为A//B;!逻辑非A的非为!A;a=4`b1001;b=4`b0000a=1;b=0!a!ba||ba&&b0110!a!ba||ba&&b0110这些操作符在逻辑值0或1上操作。逻辑操作的结构果为0或1。对于向量操作,非0向量作为1处理。多用于优先级电路的硬件建模modulelogical();parameterfive=5;regans;reg[3:0]rega,regb,regc;initialbeginrega=4‘b0011; //逻辑值为“1”regb=4‘b10xz;//逻辑值为“1”regc=4‘b0z0x;//逻辑值为“x”endinitialfork#10ans=rega&&0;//ans=0#20ans=rega||0;//ans=1#30ans=rega&&five;//ans=1#40ans=regb&®a;//ans=1#50ans=regc||0;//ans=x#60$finish;joinendmodule

逻辑运算符的结果为一位1,0或x。逻辑运算符只对逻辑值运算。如操作数为全0,则其逻辑值为false如操作数有一位为1,则其逻辑值为true若操作数只包含0、x、z,则逻辑值为x逻辑反操作运算符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,逻辑反操作值为1。逻辑反与位反的对比modulenegation();reg[3:0]rega,regb;reg[3:0]bit;reglog;initialbeginrega=4'b1011;regb=4'b0000;endinitialfork#10bit=~rega;//num=0100#20bit=~regb;//num=1111#30log=!rega;//num=0#40log=!regb;//num=1#50$finish;joinendmodule!logicalnot逻辑反~bit-wisenot位反

逻辑反的结果为一位1,0或x。位反的结果与操作数的位数相同逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,逻辑反操作值为1。缩减运算符(归约运算符)归约运算符在单一操作数的所有位上操作,并产生1位结果。归约运算符有:•&(归约与)如果存在位值为0,那么结果为0;若如果存在位值为x或z,结果为x;否则结果为1。•~&(归约与非)与归约运算符&相反。•|(归约或)如果存在位值为1,那么结果为1;如果存在位x或z,结果为x;否则结果为0。•~|(归约或非)与归约运算符|相反。•^(归约异或)如果存在位值为x或z,那么结果为x;否则如果操作数中有偶数个1,结果为0;否则结果为1。•~^(归约异或非)与归约运算符^正好相反。名称记号定义缩减运算符&与~&与非|或~|或非^异或^~,~^同或wirec;

wire[7:0]a;

assignc=~|a;//8bitinputnorassignc=~(a[7]|a[6]|a[5]|a[4]|a[3]|a[2]|a[1]|a[0]);

缩减运算是对单个操作数进行或与非递推运算,最后的运算结果是一位的二进制数。缩减运算的具体运算过程:第一步先将操作数的第一位与第二位进行或与非运算,第二步将运算结果与第三位进行或与非运算,依次类推,直至最后一位。缩减运算符assignall_one=cnt[3]&cnt[2]&cnt[1]&cnt[0];

assignall_parity=cnt[3]^cnt[2]^cnt[1]^cnt[0];assignall_one=&cnt;assignall_parity=

^cnt;缩减运算符例modulereduction();regval;reg[3:0]rega,regb;initialbeginrega=4'b0100;regb=4'b1111;endinitialfork#10val=&

rega;//val=0#20val=|rega;//val=1#30val=®b;//val=1#40val=|regb;//val=1#50val=^rega;//val=1#60val=^regb;//val=0#70val=~|rega;//(nor)val=0#80val=~®a;//(nand)val=1#90val=^rega&&®b;//val=1$finish;joinendmodule注意:缩减运算符的操作数只有一个。对操作数的所有位进行位操作。结果只有一位,可以是0,1,X。wire[7:0]in,out;

wire[2:0]sft;

assignout=in<<sft;低位变零输出wire[7:0]a,b;

assigna=b>>4;assigna[7:4]=4'b0000;

assigna[3:0]=b[7:4];

移位运算符<<(左移位运算符)和>>(右移位运算符都用0来填补移出的空位。多用于移位寄存器硬件建模,特别对于位宽不定的移位寄存器建模移位运算符moduleshift();reg[9:0]num,num1;reg[7:0]rega,regb;initialrega=8'b00001100;initialfork

#10num<=rega<<5;//num=01_1000_0000#10regb<=rega<<5;//regb=1000_0000#20num<=rega>>3;//num=00_0000_0001#20regb<=rega>>3;//regb=0000_0001#30num<=10'b11_1111_0000;

#40rega<=num<<2;//rega=1100_0000#40num1<=num<<2;//num1=11_1100_0000

#50rega<=num>>2;//rega=1111_1100#50num1<=num>>2;//num1=00_1111_1100#60$finish;joinendmodule>> 逻辑右移<< 逻辑左移在赋值语句中,如果右边(RHS)的结果:位宽大于左边,则把最高位截去位宽小于左边,则零扩展<<将左边的操作数左移右边操作数指定的位数>>将左边的操作数右移右边操作数指定的位数●第二个操作数(移位位数)是无符号数●若第二个操作数是x或z则结果为x左移先补后移右移先移后补建议:表达式左右位数一致关系运算符modulerelationals();reg[3:0]rega,regb,regc;regval;initialbeginrega=4'b0011;regb=4'b1010;regc=4'b0x10;endinitialfork

#10val=regc>rega;//val=x#20val=regb<rega;//val=0#30val=regb>=rega;//val=1

#40val=regb>regc;//val=1#50$finish;joinendmodule>

大于< 小于>= 大于等于<= 小于等于其结果是1’b1、1’b0或1’bx。在进行关系运算时,如果声明的关系是假的(flase),则返回值是0,如果声明的关系是真的(true),则返回值是1,如果某个操作数的值不定,则关系是模糊的,返回值是不定值。无论x为何值,regb>regcrega和regc的关系取决于x可直接对比较器硬件建模,也可用于生成优先级电路名称记号定义用途注释等式运算符==等于电路功能描述等于!=不等于电路功能描述不等于===全等于仿真X,Z也作为比较对象!===不全等于仿真==01XZ010XX101XXXXXXXZXXXX===01XZ0100010100X0010Z0001等于全等于等式运算符===和!==不能综合;多用于编解码硬件电路建模等式运算符

赋值运算符,将等式右边表达式的值拷贝到左边。注意逻辑等与case等的差别=2‘b1x==2’b0x值为0,因为不相等2‘b1x==2’b1x值为x,因为可能不相等,也可能相等2‘b1x===2’b0x值为0,因为不相同2‘b1x===2’b1x值为1,因为相同a=2'b1x;b=2'b1x;if(a==b)$display("aisequaltob");else$display("aisnotequaltob");a=2'b1x;b=2'b1x;if(a===b)$display("aisidenticaltob");else$display("aisnotidenticaltob");Case等只能用于行为描述,不能用于RTL描述。相等算符逐位比较二个操作数相应位的值是否相等,只有当每一位都相等时,相等关系才满足。如果任何一个操作数中的某一位存在不定态或高阻态,则将得到一个不定态的结果。全等算符将不定态或高阻态看作是逻辑状态的一种而参与比较。相等运算符

逻辑等逻辑不等==!=moduleequalities1();reg[3:0]rega,regb,regc;regval;initialbeginrega=4'b0011;regb=4'b1010;regc=4'b1x10;endinitialfork#10val=rega==regb;//val=0#20val=rega!=regc;//val=1#30val=regb!=regc;//val=x#40val=regc==regc;//val=x#50$finish;joinendmodule

其结果是1’b1、1’b0或1’bx。如果左边及右边为确定值并且相等,则结果为1。如果左边及右边为确定值并且不相等,则结果为0。如果左边及右边有值不能确定的位,但值确定的位相等,则结果为x。!=的结果与==相反值确定是指所有的位为0或1。不确定值是有值为x或z的位。相等运算符相同(case等)不相同(case不等)===!==moduleequalities2();reg[3:0]rega,regb,regc;regval;initialbeginrega=4'b0011;regb=4'b1010;regc=4'b1x10;endinitialfork#10val=rega===regb;//val=0#20val=rega!==regc;//val=1#30val=regb===regc;//val=0#40val=regc===regc;//val=1#50$finish;joinendmodule

其结果是1’b1、1’b0或1’bx。如果左边及右边的值相同(包括x、z),则结果为1。如果左边及右边的值不相同,则结果为0。!==的结果与===相反综合工具不支持条件运算符条件?:modulelikebufif(in,en,out);inputin;inputen;outputout;assignout=(en==1)?in:'bz;endmodulemodulelike4to1(a,b,c,d,sel,out);inputa,b,c,d;input[1:0]sel;outputout;assignout=sel==2'b00?a:sel==2'b01?b:sel==2'b10?c:d;endmodule如果条件值为x或z,则结果可能为x或z多用于多路选择器硬件建模条件操作符条件操作符的语法为:<LHS>=<condition>?<true_expression>:<false_expression>其意思是:ifconditionisTRUE,thenLHS=true_expression,elseLHS=false_expression每个条件操作符必须有三个参数,缺少任何一个都会产生错误。最后一个操作数作为缺省值。上式中,若condition为真则register等于true_value;若condition为假则register等于false_value。一个很有意思的地方是,如果条件值不确定,且true_value和false_value不相等,则输出不确定值。例如:assignout=(sel==0)?a:b;若sel为0则out=a;若sel为1则out=b。如果sel为x或z,若a=b=0,则out=0;若a≠b,则out值不确定。位拼接运算符位拼接运算符{}。用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。其使用方法如下:{信号1的某几位,信号2的某几位,..,..,信号n的某几位}{a,b[3:0],w,3’b101}也可以写成为{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}在位拼接表达式中不允许存在没有指明位数的信号。拼接还可以用重复法来简化表达式。{4{w}}//这等同于{w,w,w,w}位拼接还可以用嵌套的方式来表达。{b,{3{a,b}}}//这等同于{b,a,b,a,b,a,b}用于表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论