VerilogVerilog硬件描述语言硬件描述语言(二)(二)22课程内容一、VerilogHDL运算符二、VerilogHDL语句三、可综合设计按功能分:算术运算符、逻辑运算符、关系运算符、缩减运算符、条件运算符、位运算符、移位运算符、拼接运算符等类。按操作数的个数分:单目运算符、双目运算符、三目运算符。算术运算符算术运算符(Arithmeticoperator)(Arithmeticoperator)+加-减*乘/除%求模逻辑运算符逻辑运算符((LogicaloperatorLogicaloperator))&&逻辑与||逻辑或!逻辑非ABA&&BA||B!A!B111100100101010110000011位运算符位运算符((BitwiseoperatorBitwiseoperator))~按位取反&按位与|按位或^按位异或^~,~^按位同或&01x0000101xx0xx按位与真值表|01x001x1111xx1x按位或真值表^01x001x110xxxxx按位异或真值表关系运算符关系运算符(Relationaloperator)(Relationaloperator)<小于<=小于或等于>大于>=大于或等于注意:“<=”操作符还用于信号的一种赋值缩位运算符缩位运算符(Reductionoperator)(Reductionoperator)~&与非&与|或~|或非^异或^~,~^同或缩位运算符与位运算符的逻辑运算法则一样,但缩位运算是对单个操作数进行与、或、非递推运算,它放在操作数前面。缩位运算符将一个矢量缩减为一个标量如:reg[3:0]a;b=&a;//等效于:b=((a[0]&a[1])&a[2])&a[3];移位运算符移位运算符(Shiftoperator)(Shiftoperator)移位操作符只有两个:左移和右移用法:A>>n或A<>右移<<左移条件运算符条件运算符(Conditionaloperator)(Conditionaloperator)这是一个三目运算符,对3个操作数进行运算。用法:signal=condition?true_expression:flase_expression;即:信号=条件?表达式1:表达式2;条件成立时,信号取表达式1的值,反之取2。?举例:举例:01selin0in1out位接运算符位接运算符{}用法:{信号1的某几位,信号2的某几位,…,信号n的某几位}举例:assign{cout,sum}=a+b+cin;运算符优先级!~高优先级低优先级*/%+-<<>><<=>>===!====!==&~&^^~|^~&&||?:分类分类类别语句可综合性过程语句always√initial块语句串行块begin-end√并行块fork-join赋值语句持续赋值assign√过程赋值=、<=√条件语句if-else√case√循环语句for√repeatwhileforever编译向导`define√`include√`ifdef,`else,`endif√过程语句:过程语句:alwaysalwaysalways@(<敏感信号>)begin//过程赋值//if-else,case选择语句end敏感信号类型:@(a)@(aorb)@(posedgeclock)@(negedgeclock)@(posedgeclkornegedgereset)举例:DFFmoduleDFF(d,clk,reset,q,qb);outputq,qb;inputclk,reset,d;regq,qb;always@(posedgeclk)beginif(!reset)beginq<=0;qb<=1;endelsebeginq<=d;qb<=~d;endendendmodule特点:特点:只有两种状态:执行状态和等待状态一般由敏感信号的变化来启动各个always间通过信号线进行通信一个always中只允许描述对应于一个时钟信号的同步时序逻辑always之间是并发执行的块语句:块语句:beginendbeginend总是在always内部按顺序执行举例:举例:regqa,qb,qc;always@(posedgeclk)beginqa<=d;qb<=qa;qc<=qb;end赋值语句:赋值语句:持续赋值语句过程赋值语句持续赋值语句:持续赋值语句:assignc=a&b;过程赋值语句:过程赋值语句:非阻塞赋值“<=”阻塞赋值“=”分为两步骤:右式计算、左式更新非阻塞赋值非阻塞赋值::当前语句的执行不会阻塞下一语句的执行语句之间并发执行左式更新在块结束后才进行阻塞赋值阻塞赋值::当前语句的执行会阻塞下一语句的执行语句之间顺序执行右式计算和左式更新同时进行举例举例::modulenonblocking(clk,reset,a,b);inputclk,reset;input[3:0]a;output[3:0]b;reg[3:0]b;reg[3:0]y;always@(posedgeclkornegedgereset)beginif(!reset)beginy<=0;b<=0;endelsebeginy<=a;b<=y;endendendmodule结果结果::举例举例::modulenonblocking(clk,reset,a,b);inputclk,reset;input[3:0]a;output[3:0]b;reg[3:0]b;reg[3:0]y;always@(posedgeclkornegedgereset)beginif(!reset)beginy<=0;b<=0;endelsebeg...