资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,复习,常数:整数和实数,位数,基数,值,标识符:模块名、端口名及实例名,必须以英语字母(,a-z,A-Z,)起头,或者用下横线符(,_,)起头。其中可以包含数字、,$,符和下横线符。,逻辑值:,0,、,1,、,x,和,z,数据类型:,Nets,表示器件之间的物理连接,用,assign,连续赋值语句,,z,Register,通过过程赋值语句驱动,,x,标量与矢量,第五讲,Verilog,运算符,算术运算符,按位运算符,逻辑运算符,缩减运算符,移位运算符,关系运算符,等式运算符,条件运算符,运算符类型,运算符优先级,注意,“,与,”,操作符的优先级总是比相同类型的,“,或,”,操作符高。,操作符类型,符号,连接及复制操作符,一元操作符,算术操作符,逻辑移位操作符,关系操作符,相等操作符,按位操作符,逻辑操作符,条件操作符,!,/%,+-,=,=!=!=,&,|,&,|,?,:,最高,最低,优先级,运算符的分类,单目运算符,只有一个操作数,且运算符位于操作数的左边,双目运算符,有两个操作数,各位于运算符的两边,三目运算符,属于这一类的只有条件运算符(,?:,)一个,Verilog,中的大小,(size),与符号,Verilog,根据表达式中变量的长度对表达式的值自动地进行调整。,Verilog,自动截断或扩展赋值语句中右边的值以适应左边变量的长度。,当一个负数赋值给无符号变量如,reg,时,,Verilog,自动完成二进制补码计算,.,module,sign_size,;,reg,3:0 a,b;,reg,15:0 c;,initial begin,a=-1;/a,是无符号数,因此其值为,1111,b=8;c=8;/b=c=1000,#10 b=b+a;/,结果,10111,截断,b=0111,#10 c=c+a;/c=10111,end,endmodule,说明,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,位。在第一个赋值中,加法操作,的溢出部分被丢弃;而在第二个赋值中,任何溢出的位存储在,结果位,F r x 1,中。,在较大的表达式中,中间结果的长度如何确定?在,Verilog,HDL,中定义了如下规则:表达式中的所有中间结果应取最大,操作数的长度(赋值时,此规则也包括左端目标)。,实例:,wire,4:1,Box,Drt,;,wire,1:5,Cfg,;,wire,1:6,Peg,;,wire,1:8,Adt,;,.,assign,Adt,=(,Box,+,Cfg,)+(,Drt,+,Peg,);,表达式右端的操作数最长为,6,,但是将左端包含在内时,最,大长度为,8,。所以所有的加操作使用,8,位进行。例如:,B o x,和,C f g,相加的结果长度为,8,位。,2.,无符号数和有符号数,执行算术操作和赋值时,注意哪些操作数为无符号数、哪些操作数为有符号数非常重要。,无符号数存储在:,线网,一般寄存器,基数格式表示形式的整数,有符号数存储在:,整数寄存器,十进制形式的整数,下面是一些赋值语句的实例:,reg,0:5,Bar,;,integer,Tab,;,.,Bar,=-4d12;/,寄存器变量,B a r,的十进制数为,5 2,,向量值为,1 10100,。,Tab,=-4d12;/,整数,Tab,的十进制数为,-12,,位形式为,110100,。,-4d12/4 /,基数格式的为无符号数,,,结果是,-1,。,-12/4 /,结果是,-3,因为,Bar,是普通寄存器类型变量,只存储无符号数。右端表达式,的值为,b 110100,(,12,的二进制补码)。因此在赋值后,,Bar,存储十进制值,52,。在第二个赋值中,右端表达式相同,值为,b 110100,,但此时被赋值为存储有符号数的整数寄存器。,Tab,存储十进制值,12,(位向量为,110100,)。注意在两种情况,下,位向量存储内容都相同;但是在第一种情况下,向量被解释,为无符号数,而在第二种情况下,向量被解释为有符号数。,例,module,arithops,();,parameter five=5;,integer,ans,int,;,reg,3:0,rega,regb,;,reg,3:0 num;,initial begin,rega,=3;,regb,=4b1010;,int,=-3;/,int,=11111111_1101,end,注意,integer,和,reg,类型在算术运算时的差别。,integer,是有符号数,而,reg,是无符号数。,initial fork,#10,ans,=five*,int,;/,ans,=-15,#20,ans,=(,int,+5)/2;/,ans,=1,#30,ans,=five/,int,;/,ans,=-1,#40 num=,rega,+,regb,;/num=1101,#50 num=,rega,+1;/num=0100,#60 num=,int,;/num=1101,#70 num=,regb,%,rega,;/num=1,#80$finish;,join,endmodule,按位操作符,名称,记号,定义,说明或例子,位运算符,按位取反,A=5b00110,&,按位与,A&B=5b10001,|,按位或,A|B=5b11101,按位异或,AB=5b01100,按位同或,AB=5b10011,A=5b11001;B=5b10001,位运算符可直接用来逻辑门硬件建模,但要注意对于矢量是按照位生成逻辑门的,多用于编码,/,解码器硬件建模,module bitwise();,reg,3:0,rega,regb,regc,;,reg,3:0 num;,initial begin,rega,=4b1001;,regb,=4b1010;,regc,=4b11x0;,end,initial fork,#1 num=,rega,;,/num=0110,#10 num=,rega,/num=0000,#20 num=,rega,&,regb,;/num=1000,#30 num=,rega,|,regb,;/num=1011,#40 num=,regb,&,regc,;/num=10 x0,#50 num=,regb,|,regc,;/num=1110,#60$finish;,join,endmodule,按位操作符对矢量中相对应位运算。,regb,=4b1 0 1 0,regc,=4b1 x 1 0,num=,regb,&,regc,=1 0 1 0;,位值为,x,时不一定产生,x,结果。如,#50,时的,or,计算。,当两个操作数位数不同时,位数少的操作数零扩展到相同位数。,a=4b1011;,b=8b01010011;,c=a|b;/a,零扩展为,8b00001011,逻辑运算符,逻辑运算符,&,逻辑与,A,和,B,的与 为,A,|,逻辑或,A,和,B,的或 为,A/B;,!,逻辑非,A,的非 为!,A;,a=4b1001;b=4b0000,a=1;b=0,!a,!b,a,|b,a&b,0,1,1,0,!a,!b,a,|b,a&b,0,1,1,0,这些操作符在逻辑值,0,或,1,上操作。逻辑操作的结构果为,0,或,1,。,对于向量操作,非,0,向量作为,1,处理。,多用于优先级电路的硬件建模,module logical();,parameter five=5;,reg,ans,;,reg,3:0,rega,regb,regc,;,initial,begin,rega,=4b0011;/,逻辑值为“,1,”,regb,=4b10 xz;/,逻辑值为“,1,”,regc,=4b0z0 x;/,逻辑值为“,x,”,end,initial fork,#10,ans,=,rega,/,ans,=0,#20,ans,=,rega,|0;/,ans,=1,#30,ans,=,rega,/,ans,=1,#40,ans,=,regb,&,rega,;/,ans,=1,#50,ans,=,regc,|0;/,ans,=x,#60$finish;,join,endmodule,逻辑运算符的结果为一位,1,,,0,或,x,。,逻辑运算符只对逻辑值运算。,如操作数为全,0,,则其逻辑值为,false,如操作数有一位为,1,,则其逻辑值为,true,若操作数只包含,0,、,x,、,z,,则逻辑值为,x,逻辑反操作运算符将操作数的逻辑值取反。例如,若操作数为全,0,,则其逻辑值为,0,,逻辑反操作值为,1,。,逻辑反与位反的对比,module negation();,reg,3:0,rega,regb,;,reg,3:0 bit;,reg,log;,initial begin,rega,=4b1011;,regb,=4b0000;,end,initial fork,#10 bit=,rega,;/num=0100,#20 bit=,regb,;/num=1111,#30 log=!,rega,;/num=0,#40 log=!,regb,;/num=1,#50$finish;,join,endmodule,!,logical not,逻辑反,bit-wise not,位反,逻辑反的结果为一位,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;wire7:0a;assign c=|a;/8bit input nor,assign c=(a7|a6|a5|a4|a3|a2|a1|a0);,缩减运算是对单个操作数进行或与非递推运算,最后的运算结果是一位的二进制数。,缩减运算的具体运算过程,:,第一步先将操作数的第一位与第二位进行或与非运算,第二步将运算结果与第三位进行或与非运算,依次类推,直至最后一位。,缩减运算符,assign all_one=cnt3,assign all_one=,&,cnt,;,assign all_parity=,cnt,;,缩减运算符,例,module reduction();,reg,val,;,reg,3:0,rega,regb,;,initial begin,rega,=4b0100;,regb,=4b1111;,end,initial fork,#10,val,=,&,rega,;/,val,=0,#20,val,=,|,rega,;/,val,=1,#30,val,=,&,regb,;/,val,=1,#40,val,=,|,regb,;/,val,=1,#50,val,=,rega,;/,val,=1,#60,val,=,regb,;/,val,=0,#70,val,=,|,rega,;/(nor),val,=0,#80,val,=,&,rega,;/(,nand,),val,=1,#90,val,=,rega,&,regb,;/,val,=1,$finish;,join,endmodule,注意:,缩减运算符的操作数只有一个。对操作数的所有位进行位操作。结果只有一位,可以是,0,1,X,。,wire,7:0,in,out;wire,2:0,sft,;assign,out=in 4;,assign a7:4=4b0000;assign a3:0=b7:4;,移位运算符,(,右移位运算符都用,0,来填补移出的空位。,多用于移位寄存器硬件建模,特别对于位宽不定的移位寄存器建模,移位运算符,module shift();,reg,9:0 num,num1;,reg,7:0,rega,regb,;,initial,rega,=8b00001100;,initial fork,#10 num=,rega,5;/num=01_1000_0000,#10,regb,=,rega,5;/,regb,=1000_0000,#20 num 3;/num=00_0000_0001,#20,regb,3;/,regb,=0000_0001,#30 num=10b11_1111_0000;,#40,rega,=num 2;/,rega,=1100_0000,#40 num1=num 2;/,rega,=1111_1100,#50 num1 2;/num1=00_1111_1100,#60$finish;,join,endmodule,逻辑右移,逻辑左移,在赋值语句中,如果右边,(RHS),的结果,:,位宽大于左边,则把最高位截去,位宽小于左边,则零扩展,将左边的操作数右移右边操作数指定的位数,第二个操作数(移位位数)是无符号数,若第二个操作数是,x,或,z,则结果为,x,左移先补后移,右移先移后补,建议:表达式左右位数一致,关系运算符,module,relationals,();,reg,3:0,rega,regb,regc,;,reg,val,;,initial begin,rega,=4b0011;,regb,=4b1010;,regc,=4b0 x10;,end,initial fork,#10,val,=,regc,rega,;/,val,=x,#20,val,=,regb,=,rega,;/,val,=1,#40,val,=,regb,regc,;/,val,=1,#50$finish;,join,endmodule,大于,=,大于等于,regc,rega,和,regc,的关系取决于,x,可直接对比较器硬件建模,也可用于生成优先级电路,名称,记号,定义,用途,注释,等式运算符,=,等于,电路功能描述,等于,!,=,不等于,电路功能描述,不等于,=,全等于,仿真,X,Z,也作为比较对象,!=,不全等于,仿真,=,0,1,X,Z,0,1,0,X,X,1,0,1,X,X,X,X,X,X,X,Z,X,X,X,X,=,0,1,X,Z,0,1,0,0,0,1,0,1,0,0,X,0,0,1,0,Z,0,0,0,1,等于,全等于,等式运算符,=,和!,=,不能综合;多用于编解码硬件电路建模,等式运算符,赋值运算符,将等式右边表达式的值拷贝到左边,。,注意逻辑等与,case,等的差别,=,2b1x=2b0 x,值为,0,,因为不相等,2b1x=,2b1x,值为,x,,因为可能不相等,也可能相等,2b1x=2b0 x,值为,0,,因为不相同,2b1x=,2b1x,值为,1,,因为相同,a=2b1x;,b=2b1x;,if(a=b),$display(a is equal to b);,else,$display(a is not equal to b);,a=2b1x;,b=2b1x;,if(a=b),$display(a is identical to b);,else,$display(a is not identical to b);,Case,等只能用于行为描述,不能用于,RTL,描述。,相等算符,逐位比较二个操作数相应位的值是否相等,只有当每一位都,相等时,相等关系才满足。如果任何一个操作数中的某一位,存在不定态或高阻态,则将得到一个不定态的结果。,全等算符,将不定态或高阻态看作是逻辑状态的一种而,参与比较。,相等运算符,逻辑等,逻辑不等,=,!,=,module equalities1();,reg,3:0,rega,regb,regc,;,reg,val,;,initial begin,rega,=4b0011;,regb,=4b1010;,regc,=4b1x10;,end,initial fork,#10,val,=,rega,=,regb,;/,val,=0,#20,val,=,rega,!=,regc,;/,val,=1,#30,val,=,regb,!=,regc,;/,val,=x,#40,val,=,regc,=,regc,;/,val,=x,#50$finish;,join,endmodule,其结果是,1b1,、,1b0,或,1bx,。,如果左边及右边为确定值并且相等,则结果为,1,。,如果左边及右边为确定值并且不相等,则结果为,0,。,如果左边及右边有值不能确定的位,但值确定的位相等,则结果为,x,。,!=,的结果与,=,相反,值确定是指所有的位为,0,或,1,。不确定值是有值为,x,或,z,的位。,相等运算符,相同,(case,等,),不相同,(case,不等,),=,!,=,module equalities2();,reg,3:0,rega,regb,regc,;,reg,val,;,initial begin,rega,=4b0011;,regb,=4b1010;,regc,=4b1x10;,end,initial fork,#10,val,=,rega,=,regb,;/,val,=0,#20,val,=,rega,!=,regc,;/,val,=1,#30,val,=,regb,=,regc,;/,val,=0,#40,val,=,regc,=,regc,;/,val,=1,#50$finish;,join,endmodule,其结果是,1b1,、,1b0,或,1bx,。,如果左边及右边的值相同(包括,x,、,z),,则结果为,1,。,如果左边及右边的值不相同,则结果为,0,。,!=,的结果与,=,相反,综合工具不支持,条件运算符,条件,?:,module,likebufif,(in,en,out);,input in;,input en;,output out;,assign out=(en=1)?in:,bz,;,endmodule,module like4to1(a,b,c,d,sel,out);,input a,b,c,d;,input 1:0,sel,;,output out;,assign out=,sel,=2b00?a:,sel,=2b01?b:,sel,=2b10?c:d;,endmodule,如果条件值为,x,或,z,,则结果可能为,x,或,z,多用于多路选择器硬件建模,条件操作符,条件操作符的语法为:,=?:,其意思是:,if condition is TRUE,then LHS=,true_expression,else LHS=,false_expression,每个条件操作符必须有三个参数,缺少任何一个都会产生错误。,最后一个操作数作为缺省值。,上式中,若,condition,为真则,register,等于,true_value,;若,condition,为假则,register,等于,false_value,。一个很有意思的地方是,如果条件值不确定,且,true_value,和,false_value,不相等,则输出不确定值。,例如:,assign out=(,sel,=0)?a:b;,若,sel,为,0,则,out=a,;若,sel,为,1,则,out=b,。如果,sel,为,x,或,z,,若,a=b=0,,则,out=0,;若,ab,,则,out,值不确定。,位拼接运算符,位拼接运算符,。用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。其使用方法如下:,信号,1,的某几位,信号,2,的某几位,,.,.,信号,n,的某几位,a,b3:0,w,3b101,也可以写成为,a,b3,b2,b1,b0,w,1b1,1b0,1b1,在位拼接表达式中不允许存在没有指明位数的信号。,拼接还可以用重复法来简化表达式。,4w /,这等同于,w,w,w,w,位拼接还可以用嵌套的方式来表达。,b,3a,b /,这等同于,b,a,b,a,b,a,b,用于表示重复的表达式如上例中的,4,和,3,,必须是常数表达式。,位拼接运算符,拼接,可以从不同的矢量中选择位并用它们组成一个新的矢量。,用于位的重组和矢量构造,module concatenation;,reg,7:0,rega,regb,regc,regd,;,reg,7:0 new;,initial begin,rega,=8b0000_0011;,regb,=8b0000_0100;,regc,=8b0001_1000;,regd,=8b1110_0000;,end,initial fork,#10 new=,regc,4:3,regd,7:5,regb,2,rega,1:0;,/new=,8b11111111,#20$finish;,join,endmodule,在级联和复制时,必须指定位数,否则将产生错误。,下面是类似错误的例子:,a7:0=4 b10;,b7:0=2 5;,c3:0=3b011,b0;,级联时不限定操作数的数目。在操作符符号,中,用逗号将操作数分开。例如,:,A,B,C,D,assign,csx,=io_port7;assign rd=io_port6;assign,ih,=io_port5;assign st1=io_port4;assign st2=io_port3;assign lock=io_port2;assign,bsy,=io_port1;,wire 7:0,io_port,;assign,io_port,=,rdy,snd,tx,rx,cs,mode,tst,busy;,wire 7:0,io_port,;assign,csx,rd,ih,st1,st2,lock,bsy,pwd,=,io_port,;,连接,分解,位拼接运算符,允许实型量参与的运算符,不允许实型量参与的运算符,注意,在,verilog,的操作符体系中,必须注意以下三个问题:,1,运算表达式中的变量如果为”,x“,,或为”,z“,,则表达式的值为未知,应尽量避免这种情况的发生。,2,运算表达式中变量的位宽应尽量统一,否则将无法顺利通过综合。,3,应重视非常量下标的应用,可产生译码,编码,多路选择等电路。,
展开阅读全文