EDA技术与电子工程设计102第4章常用电路VerilogHDL设计本章我们通过具体实例说明如何用VerilogHDL设计一些常用的数字电路,这里我们给出了VerilogHDL描述模型和综合后的原理图。本章我们还介绍了一些比较复杂的VerilogHDL设计的综合实例,这些例子说明了可综合VerilogHDL层次设计的方法。4.1常用组合电路模块的设计4.1.1简单门电路的描述1.基本门电路的描述下面是一个简单的门电路的例子,我们用几种方式对同一个门电路进行了描述。例4.1(1)调用门原语modulegate1(a,b,c,d,z);inputa,b,c,d;outputz;nor(s1,b);or(s2,a,b);and(s3,s1,c,d);nand(z,s2,s3);endmodule如图4-1所示是其综合以后的原理图。图4-1简单的门电路(2)用assign连续赋值语句描述第4章常用电路VerilogHDL设计103modulegate2(a,b,c,d,z);inputa,b,c,d;outputz;wires1,s2,s3;assigns1=~b;assigns2=a|b;assigns3=s1&c&d;assignz=~(s2&s3);endmodule用如下代码描述电路是等效的。modulegate3(a,b,c,d,z);inputa,b,c,d;outputz;assignz=~((a|b)&(~b&c&d));endmodule如图4-2所示是其综合以后的原理图。图4-2简单的门电路(3)用过程赋值语句描述modulegate4(a,b,c,d,z);inputa,b,c,d;outputz;regz;regs1,s2,s3;always@(aorborcord)begins1=~b;s2=a|b;s3=s1&c&d;EDA技术与电子工程设计104z=~(s2&s3);endendmodule同样,我们还可以用如下代码描述。modulegate5(a,b,c,d,z);inputa,b,c,d;outputz;regz;always@(aorborcord)beginz=~((a|b)&(~b&c&d));endendmodule其综合以后的原理图与图4-2所示是一样的。2.三态门下面我们分别用VerilogHDL的关键字、assign语句和过程赋值语句三种方式来描述一个三态门,该三态门有一个输入端a、一个输出端y和一个控制端en。当控制端en为1(高)时,y=a;当控制端en为0(低)时,输出为高阻态。例4.2(1)用bufif1关键字描述的三态门moduletristate1(en,a,y);inputen,a;outputy;triy;bufif1tri_1(y,a,en);endmodule如图4-3所示是其综合以后的原理图。图4-3三态门(2)用assign语句描述的三态门第4章常用电路VerilogHDL设计105moduletristate2(en,a,y);inputen,a;outputy;assigny=en?a:1'bz;endmodule(3)用过程赋值语句描述的三态门moduletristate3(en,a,y);inputen,a;outputy;regy;always@(enora)beginif(en)y=a;elsey=1'bz;endendmodule3.三态双向驱动器下面我们来描述一个三态双向驱动器例4.3三态双向驱动器modulebidir(en,a,b,z,y);inputen,a,b;outputz;inouty;assigny=en?a:1'bz;assignz=y^b;endmodule如图4-4(a)所示是其综合以后的原理图,(b)是其用MAX+plusII编译生成的模块符号。EDA技术与电子工程设计106(a)(b)图4-4三态双向驱动器4.1.2译码器1.2-4译码器下面是一个用连续赋值语句描述的2-4译码器。例4.42-4译码器moduledecoder2_4(a,b,en,y);inputa,b,en;output[3:0]y;wireabar,bbar;assignabar=~a;assignbbar=~b;assigny[0]=~(en&abar&bbar);assigny[1]=~(en&abar&b);assigny[2]=~(en&a&bbar);assigny[3]=~(en&a&b);endmodule如图4-5所示是其综合后的原理图。第4章常用电路VerilogHDL设计107图4-52-4译码器3-8译码器下面的例子我们用case语句描述了一个3-8译码器。例4.53-8译码器moduledecoder3_8(s1,s2,s3,in,y);input[2:0]in;inputs1,s2,s3;output[7:0]y;reg[7:0]y;wires;always@(inors1ors2ors3)beginif(~s1)y=8'b11111111;elseif(~(s2&s3))y=8'b11111111;elsebegincase(in)3'd0:y=8'b11111110;3'd1:y=8'b11111101;3'd2:y=8'b11111011;3'd3:y=8'b11110111;3'd4:y=8'b11101111;3'd5:y=8'b11011111;3'd6:y=8'b10111111;EDA技术与电子工程设计1083'd7:y=8'b01111111;endcaseendendendmodule如图4-6所示是其综合后的原理图。图4-63-8译码器这一例子中,我们可以用if-else语句来代替case语句。例4.6moduledecoder3_82(y,in,s1,s2,s3);output[7:0]y;input[2:0]in;inputs1,s2,s3;reg[7:0]y;第4章常用电路VerilogHDL设计109always@(inors1ors2ors3)beginif(~s1)y=8'b11111111;elseif(~(s2&s3))y=8'b11111111;elseif(in==0)y=8'b11111110;elseif(in==1)y=8'b11111101;elseif(in==2)y=8'b11111011;elseif(in==3)y=8'b11110111;elseif(in==4)y=8'b11101111;elseif(in==5)y=8'b11011111;elseif(in==6)y=8'b10111111;elsey=8'b01111111;endendmodule如图4-7所示是其综合后的原理图。EDA技术与电子工程设计110图4-73-8译码器从这些例子我们可以看出,用不同的方法描述所综合出来的电路是不一样的。2.七段LED数码管显示译码器下面的模块描述了一个七段LED数码管显示译码器。例4.7moduledecode4_7(d0,d1,d2,d3,a,b,c,d,e,f,g);inputd0,d1,d2,d3;outputa,b,c,d,e,f,g;rega,b,c,d,e,f,g;always@(d0ord1ord2ord3)begincase({d3,d2,d1,d0})4ˊd0:{a,b,c,d,e,f,g}=7ˊb1111110;第4章常用电路VerilogHDL设计1114ˊd1:{a,b,c,d,e,f,g}=7ˊb0110000;4ˊd2:{a,b,c,d,e,f,g}=7ˊb1101101;4ˊd3:{a,b,c,d,e,f,g}=7ˊb1111001;4ˊd4:{a,b,c,d,e,f,g}=7ˊb0110011;4ˊd5:{a,b,c,d,e,f,g}=7ˊb1011011;4ˊd6:{a,b,c,d,e,f,g}=7ˊb1011111;4ˊd7:{a,b,c,d,e,f,g}=7ˊb1110000;4ˊd8:{a,b,c,d,e,f,g}=7ˊb1111111;4ˊd9:{a,b,c,d,e,f,g}=7ˊb1111011;default:{a,b,c,d,e,f,g}=7ˊbx;endcaseendendmodule在上一章中,我们已经对这一电路进行了描述,并给出了其综合以后的原理图。4.1.3编码器下面的例子我们用if-else语句实现了一个8-3优先编码器。if-else条件语句的分支是有优先顺序的,该模块正是利用了其这一特点,编码器的输入为a、b、c、d、e、f、g、h,输入信号高电平有效,h的优先级昀高。例4.88-3优先编码器moduleencoder8_3(a,b,c,d,e,f,g,h,none_on,outcode);inputa,b,c,d,e,f,g,h;outputnone_on;output[2:0]outcode;reg[3:0]outtemp;assign{none_on,outcode}=outtemp;always@(aorborcordoreorforgorh)beginif(h)outtemp=4'b0111;elseif(g)outtemp=4'b0110;elseif(f)outtemp=4'b0101;elseif(e)outtemp=4'b0100;elseif(d)outtemp=4'b0011;elseif(c)outtemp=4'b0010;elseif(b)outtemp=4'b0001;elseif(a)outtemp=4'b0000;EDA技术与电子工程设计112elseouttemp=4'b1000;endendmodule如图4-8所示是其综合以后的原理图。图4-88-3优先编码器用MAX+plusII对该电路进行仿真,得到如图4-9所示的波形图。图4-98-3优先编码器仿真波形4.1.4数据选择器下面我们来描述一个数据选择器例4.94选1数据选择器第4章常用电路VerilogHDL设计113modulemul4_1(d0,d1,d2,d3,sel,z);inputd0,d1,d2,d3;input[1:0]sel;outputz;regz;always@(d0ord1ord2ord3orsel)begincase(sel)2'b00:z=d0;2'b01:z=d1;2'b10:z=d2;default:z=d3;endcaseendendmodule在上一章不同抽象级别的VerilogHDL模型中,我们还用其它的方式描述了数据选择器模型的建立,这里不再赘述。如图4-10所示是其综合以后的原理图。图4-104选1数据选择器4.1.5数字比较器下面我们来描述一个数据比较器,输入为无符号数。例4.10modulecompare2(a,b,eq,gt,lt,ne,ge,le);parametern=2;input[n-1:0]a,b;outputeq,gt,lt,ne,ge,le;reg[5:0]result;EDA技术与电子工程设计114always@(aorb)if(a==b)result=6'b100011;elseif(ab)result=6'b010110;else//(ab)result=6'b001101;assign{eq,gt,lt,ne,ge,le}=result;endmodule如图4-11所示是其综合后的原理图。图4-11数字比较器4.1.6奇偶校验器下面的例子我们描述的是一个输入为8位的奇偶校验器,对并行输入的8位数据进行奇偶检测,产生奇校验位odd_bit和偶校验位even_bit。例4.11moduleparity(even_bit,odd_bit,in);outputeven_bit,odd_bit;input[7:0]in;assignodd_bit=^in;assigneven_bit=~odd_bit;endmodule如图4-12所示