第四章VerilogHDL数字逻辑电路设计方法8/13/20201MicroelectronicsSchoolXidianUniversity4.1VerilogHDL语言设计思想和可综合特性8/13/20202MicroelectronicsSchoolXidianUniversity例4.1-1:用VerilogHDL设计模256(8bits)计数器(a)可综合程序描述方式modulecounter(count,clk,reset);outputcount;inputclk,reset;reg[7:0]count;regout;always@(posedgeclk)if(!reset)count=0;elseif(count==8'b11111111)count=0;elsecount=count+1;endmodule(b)常见的错误描述方式modulecounter(count,clk,reset);outputcount;inputreset,clk;reg[7:0]count;regout;integeri;always@(posedgeclk,reset)beginif(!reset)count=0;elsefor(i=0;i=255;i=i+1)count=count+1;endendmodule同时VerilogHDL的电路描述方式具有多样性,这也决定了对于电路设计的多样性。8/13/20203MicroelectronicsSchoolXidianUniversity例4.1-2:用VerilogHDL设计数字多路选择器(a)采用真值表形式的代码:moduleMUX(out,data,sel);outputout;input[3:0]data;input[1:0]sel;regout;always@(dataorsel)case(sel)2'b00:out=data[0];2'b01:out=data[1];2'b10:out=data[2];2'b11:out=data[3];endcaseendmodule(b)采用逻辑表达式形式的代码:moduleMUX(out,data,sel);outputout;input[3:0]data;input[1:0]sel;wirew1,w2,w3,w4;assignw1=(~sel[1])&(~sel[0])&data[0];assignw2=(~sel[1])&sel[0]&data[1];assignw3=sel[1]&(~sel[0])&data[2];assignw4=sel[1]&sel[0]&data[3];assignout=w1|w2|w3|w4;endmodule8/13/20204MicroelectronicsSchoolXidianUniversity(c)采用结构性描述的代码:moduleMUX(out,data,sel);outputout;input[3:0]data;input[1:0]sel;wirew1,w2,w3,w4;notU1(w1,sel[1]);U2(w2,sel[0]);andU3(w3,w1,w2,data[0]);U4(w4,w1,sel[0],data[1]);U5(w5,sel[1],w2,data[2]);U6(w6,sel[1],sel[0],data[3]);orU7(out,w3,w4,w5,w6);\endmodule在现阶段,作为设计人员熟练掌握VerilogHDL程序设计的多样性和可综合性,是至关重要的。作为数字集成电路的基础,基本数字逻辑电路的设计是进行复杂电路的前提。本章通过对数字电路中基本逻辑电路的VerilogHDL程序设计进行讲述,掌握基本逻辑电路的可综合性设计,为具有特定功能的复杂电路的设计打下基础。4.2VerilogHDL组合电路设计组合电路的特点是:电路中任意时刻的稳态输出仅仅取决于该时刻的输入,而与电路原来的状态无关。组合电路的设计需要从以下几个方面考虑:•所用的逻辑器件数目最少,器件的种类最少,且器件之间的连线最简单。这样的电路称“最小化”电路;•其次,为了满足速度要求,应使级数尽量少,以减少门电路的延迟;电路的功耗应尽可能的小,工作时稳定可靠。描述组合逻辑电路有四种方式:结构描述、逻辑代数、真值表、抽象描述。8/13/20205MicroelectronicsSchoolXidianUniversity例4.2-1:设计一个3个裁判的表决电路,当两个或两个以上裁判同意时,判决器输出“1”,否则输出“0”。方法1:真值表方式真值表是对电路功能最直接和简单的描述方式。根据电路的功能,可以通过真值表直接建立起输出与输入之间的逻辑关系。例4.2-1有三个输入端A、B、C和一个输出端OUT。8/13/20206MicroelectronicsSchoolXidianUniversityABCOUT000000100100100001111011110111118/13/20207MicroelectronicsSchoolXidianUniversity在VerilogHDL中,可以使用“case”语句对电路进行描述性设计,表4.2-1真值表设计代码如下:moduledesingn(OUT,A,B,C);outputOUT;inputA,B,C;regOUT;always@(AorBorC)case({A,B,C})3'b000:OUT=0;3'b001:OUT=0;3'b010:OUT=0;3'b100:OUT=0;3'b011:OUT=1;3'b101:OUT=1;3'b110:OUT=1;3'b111:OUT=1;endcaseendmodule方法2:逻辑代数方式对于组合电路的另一种表达方法是逻辑代数方法。主要思想是将真值表用卡诺图表示,然后化简电路,得出逻辑函数表达式。通过对卡诺图的化简,可以得到组合电路逻辑输出与输入之间的逻辑函数表达式:8/13/20208MicroelectronicsSchoolXidianUniversity00100111ABC0001111001根据逻辑函数表达式可以很方便写出采用逻辑代数描述方式的VerilogHDL程序。moduledesingn(OUT,A,B,C);outputOUT;inputA,B,C;assignOUT=(A&B)|(B&C)|(A&C);endmodule8/13/20209MicroelectronicsSchoolXidianUniversity方法3:结构描述方式结构性描述方式是对电路最直接的表示,早期的数字电路设计通常采用的原理图设计实际上就是一种结构性描述方式。moduledesingn(OUT,A,B,C);outputOUT;inputA,B,C;andU1(w1,A,B);andU2(w2,B,C);andU3(w3,A,C);orU4(OUT,w1,w2,w3);endmodule方法4:抽象描述方式VerilogHDL还提供了采用抽象描述进行电路设计的方法,可以直接从电路功能出发,编写代码。例如判决器设计,将三个输入的判决相加,当判决成功时相加器之和大于1,即表示投票成功。8/13/202010MicroelectronicsSchoolXidianUniversitymoduledesingn(OUT,A,B,C);outputOUT;inputA,B,C;wire[1:0]sum;regOUT;assignsum=A+B+C;always@(sum)if(sum1)OUT=1;elseOUT=0;endmoduleEDA综合工具可以将VerilogHDL程序综合成物理电路形式,通过电路优化,可以得到符合设计要求的最简化电路。采用Synplify软件对上面四种方法设计的VerilogHDL程序进行综合(采用Altera公司StratixII器件),可以得相同的最简化电路。8/13/202011MicroelectronicsSchoolXidianUniversity4.2.1数字加法器数字加法器是最为常用的一种数字运算逻辑,被广泛用于计算机、通信和多媒体数字集成电路中例4.2-2:2输入1bit信号全加器。如果运算考虑了来自低位的进位那么该运算就为全加运算,实现全加运算的电路称为全加器。8/13/202012MicroelectronicsSchoolXidianUniversityABC_INSUMC_OUT0000000110010100110110010101011100111111代数逻辑表示为8/13/202013MicroelectronicsSchoolXidianUniversityABC_INSUMC_OUT对应的电路为图SUM=A⊕B⊕C_INVerilogHDL可以用不同的描述方式写出一位全加器,其综合电路是相同的,仅仅是描述风格不同。8/13/202014MicroelectronicsSchoolXidianUniversity(1)利用连续赋值语句实现moduleone_bit_fulladder(SUM,C_OUT,A,B,C_IN);inputA,B,C_IN;outputSUM,C_OUT;assignSUM=(A^B)^C_IN;assignC_OUT=(A&B)|((A^B)&C_IN);//functionofoutputendmodule(2)利用行为描述实现moduleone_bit_fulladder(SUM,C_OUT,A,B,C_IN);outputSUM,C_OUT;inputA,B,C_IN;assign{C_OUT,SUM}=A+B+C_IN;endmodule采用行为描述可以提高设计的效率,对于一个典型的多位加法器的行为描述设计,仅需改变代码中输入和输出信号的位宽即可,例如一个2输入8bits加法器,可以采用下面的VerilogHDL程序代码实现。8/13/202015MicroelectronicsSchoolXidianUniversitymoduleeight_bit_fulladder(SUM,C_OUT,A,B,C_IN);output[7:0]SUM;outputC_OUT;input[7:0]A,B;inputC_IN;assign{C_OUT,SUM}=A+B+C_IN;endmodule例4.2-3:4位超前进位加法器超前进位加法器是一种高速加法器,每级进位由附加的组合电路产生,高位的运算不需等待低位运算完成,因此可以提高运算速度。根据对于输入信号位宽为N的全加器,其进位信号是:输出的加法结果是超前进位标志信号是进位产生函数是8/13/202016MicroelectronicsSchoolXidianUniversity进位传输函数是上述公式中N为加法器位数,在4位加法器中,N=4。由式可以推出各级进位信号表达式,并构成快速进位逻辑电路。8/13/202017MicroelectronicsSchoolXidianUniversity4位超前进位加法器的电路如图所示8/13/202018MicroelectronicsSchoolXidianUniversity0C100CGP211CGP322CGP33GP44GP2S3S0Y1Y2Y3Y0X1X2X3XOnebitfulladderOnebitfulladder0C001PGC112PGC223PGC33PG44PG1SOnebitfulladder0SOnebitfulladder超前进位加法器4C4位超前进位加法器对应的VerilogHDL代码是:8/13/202019MicroelectronicsSchoolXidianUniversitymodulefour_bits_fast_addder(sum_out,c_out,a,b,c_in);input[3:0]a,b;//theotherofa