第6章Verilog设计进阶学习目标及重点1学习目标1)掌握verilog行为语句的基本格式、执行机制;2)掌握使用verilog行为语句编写简单组合逻辑电路、时序逻辑电路的方法;3)了解仿真激励文件的基本写法;4)进一步理解程序与硬件之间的关系。2学习重点1)算法的基本概念;2)算法与verilog语言的结合使用;3)可综合的verilog行为语句;主要内容6.1过程语句(initial、always)6.2块语句(begin-end、fork-join)6.3赋值语句(assign、=、=)6.4条件语句(if-else、case、casez、casex)6.5循环语句(for、forever、repeat、while)6.6编译指示语句(`define、`include、`ifdef、`else、`endif)6.7任务(task)与函数(function)6.8顺序执行与并发执行算法的基本概念1.什么是算法?并不是需要计算的场合才有算法。算法,简单的说,就是解决问题的方法及步骤。2.算法与verilog程序的关系算法是verilog程序实现对象。3.算法的多样性4.算法的实现1)算法的设计不能天马行空,要具有可实现性;2)可实现性的基础:基于何种工具实现算法,那么算法的特征要与这种工具本身的特征相契合。我们所使用的工具:verilog编程语言。算法的基本概念设计算法分析算法的行为特征利用verilog语言实现掌握verilog行为语句的运行机理分析问题VerilogHDL行为语句类别语句可综合性过程语句initialalways√块语句串行块begin-end√并行块fork-join赋值语句持续赋值assign√过程赋值=、=√条件语句if-else√case√循环语句for√repeatwhileforever编译向导语句`define√`include√`ifdef,`else,`endif√注意:1.所有的语句都可以用于仿真;2.不同综合器支持的verilog不同,具体应参考软件的帮助文档。6.1过程语句initial——用于仿真过程语句always——用于综合及仿真always过程语句1.always语句的使用模板always@(敏感信号表达式event-expression)begin//过程赋值//if-else,case,casex,casez选择语句//while,repeat,for循环//task,function调用end2.always语句的运行机制a)敏感信号表达式若满足一次,则运行一次块内语句;b)若不满足,则块内语句不运行;c)若不断满足,则块内语句不断的循环执行;d)同一程序模块(module)中可以有多个always块,各个always块之间是并行执行的关系。块内语句always过程语句3.敏感信号表达式的写法1)“电平敏感”的敏感信号表达式a)写法例:@(a)//单信号敏感@(aorborc)//多个信号敏感,信号间用关键字or隔开b)运行机制只要表达式中的任何一个变量发生变化,则执行一次块内语句。例:@(a)//当信号a的值发生改变,运行块内程序@(aorborc)//a、b、c中任意一个信号变化,运行块内程序c)用途:常用于组合逻辑描述。d)注意:敏感信号表达式中应列出影响块内取值的所有信号。always过程语句2)“边沿敏感”的敏感信号表达式a)写法及运行机制@(posedgeclock)//单信号敏感,当clock的上升沿到来时执行块内语句@(negedgeclock)//单信号敏感,当clock的下降沿到来时执行块内语句@(posedgeclkornegedgereset)//多信号敏感,信号间用关键字or隔开//当clk的上升沿到来或reset信号的下降沿到来,执行块内语句b)用途常用于描述时序电路。c)注意使用中最好不要在同一个always块内用两种方式的敏感信号。例:always@(posedgeclockorclr)//不建议这样使用always过程语句4.初识用always语句实现组合电路与时序电路1)组合电路用always语句实现的4位全加器moduleadder4(cout,sum,ina,inb,cin);output[3:0]sum;outputcout;input[3:0]ina,inb;inputcin;reg[3:0]sum;regcout;always@(inaorinborcin)begin{cout,sum}=ina+inb+cin;endendmodule在always块内被赋值的变量必须定义为reg型敏感信号列表,电平敏感,列出所有影响块内输出的信号always过程语句2)时序逻辑:用always语句实现4位加1计数器。带同步复位端。modulecount4(out,reset,clk);output[3:0]out;inputreset,clk;reg[3:0]out;always@(posedgeclk)beginif(reset)out=0;//同步复位elseout=out+1;//计数endendmodule在过程块内被赋值的变量必须定义为reg型敏感信号列表,上升沿敏感always@(posedgeclkorposedgereset)beginif(reset)out=0;//异步复位elseout=out+1;//计数endendmodulealways过程语句3)组合逻辑与时序逻辑的综合结果类比4位全加器RTL级综合的结果4位计数器RTL级综合的结果(同步复位)4位计数器RTL级综合的结果(异步复位)同步控制信号、异步控制信号的设计及分析:1)软件设计同步控制:信号不出现在敏感信号列表中;异步控制:信号要出现在敏感信号列表中;2)电路行为特性分析:同步控制:控制信号有效且同步时钟有效时,控制功能执行;异步控制:控制信号一旦有效。控制功能马上执行。always过程语句always过程语句5.进一步认识用always语句设计组合电路及时序电路1)组合电路设计:4选1数据选择器modulemux4_1(out,in0,in1,in2,in3,sel);outputout;inputin0,in1,in2,in3;input[1:0]sel;regout;always@(in0orin1orin2orin3orsel)//敏感信号列表case(sel)2'b00:out=in0;2'b01:out=in1;2'b10:out=in2;2'b11:out=in3;default:out=2'bx;endcaseendmodulealways过程语句2)时序电路设计:同步清零、同步置数的8位计数器modulecount(out,data,load,reset,clk);output[7:0]out;input[7:0]data;inputload,clk,reset;reg[7:0]out;always@(posedgeclk)//clk上升沿触发beginif(!reset)out=8'h00;//同步清0,低电平有效elseif(load)out=dat;//同步预置,高电平有效elseout=out+1;//计数endendmodulealways过程语句6进阶-用always语句实现较复杂的组合逻辑电路算术逻辑单元(ALU)1)真值表输入输出opcode[2:0]about0╳╳a+b1╳╳a-b2╳╳a&b3╳╳a|b4╳╳~a其他╳╳xxalways过程语句2)代码modulealu(out,opcode,a,b);input[2:0]opcode;//3位的指令码input[7:0]a,b;//8位的操作数output[7:0]out;//8位计算机结果reg[7:0]out;always@(opcodeoraorb)//电平敏感的always块begincase(opcode)3’d0:out=a+b;//指令码00-加操作3’d1:out=a-b;//指令码01-减操作3’d2:out=a&b;//指令码02-位与3’d3:out=a|b;//指令码03-位或3’d4:out=~a;//指令码04-按位取反default:out=8’hxx;//没有有效指令输出任意态endcaseendendmoduleinitial过程语句1.initial语句的格式initialbegin语句1;语句2;……..end2.使用规则a)只能在仿真文件中使用;b)在同一程序模块(module)中,可以有多个initial块,它们都是并行运行的。3.运行机制在整个程序的执行过程中,只运行一次.4.用途a)仿真文件中对变量赋初值;b)生成电路仿真测试的激励波形。initial过程语句例1:用initial语句赋初值initialbeginareg=0;//初始化寄存器aregfor(index=0;indexsize;index=index+1)memory[index]=0;//初始化一个存储器endIntergerindex;parametersize=64;reg[7:0]memory[size:0];initial过程语句例2:用initial语句生成激励波形注意:用initial语句生成激励波形只在一段时间内有效,不是循环往复的’timescale1ns/1nsmoduletest;regA,B,C;(调用被仿真的程序模块)initialbeginA=0;B=1;C=0;#50A=1;B=0;#50A=0;C=1;#50B=1;#50B=0;C=0;#50$finish;endendmodule在过程语句被赋值的变量必须定义为reg型调用系统函数,显示仿真结果或控制仿真过程。6.2块语句1.定义块语句是由块标志符begin-end或fork-join界定的一组语句,当块语句只包含一条语句时,块标志符可以缺省。2.可综合性begin-end-------可用于综合以及仿真fork-join----------只能用于仿真3.运行机制begin-end-------串行方式顺序执行在块内使用非阻塞型赋值语句时为例外。fork-join----------并行执行6.2块语句’timescale1ns/1nsmoduletest;regA,B,C;initialbeginA=0;B=1;C=0#50A=1;B=0;#50A=0;C=1;#50B=1;#50B=0;C=0;#50$finish;endendendmodule’timescale1ns/1nsmoduletest;regA,B,C;initialforkA=0;B=1;C=0#50A=1;B=0;#100A=0;C=1;#150B=1;#200B=0;C=0;#250$finish;joinendendmodulebegin-end语句与fork-join语句用于仿真时的区别:begin-end:每条语句前面的延时都是相对于前一条语句执行结束的时间。fork-join:每条语句前面的延时都是相对于该并行块的起始时间。所有后续语句的起始点第二句的起始点第三句的起始点6.3赋值语句1、持续赋值语句--------assign1)运行机制主要用于对wire型变量的赋值。例:assignc=a&b;在上面的赋值中,a、b、c三个变量皆为wire型变量,a和b信号的任何变化,都将随时反映到c上来。2)用途:用以实现较简单的组合逻辑电路。赋值语句持续赋值语句assign------可综合过程赋值语句=、《=------可综合6.3赋值语句用assign语句实现4选1的数据选择器:真值表:输入信号输出sel1sel0in0in1in2in3out00in0╳╳╳in001╳in1╳╳in110╳╳in2╳in211╳╳╳in3in3assignout=(~se1)&(~sel0)&in0+(~se1)&sel0&in1+se1&(~sel0)&in