1VerilogHDL描述例子1.组合电路的例子例14选1数据选择器(if叙述)。modulemux(a,b,c,d,s,o);inputa,b,c,d;input[1:0]s;outputo;rego;always@(aorborcordors)beginif(s==2'b00)o=a;elseif(s==2'b01)o=b;elseif(s==2'b10)o=c;elseo=d;endendmodule例2具有三态缓冲4选1数据选择器。modulemux(a,b,c,d,s,o);inputa,b,c,d;input[3:0]s;outputo;assigno=s[3]?a:1'bz;assigno=s[2]?b:1'bz;assigno=s[1]?c:1'bz;assigno=s[0]?d:1'bz;endmodule例3采用case语句描述的3-8译码器,输出高电平有效。modulemux(sel,res);input[2:0]sel;output[7:0]res;reg[7:0]res;always@(selorres)begincase(sel)3'b000:res=8'b00000001;3'b001:res=8'b00000010;3'b010:res=8'b00000100;3'b011:res=8'b00001000;3'b100:res=8'b00010000;3'b101:res=8'b00100000;3'b110:res=8'b01000000;2default:res=8'b10000000;endcaseendendmodule例4进位输入与输出的8位加法器moduleadder(A,B,CI,SUM,CO);inputCI;input[7:0]A;input[7:0]B;output[7:0]SUM;outputCO;wire[8:0]tmp;assigntmp=A+B+CI;assignSUM=tmp[7:0];assignCO=tmp[8];endmodule例58位比较器modulecompar(A,B,CMP);input[7:0]A;input[7:0]B;outputCMP;assignCMP=A=B?1'b1:1'b0;endmodule2时序电路的例子例1上升沿触发的具有异步置位与时钟使能端的4位寄存器moduleli5(C,D,CE,PRE,Q);inputC,CE,PRE;input[3:0]D;output[3:0]Q;reg[3:0]Q;always@(posedgeCorposedgePRE)beginif(PRE)Q=4'b1111;elseif(CE)Q=D;endendmodule例2具有清除端的4位加法计数器。moduleli7(C,CLR,Q);inputC,CLR;output[3:0]Q;reg[3:0]tmp;3always@(posedgeCorposedgeCLR)beginif(CLR)tmp=4'b0000;elsetmp=tmp+1'b1;endassignQ=tmp;endmodule例3具有同步置位的4位减法计数器。moduleli8(C,S,Q);inputC,S;output[3:0]Q;reg[3:0]tmp;always@(posedgeC)beginif(S)tmp=4'b1111;elsetmp=tmp-1'b1;endassignQ=tmp;endmodule例4具有异步置位的4位加法计数器。moduleli9(C,ALOAD,D,Q);inputC,ALOAD;input[3:0]D;output[3:0]Q;reg[3:0]tmp;always@(posedgeCorposedgeALOAD)beginif(ALOAD)tmp=D;elsetmp=tmp+1'b1;endassignQ=tmp;endmodule例5同步置入一个常数的4位加法计数器。modulelia10(C,SLOAD,Q);inputC,SLOAD;output[3:0]Q;reg[3:0]tmp;always@(posedgeC)beginif(SLOAD)tmp=4'b1010;elsetmp=tmp+1'b1;endassignQ=tmp;4endmodule例6具有异步清除端的4位加减计数器。modulelia11(C,CLR,UP_DOWN,Q);inputC,CLR,UP_DOWN;output[3:0]Q;reg[3:0]tmp;always@(posedgeCorposedgeCLR)beginif(CLR)tmp=4'b0000;elseif(UP_DOWN)tmp=tmp+1'b1;elsetmp=tmp-1'b1;endassignQ=tmp;endmodule例7控制信号t控制置数与减法计数的100进制计数器。modulecount(clk,t,td,qq1,qq2);//t控制置数与计数,td减计数到0时,td=1inputt,clk;outputtd;output[3:0]qq1,qq2;//qq2是高4位,qq1是低4位wire[3:0]qq1,qq2;regtd;reg[7:0]qq;assign{qq2,qq1}=qq;always@(posedgeclkornegedget)beginif(t==0)beginqq=99;td=0;endelseif((t==1)&&(qq=1))beginqq=qq-1;td=0;endelsetd=1;endendmodule例8正沿触发、串入、串出的8位左移移位寄存器moduleshift(C,SI,SO);inputC,SI;outputSO;reg[7:0]tmp;always@(posedgeC)begintmp=tmp1;tmp[0]=SI;endassignSO=tmp[7];endmodule5例9负沿触发,串入、串出、左移、具有时钟使能的移位寄存器moduleshift(C,CE,SI,SO);inputC,SI,CE;outputSO;reg[7:0]tmp;always@(negedgeC)beginif(CE)begintmp=tmp1;tmp[0]=SI;endendassignSO=tmp[7];endmodule例10正沿触发,串入、串出、左移、具有异步清除的移位寄存器moduleshift(C,CLR,SI,SO);inputC,SI,CLR;outputSO;reg[7:0]tmp;always@(posedgeCorposedgeCLR)beginif(CLR)tmp=8'b00000000;elsebegintmp={tmp[6:0],SI};endendassignSO=tmp[7];endmodule例11正沿触发,串入、串出、左移、具有同步置位的移位寄存器moduleshift(C,S,SI,SO);inputC,SI,S;outputSO;reg[7:0]tmp;always@(posedgeC)beginif(S)tmp=8'b11111111;elsebegintmp={tmp[6:0],SI};//移位6endendassignSO=tmp[7];//串出endmodule[例12]具有高电平异步置位和清零的D触发器。module(q,qb,d,clk,set,reset);//触发器输出q和qb,触发器输入d,时钟clk,置位set,复位resetoutputq,qb;inputd,clk,set,reset;regq,qb;always@(posedgeclkorposedgesetorposedgereset)//always块和敏感信号begin//时钟上升沿、高电平置位、高电平复位if(reset)begin//触发器清零q=0;qb=1;endelseif(set)begin//触发器置位q=1;qb=0;endelsebegin//触发器时钟逻辑q=d;qb=~d;endendendmodule[例13]固定终值的减法100进制十六进制输出的计数器。如下描述的计数器为100进制,输出为十六进制格式的高、低4位。在t=0时,计数设置初值99,当t=1时,计数器开始减法计数,当计数值为00时,计数器停止计数,并使计数器输出td=1。modulecount(clk,t,td,qq1,qq2);//clk时钟,t控制置数与计数inputt,clk;outputtd;output[3:0]qq1,qq2;//qq2是高4位,qq1是低4位wire[3:0]qq1,qq2;regtd;reg[7:0]qq;assign{qq2,qq1}=qq;always@(posedgeclkornegedget)//t是异步控制置数或是计数beginif(t==0)beginqq=99;td=0;end//如果t=0,则计数器置初值qq=99elseif((t==1)&&(qq=1))beginqq=qq-1;td=0;end//如果t=1,计数器数值大于等于1,则减法计数elsetd=1;//否则qq1,则td=1endendmodule该例中wire类型的线,合并成了寄存器型的总线,例如,wire[3:0]qq1,qq2;reg[7:0]qq;assign{qq2,qq1}=qq;7[例14]固定终值的十进制减法计数器的VerilogHDL描述。如下所描述的计数器为减法十进制级连计数器,在信号t=0时,预置数为23;当信号t=1时,计数器减法计数,当低位减到0时,向高位借位,直到高位也为0时,计数器输出信号td=1。modulejishu10a(clk,t,td,qq1,qq2);//时钟clk,控制信号t,td是计数器减计数到0信号//计数器输出低4位是qq1,高4位是qq2inputt,clk;outputtd;output[3:0]qq1,qq2;wire[3:0]qq1,qq2;regtds;regc1,c2;reg[3:0]qq11,qq22;//设置内部信号always@(posedgeclkornegedget)//t信号异步控制置数与计数beginif(t==0)beginqq11=3;qq22=2;tds=0;end//如果t=0,计数器置数23elseif(!tds)//否则t=1beginqq11=qq11-1;//低位减1if(qq11==0)//如果低位减到0beginqq22=qq22-1;qq11=9;end//高位减1,低位置9elseqq22=qq22;//否则,高位保持不变endif((qq11==0)&&(qq22==0))tds=1;//如果低4位为0,而且高4位也为0,则计数器输出tds=1endassignqq1=qq11;assignqq2=qq22;assigntd=tds;endmodule该例题的仿真结果如图12-17所示。在t=0时,设置初值23,当计数器减法计数到00时,td=1。图12-17例题18的仿真结果[例15]可设置计数终值的十六进制输出减法计数器的VerilogHDL描述。如下是一个小于256进制的可预置数倒计时计数器的描述。该计数器在t=0时,设置初值data,在t=1时,开始减法计数,当减计数到0时,停止计数,并使输出信号td=1。modulere3(clk,t,td,qq1,qq2,data);//clk时钟,t控制置数与计数,td是输出信号,data是初值inputt,clk,data;//qq1是低4位,qq2是高4位outputtd;output[3:0]qq1,qq2;wire[3:0]qq1,qq2;wire[7:0]data;regtd;8reg[7:0]qq;assign{qq2,qq1}=qq;always@(posedgeclkornegedget)//t可