Verilog HDL数字集成电路设计原理与应用第4章课件.ppt
,第4章 Verilog HDL数字逻辑电路设计方法,4.1 Verilog HDL语言的设计思想和可综合特性 4.2 组合电路的设计 4.3 时序电路的设计 4.4 有限同步状态机 本章小结,在线教务辅导网:http:/,教材其余课件及动画素材请查阅在线教务辅导网,QQ:349134187 或者直接输入下面地址:,http:/,在数字集成电路设计过程中,设计者使用Verilog HDL硬件描述语言进行关键性步骤的开发和设计。其基本过程是,首先使用Verilog HDL对硬件电路进行描述性设计,利用EDA综合工具将其综合成一个物理电路,然后进行功能验证、定时验证和故障覆盖验证。,4.1 Verilog HDL语言的设计思想和可综合特性,与计算机软件所采用的高级程序语言(C语言)类似,Verilog HDL是一种高级程序设计语言,程序编写较简单,设计效率很高。然而,它们面向的对象和设计思想却完全不同。软件高级程序语句是对通用型处理器(如CPU)的编程,主要是在固定硬件体系结构下的软件化程序设计。处理器的体系结构和功能决定了可以用于编程的固定指令集,设计人员的工作是调用这些指令,在固化的体系结构下实现特定的功能。,Verilog HDL和VHDL等硬件描述语言对电路的设计是将基本的最小数字电路单元(如门单元、寄存器、存储器等)通过连接方式,构成具有特定功能的硬件电路。在数字集成电路中,这种最小的单元是工艺厂商提供的设计标准库或定制单元;在FPGA中,这种最小的单元是芯片内部已经布局的基本逻辑单元。设计人员通过描述性语言调用和组合这些基本单元实现特定的功能,其基本的电路是灵活的。,Verilog HDL给设计者提供了几种描述电路的方法。设计者可以使用结构性描述方式把逻辑单元互连在一起进行电路设计,也可以采用抽象性描述方式对大规模复杂电路进行设计,如对有限状态机、数字滤波器、总线和接口电路的描述等。由于硬件电路的设计目标是最终产生的电路,因此Verilog HDL程序设计的正确性需要通过对综合后电路的正确性进行验证来实现。逻辑上相同的电路在物理电路中的形式却有可能完全不同。对于Verilog HDL程序设计而言,数字电路的描述性设计具有一定的设计模式,这与C语言等高级软件程序设计是不同的。,例4.1-1是对模256(8 bit)计数器的两种描述。程序(a)是通常的Verilog HDL语言对计数器的描述方式,通过改变计数器状态寄存器组的位宽和进位条件,可以实现对不同计数器的硬件电路设计。程序(b)是初学者经常出现的一种错误描述方式,刚开始编写Verilog HDL程序时经常会套用C语言等高级程序设计的模式,这样往往得不到目标数字电路的功能。,例4.1-1 用Verilog HDL语言设计模256(8 bit)计数器。(a) 可综合程序描述方式:module counter (count,clk,reset);output count;input clk,reset;reg 7:0 count;reg out;always (posedge clk),if (!reset) count=0;else if (count=8b11111111) count=0; else count=count+1;endmodule(b) 常见的错误描述方式:module counter (count,clk,reset);output count;input reset,clk;,reg 7:0 count;reg out;integer i;always (posedge clk,reset) begin if (!reset) count=0;else for (i=0;i=255;i=i+1),count=count+1;endendmoduleVerilog HDL的电路描述方式具有多样性,这也决定了电路设计的多样性。例4.1-2是对一个多路选择器的设计,程序(a)采用的是真值表的形式,程序(b)采用的是逻辑表达式的形式,程序(c)采用的是基本逻辑单元的结构性描述形式。,例4.1-2 用Verilog HDL设计数字多路选择器。(a) 采用真值表形式的代码:module MUX (out,data,sel);output out;input 3:0 data;input 1:0 sel;reg out;always (data or sel),case (sel) 2b00 : out=data0; 2b01 : out=data1; 2b10 : out=data2; 2b11 : out=data3; endcaseendmodule,(b) 采用逻辑表达式形式的代码:module MUX (out,data,sel);output out;input 3:0 data;input 1:0 sel;wire w1,w2,w3,w4;assign w1=(sel1),assign w3=sel1,input 3:0 data;input 1:0 sel;wire w1,w2,w3,w4,w5,w6;not U1 (w1,sel1);U2 (w2,sel0);and U3 (w3,w1,w2,data0);U4 (w4,w1,sel0,data1);U5 (w5,sel1,w2,data2);,U6 (w6,sel1,sel0,data3);or U7 (out,w3,w4,w5,w6);endmoduleVerilog HDL语言主要用于电路设计和验证,部分语言是为电路的测试和仿真制定的,因此其语言分为用于电路设计的可综合性语言和用于测试仿真的不可综合性语言。对于可综合性语言,EDA综合工具可以将其综合为物理电路,而对于其中的部分语言,EDA工具的综合性很差,设计人员往往得不到与设计思想相符合的物理电路。,正是由于Verilog HDL语言的特殊性,初学者往往很难把握可综合电路的设计方法,得不到最终期望的电路,这也是采用Verilog HDL进行设计所面对的一个困难。为了解决这一问题,降低Verilog HDL的设计门槛,EDA工具厂商正努力设计综合性工具,使综合性工具能够适应C语言程序设计思想,但这需要一个很长的过程。在现阶段,作为设计人员,熟练掌握Verilog HDL程序设计的多样性和可综合性是至关重要的。作为数字集成电路的基础,基本数字逻辑电路的设计是进行复杂电路设计的前提。,本章通过数字电路中基本逻辑电路的Verilog HDL程序设计进行讲述,要求读者掌握基本逻辑电路的可综合性设计,为具有特定功能的复杂电路的设计打下基础。逻辑电路可以分成两大类:一类是组合逻辑电路,简称组合电路;另一类是时序逻辑电路,简称时序电路。本章将分别从这两种电路的原理和Verilog HDL程序设计方法出发,对数字逻辑电路的基本功能电路进行设计,这也是复杂数字集成电路系统设计的基础。,组合电路的特点是,电路中任意时刻的稳态输出仅仅取决于该时刻的输入,而与电路原来的状态无关。组合电路没有记忆功能,只有从输入到输出的通路,没有从输出到输入的回路。,4.2 组合电路的设计,组合电路的设计需要从以下几个方面考虑:首先,所用的逻辑器件数目最少,器件的种类最少,且器件之间的连线最简单,这样的电路称为“最小化”电路。其次,为了满足速度要求,应使级数尽量少,以减少门电路的延迟;电路的功耗应尽可能地小,工作时稳定可靠。组合逻辑电路的描述方式有四种:真值表、逻辑代数、结构描述、抽象描述。采用Verilog HDL进行组合逻辑电路设计主要采用的就是这几种方式。下面结合具体的实例简单介绍达四种描述方式。,例4.2-1 设计一个3个裁判的表决电路,当两个或两个以上裁判同意时,判决器输出“1”,否则输出“0”。方法1:真值表方式。真值表是对电路功能最直接和简单的描述方式。根据电路的功能,可以通过真值表直接建立起输出与输入之间的逻辑关系。例4.2-1有三个输入端A、B、C和一个输出端OUT,其真值表如表4.2-1所示。,表4.2-1 例4.2-1真值表,在Verilog HDL中,可以使用case语句对电路进行描述性设计,表4.2-1的真值表设计代码如下:module design(OUT,A,B,C);output OUT;input A,B,C;reg OUT;always (A or B or C) case (A,B,C),3b000 : OUT=0; 3b001 : OUT=0; 3b010 : OUT=0; 3b100 : OUT=0; 3b011 : OUT=1; 3b101 : OUT=1; 3b110 : OUT=1; 3b111 : OUT=1;endcase endmodule,图4.2-1 真值表设计方式的电路结构,方法2:逻辑代数方式。组合电路的另一种表达方法是逻辑代数方式,其主要思想是将真值表用卡诺图来表示,然后化简电路,得出逻辑函数表达式。图4.2-2是例4.2-1的卡诺图。通过对卡诺图的化简,可以得到组合电路逻辑输出与输入之间的逻辑函数表达式:OUT=AB+BC+AC (4.2-1)根据逻辑函数表达式可以很方便地写出采用逻辑代数方式的Verilog HDL程序:module design(OUT,A,B,C);output OUT;input A,B,C;,图4.2-2 例4.2-1的卡诺图,assign OUT=(A endmodule方法3:结构描述方式。结构描述方式是对电路最直接的表示,早期的数字电路设计通常采用的原理图设计实际上就是一种结构描述方式。Verilog HDL同样可以采用结构描述方式对数字电路进行设计。图4.2-3是公式(4.2-1)表示的基本电路单元构成的电路结构。,图4.2-3 逻辑表达式4.2-1的电路结构,其Verilog HDL程序代码如下:module design(OUT,A,B,C);output OUT;input A,B,C;and U1 (w1,A,B);and U2 (w2,B,C);and U3 (w3,A,C);or U4 (OUT,w1,w2,w3); endmodule,方法4:抽象描述方式。除了以上3种方法,Verilog HDL还提供了以抽象描述方式进行电路设计的方法,可以直接从电路功能出发,编写代码。例如判决器设计,将三个输入的判决相加,当判决成功时相加器之和大于1,即表示投票成功。采用这种描述方式的Verilog HDL程序代码如下:module design(OUT,A,B,C);output OUT;input A,B,C;,wire 1:0 sum;reg OUT;assign sum=A+B+C;always (sum) if (sum1) OUT=1; else OUT=0;endmodule,可以看到,以上4种Verilog HDL描述方式都可以对表决电路进行设计。这里应该指出的是,Verilog HDL程序是对逻辑电路功能的描述性设计,并非最终得到的电路。EDA综合工具可以将Verilog HDL程序综合成物理电路形式,通过电路优化,从而得到符合设计要求的最简化电路。采用Synplify软件对上面4种方法中任一种方法设计的Verilog HDL程序进行综合(采用Altera公司的Stratix 器件),可以得到相同的最简化电路,如图4.2-4所示。,图4.2-4 例4.2-1综合优化后的电路,Verilog HDL语言对同一个电路有不同风格的描述,对于简单的电路,其各种描述之间的差异不大。但对于复杂的电路,不同风格的代码综合出的电路将会不同,生成电路的性能也会不同。因此Verilog HDL语言是与电路对应的,要求设计者在编写代码时对所设计电路应有清楚的认识,这需要平时大量的积累。下面以典型的组合电路为例,分别对Verilog HDL基本数字逻辑组合电路的设计方法进行说明。,4.2.1 数字加法器数字加法器是一种较为常用的逻辑运算器件,被广泛用于计算机、通信和多媒体数字集成电路中。广义的加法器包括加法器和减法器,在实际系统中加法器输入通常采用补码形式,因此就电路结构而言,加法和减法电路是一样的,只不过输入信号采用的是补码输入。例4.2-2 2输入1 bit信号全加器。如果运算考虑了来自低位的进位,那么该运算就为全加运算。实现全加运算的电路称为全加器。2输入1 bit信号全加器的真值表如表4.2-2所示。,表4.2-2 2输入1 bit信号全加器真值表,代数逻辑表示为SUM=ABC_IN (4.2-2) C_OUT=AB+(AB)C_IN (4.2-3)对应的电路如图4.2-5所示。,图4.2-5 2输入1 bit全加器电路,Verilog HDL可以用不同的描述方式写出1 bit全加器,其综合电路是相同的,仅仅是描述风格不同。在此给出两种不同的风格:利用连续赋值语句实现和利用行为描述方式实现。(1) 利用连续赋值语句实现。module one_bit_fulladder(SUM, C_OUT, A, B, C_IN);input A, B, C_IN;output SUM, C_OUT;assign SUM=(AB)C_IN;,assign C_OUT=(Aendmodule,采用行为描述方式可以提高设计的效率,对于一个典型的多位加法器的行为描述设计,仅需改变代码中输入和输出信号的位宽即可。例如一个2输入8 bit加法器,可以采用下面的Verilog HDL程序代码实现。module eight_bits_fulladder(SUM, C_OUT, A, B, C_IN);output7:0 SUM;output C_OUT;input 7:0A, B;input C_IN;,assign C_OUT,SUM=A+B+C_IN;endmodule,例4.2-3 4位超前进位加法器。超前进位加法器是一种高速加法器,每级进位由附加的组合电路产生,高位的运算不需等待低位运算完成,因此可以提高运算速度。对于输入信号位宽为N的全加器,其进位信号是C_OUT=CN (4.2-4)输出的加法结果是 SUM_OUTNn-1=Pn-1Cn-1 nN, 1 (4.2-5),超前进位标志信号是Cn=Gn-1+Pn-1Cn-1 nN, 1C0=C_IN (4.2-6)进位产生函数是Gn-1=An-1Bn-1 nN, 1 (4.2-7)进位传输函数是Pn-1=An-1Bn-1 n1, N (4.2-8)上述公式中N为加法器位数,在4位加法器中,N=4。由此可以推出各级进位信号表达式,并构成快速进位逻辑电路。,C1=G0+P0C0C2=G1+P1G0+P1P0C0C3=G2+P2G1+P2P1G0+P2P1P0C0C4=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0C0 (4.2-9)4位超前进位加法器的电路如图4.2-6所示。,图4.2-6 4位超前进位加法器的电路,4位超前进位加法器对应的Verilog HDL代码如下:module four_bits_fast_addder (sum_out,c_out,a,b,c_in);input 3:0 a,b; /加数,被加数input c_in; /来自前级的进位output 3:0sum_out; /和output c_out; /进位输出wire 4:0 g,p,c; /产生函数、传输函数和内部进位assign c0=c_in;,assign p=a|b;assign g=a,assign c_out=c4;endmodule,4.2.2 数据比较器数据比较器用来对两个二进制数的大小进行比较,或检测逻辑电路是否相等。数据比较器包含两部分功能:一是比较两个数的大小;二是检测两个数是否一致。例4.2-4 4位数值比较器。多位数值比较器的比较过程由高位到低位逐位进行,而且只有在高位相等时,才进行低位比较。4位数值比较器中进行A3A2A1A0和B3B2B1B0的比较时,首先比较最高位A3和B3。如果A3B3,那么不管其它几位数为何值,,结果均为AB;若A3B、CA=B、CAB、CA=B、CAB这三个扩展端口决定。4位数据比较器的真值表如表4.2-3所示。,表4.2-3 4位数据比较器真值表,用F2:0表示比较结果FAB,FA=B,FAB,CA=B,CAB,采用描述方式的Verilog HDL程序如下:module four_bits_comp1(F, A, B, C);parameter comp_width=4;output 2:0 F;input 2:0 C;input comp_width-1:0 A;input comp_width-1:0 B;reg 2:0 F;always (A or B or C),if (AB) F=3b100; else if (AB)F=3b001; else F=C;endmodule,4.2.3 数据选择器数据选择器又称多路选择器(Multiplexer,简称MUX),它有n位地址输入、2n位数据输入、1位数据输出。每次在输入地址的控制下,从多路输入数据中选择一路输出,其功能类似于一个单刀多掷开关,见图4.2-7。在ASIC和FPGA的器件库中,通常都有不同输入端口的多路选择器,可以利用这些选择器构成功能更加复杂的数据选择电路。,图4.2-7 数据选择器框图及等效开关,例4.2-5 8选1数据选择器。8选1数据选择器可以由多个2选1数据选择器构成,也可以采用抽象描述方式进行设计;可以采用2选1数据选择器串行连接,也可以用树形连接分成三级实现。(1) 多个2选1数据选择器的结构级描述(见图4.2-8)。module mux8to1_2(d_out, d_in, sel);output d_out;input 7:0 d_in;input 2:0 sel;,wire3:0 w1;wire1:0w2;assign w1=sel0? d_in7,d_in5,d_in3,d_in1 :d_in6,d_in4,d_in2,d_in0;assign w2=sel1? w13,w11 :w12,w10;assign d_out=sel2?w21:w20;endmodule,图4.2-8 树形连接的8选1数据选择器电路,(2) 抽象描述方式。多路选择器的设计可以采用case语句直接进行设计。在这种设计方式中,只需考虑选择信号列表就可以实现功能更为复杂的数据选择器。module mux8to1(out,sel,data_in);output out;input 7:0 data_in;input 3:0 sel;reg out;always (data_in or sel),case (sel) 3b000 : out=data_in0; 3b001 : out=data_in1; 3b010 : out=data_in2; 3b011 : out=data_in3; 3b100 : out=data_in4; 3b101 : out=data_in5; 3b110 : out=data_in6; 3b111 : out=data_in7; endcaseendmodule,4.2.4 数字编码器用文字、符号或数码表示特定对象的过程称为编码。在数字电路中用二进制代码表示有关的信号称为二进制编码。实现编码操作的电路叫做编码器。例4.2-6 3位二进制8线3线编码器。用n位二进制代码对N=2n个一般信号进行编码的电路,叫做二进制编码器。例如n=3,可以对8个一般信号进行编码。这种编码器的特点是:任何时刻只允许输入一个有效信号,不允许同时出现两个或两个以上的有效信号。,假设编码器规定高电平为有效电平,则在任何时刻只有一个输入端为高电平,其余输入端为低电平。同理,如果规定低电平为有效电平,则在任何时刻只有一个输入端为低电平,其余输入端为高电平。因而其输入是一组有约束(互相排斥)的变量。图4.2-9是3位二进制8线3线编码器框图,它的输入是I0I7,8个高电平有效信号,输出是3位二进制代码F2、F1、F0。输出与输入的对应关系如表4.2-4所示。,图4.2-9 3位二进制8线3线编码器框图,表4.2-4 3位二进制8线3线编码器真值表,采用抽象描述方式的Verilog HDL程序代码如下:module code_8to3(F,I);output 2:0 F;input 7:0 I;reg 2:0 F;always (I) case (I) 8b00000001: F=3b000; 8b00000010: F=3b001; 8b00000100: F=3b010;,8b00001000: F=3b011; 8b00010000: F=3b100; 8b00100000: F=3b101; 8b01000000: F=3b110; 8b10000000: F=3b111; default : F=3bx;endcaseendmodule,例4.2-7 8线3线优先编码器。二进制编码器电路要求任何时刻只有一个输入有效,若同时有两个或更多个输入信号有效,将造成输出混乱,因此在使用过程中有一定局限性。克服这种局限性的一种方法是采用优先编码器。优先编码器允许多个输入信号同时有效,但它只对其中优先级别最高的有效输入信号编码,对级别低的输入信号不予理睬。,优先编码器常用于优先中断系统和键盘编码。8线3线优先编码器的逻辑符号如图4.2-10所示,它有8个输入端,低电平为输入有效电平;3个输出端,低电平为输出有效电平。此外,为了便于电路的扩展和使用的灵活性,还设置有使能端、选通输出端和扩展端。8线3线优先编码器真值表见表4.2-5。,图4.2-10 8线3线优先编码器的逻辑符号,表4.2-5 8线3线优先编码器真值表,8线3线优先编码器的Verilog HDL程序代码如下:module mux8to3_p(data_out, Ys, Yex, sel, data_in);output 2:0 data_out;output Ys, Yex;input 7:0 data_in;input sel;reg 2:0 data_out;reg Ys,Yex;always (data_in or sel),if (sel) data_out, Ys, Yex =3b111,1b1,1b1; else begin casex (data_in) 8b0? : data_out, Ys, Yex =3b000,1b1,1b0; 8b10? : data_out, Ys, Yex =3b001,1b1,1b0; 8b110? : data_out, Ys, Yex,=3b010,1b1,1b0; 8b1110? : data_out, Ys, Yex=3b011,1b1,1b0; 8b11110? : data_out, Ys, Yex=3b100,1b1,1b0; 8b111110? : data_out, Ys, Yex=3b101,1b1,1b0; 8b1111110? : data_out, Ys, Yex=3b110,1b1,1b0; 8b11111110 : data_out, Ys,Yex=3b111,1b1,1b0; 8b11111111 : data_out, Ys, Yex=3b111,1b0,1b1; endcase endendmodule,例4.2-8 二进制转化十进制8421BCD编码器。将十进制数0、1、2、3、4、5、6、7、8、9这10个信号编成二进制代码的电路叫做二进制转化十进制编码器。其输入代表的是09这10个数字的状态信息,有效信号为1(即某信号为1时,则表示要对它进行编码),输出是相应的BCD码,因此也称10线4线编码器。它和二进制编码器一样,任何时刻只允许输入一个有效信号。式(4.2-10)为8421BCD编码器的逻辑表达式,对应的真值表见表4.2-6。,(4.2-10),表4.2-6 8421BCD编码器真值表,可以看到,对于这样一个规模的电路,可以用逻辑代数方式和结构描述方式进行电路设计,但是效率不高。通过对功能的抽象描述,在综合工具的帮助下,可以得到期望的电路。其Verilog HDL程序代码如下:module BCD8421(data_out, data_in);output 3:0 data_out;input 8:0 data_in;reg 3:0 data_out;always (data_in) case (data_in),9b000000000 : data_out=4b0000; 9b000000001 : data_out=4b0001; 9b000000010 : data_out=4b0010; 9b000000100 : data_out=4b0011; 9b000001000 : data_out=4b0100; 9b000010000 : data_out=4b0101; 9b000100000 : data_out=4b0110;,9b001000000 : data_out=4b0111; 9b010000000 : data_out=4b1000; 9b100000000 : data_out=4b1001; default : data_out=4b0000; endcase endmodule,例4.2-9 8421BCD十进制余3编码器。和8421BCD编码一样,余3码也是一种BCD编码,这种编码的特点是:用余3码作十进制加法运算时,若两数之和是10,正好等于二进制数的16,则从高位自动产生进位信号。因此可以使用余3码简化计算。在8421BCD码上加3就得到了余3码。表4.2-7是余3码的真值表与8421BCD码的对比,图4.2-11是8421BCD转余3编码器的逻辑符号及功能。,表4.2-7 余3码与8421BCD码的真值表对比,图4.2-11 8421BCD转余3编码器的逻辑符号及功能,和8421BCD编码器一样,余3码编码器也可以通过查找表的方式进行描述,仅需改变表4.2-6中真值表的内容即可。另外,也可以通过8421BCD码加“3”的方式得到,Verilog HDL 程序代码如下:module code_change(B_out,B_in);output 3:0 B_out;input 3:0 B_in;assign B_out=B_in+2b11;endmodule,4.2.5 数字译码器译码是编码的逆过程,它将二进制代码所表示的信息翻译成相应的状态信息。实现译码功能的电路称为译码器。这里只介绍二进制译码器。N位二进制译码器有N个输入端和2N个输出端,一般称为N线2N线译码器。常见的译码器有2线4线译码器、3线8线译码器和4线16线译码器。,图4.2-12 2线4线译码器的逻辑电路及逻辑符号,表4.2-8 2线4线译码器真值表,同编码器一样,译码器的级联扩展也可使用同样的方法,其Verilog HDL程序代码如下:module decode_2to4(Y, E, A);output 3:0 Y;input 1:0 A;input E;assign Y0=(E,assign Y2=(E,always (E or A)case (E,A) 3b1? : Y=4b0000; 3b000 : Y=4b0001; 3b001 : Y=4b0010; 3b010 : Y=4b0100; 3b011 : Y=4b1000; default : Y=4b0000;endcase endmodule,采用抽象描述方式的优势是不需要对电路化简,根据相对固定的设计模式,可以直接得到所需要的电路。,4.2.6 奇偶校验器奇偶校验器的功能是检测数据中所含“1”的个数是奇数还是偶数。在计算机和一些数字通信系统中,常用奇偶校验器来检查数据传输和数码记录中是否存在错误。奇偶校验包含两种方式:奇校验和偶校验。奇校验保证传输数据和校验位中“1”的总数为奇数。如果数据中包含奇数个“1”,则校验位置“0”;如果数据中包含偶数个“1”,则校验位置“1”。例如,需要传输1100111,数据中包含5个“1”,采用奇校验,校验位为“0”,将“11001110”传输给接收机。,偶校验保证传输数据和校验位中“1”的总数为偶数。如果数据中包含奇数个“1”,则校验位置“1”,如果数据中包含偶数个“1”,则校验位置“0”。例如:要传输1100111,数据中包含5个“1”,采用偶校验,校验位为“1”,将“11001111”传输给接收机。奇偶校验只能检测部分传输错误,它不能确定错误发生在哪位或哪几位,所以不能进行错误校正。当数据发生错误时只能重新发送数据。,奇偶校验一般用在能够重新操作的计算机硬件中,例如:SCSI总线和微处理器中的高速缓存,在发生错误时,这些部件可以丢掉数据,获取重发数据。例4.2-10 8 bit奇偶校验器。8 bit奇偶校验器的原理图如图4.2-13所示。,图4.2-13 8 bit奇偶校验器的原理图,图4.2-13中,校验器的输入b0b7由7 bit数据和1 bit校验位组成。Fod为判奇输出,Fev为判偶输出。当采用奇校验时,Fod=1,Fev=0;当采用偶校验时,Fod=0,Fev=1。输出表达式为 (4.2-11),例如:采用奇校验检测“1100111”,数据包含5个“1”,校验位为“0”,校验器的输入b0b7为“11001110”,Fod=1,Fev=0。在Verilog HDL中,可以采用结构描述方式也可以采用抽象描述方式。,(a) 结构描述方式:module checker (Fod,Fev,b);output Fod,Fev;input 7:0 b;wire w1,w2,w3,w4,w5,w6;xor U1 (w1,b0,b1);xor U2 (w2,b2,b3);xor U3 (w3,b4,b5);xor U4 (w4,b6,b7);,xor U5 (w5,w1,w2);xor U6 (w6,w3,w4);xor U7 (Fod,w5,w6);not U8 (Fev,Fod);endmodule(b) 抽象描述方式:module checker (Fod,Fev,b);output Fod,Fev;,input 7:0 b;assign Fod=b;assign Fev=Fod;endmodule,与组合逻辑电路不同,时序逻辑电路的输出不仅与当前时刻输入变量的取值有关,而且与电路的原状态(即过去的输入情况有关)。,4.3 时序电路的设计,图4.3-1是时序逻辑电路的结构框图。与组合逻辑电路相比,时序逻辑电路有两个特点:第一,时序逻辑电路包括组合逻辑电路和存储电路两部分,存储电路具有记忆功能,通常由触发器组成;第二,存储电路的状态反馈到组合逻辑电路输入端,与外部输入信号共同决定组合逻辑电路的输出。组合逻辑电路的输出除包括外部输出外,还包含连接到存储电路的内部输出,它将控制存储电路状态的转移。,图4.3-1中,X(x1,x2,xn)是外部输入信号;Q(q1,q2,qj)是存储电路的状态输出,也是组合逻辑电路的内部输入;Z(z1,z2,zm)为外部输出信号;Y(y1,y2,yk)为存储电路的激励信号,也是组合逻辑电路的内部输出。在存储电路中,每一位输出qi(i=1,2,j)称为一个状态变量,j个状态变量可以组成2j个不同的内部状态。时序逻辑电路对于输入变量历史情况的记忆反映在状态变量的不同取值上,即不同的内部状态代表不同的输入变量的历史情况。,以上四组信号之间的逻辑关系可用以下三个方程组来描述: (4.3-1) (4.3-2),(4.3-3),(4.3-4) (4.3-5) (4.3-6),时序逻辑电路某时刻的输出Zn决定于该时刻的外部输入Xn和Qn。时序逻辑电路的工作过程实质上就是不同输入条件下内部状态不断更新的过程。时序逻辑电路按状态变化的特点,可分为同步时序逻辑电路和异步时序逻辑电路。在同步时序逻辑电路中,电路状态的变化在同一时钟脉冲作用下发生,即各触发器状态的转换同步完成。在异步时序逻辑电路中,没有统一的时钟脉冲信号,即各触发器状态的转换是异步完成的。目前大多数数字电路是同步时序逻辑电路,本书所举例程都集中在同步时序逻辑电路上。,传统的时序逻辑电路的设计就是根据逻辑设计命题的要求,选择适当的器件,设计出合理的逻辑电路。Verilog HDL语言对于时序逻辑电路的描述性设计与传统的电路设计紧密相关。同步时序逻辑电路的一般设计过程可以按图4.3-2所示的步骤进行。对时序逻辑电路功能的描述方式主要有三种:逻辑方程,状态转移表和状态转移图,时序图。同组合逻辑电路相似,采用Verilog HDL对时序逻辑电路的设计进行描述也有不同的方式,归纳起来主要有三种:状态转移图描述,基于状态化简的结构性描述,Verilog HDL抽象描述。,图4.3-2 同步时序逻辑电路设计流程,下面结合具体的实例简单介绍三种不同的描述方式。例4.3-1 用Verilog HDL设计一个“111”序列检测器,当输入三个或三个以上的“1”时,电路输出为1,否则为0。(1) 状态转移图描述方式。首先确定电路的输入变量和输出变量。该电路仅有一个输入端和一个输出端,设输入变量为X,代表输入序列;输出变量为Z,表示检测结果。可以得到的状态转移图如图4.3-3所示。,图4.3-3 “111”序列检测器的状态转移图,因此设计时需要定义四种电路状态,设置如下:s0初始状态,表示电路还未收到一个有效的1。s1表示电路收到了一个1。s2表示电路收到了连续的两个1。s3表示电路收到了连续的三个1。根据状态转移图,Verilog HDL程序代码如下:module checker(Z,X,clk);parameter s0=2b00,s1=2b01,s2=2b11,s3=2b10;,output Z;input X,clk;reg 1:0 state,next_state;reg Z;always (posedge clk) case (state) s0 : if (X) begin next_state=s1; Z=0;,end else begin next_state=s0; Z=0; end s1 : if (X) begin next_state=s2; Z=0; end else,begin next_state=s0; Z=0; end s2 : if (X) begin next_state=s3; Z=1; end else begin next_state=s0; Z=0;,end s3 : if (X) begin next_state=s3; Z=1; end else begin next_state=s0; Z=0; end endcase,always (posedge clk) state=next_state; endmodule用状态转移图描述电路时,不需要考虑电路的具体结构,只需了解电路的功能,掌握电路的工作流程即可,然后划分状态,分配寄存器,但是在状态划分后并没有对状态进行化简。因此,状态转移图不一定是最简单的电路形式。用综合工具对上面的代码进行综合,可以得到如图4.3-4所示的电路。,(2) 基于状态化简的结构性描述方式。对图4.3-3所示的状态转移图进行化简,仅剩三个状态,需要用两位二进制数表示,即需要两个D触发器储存状态。设Q1表示高位寄存器的输出,Q0表示低位寄存器的输出。将状态的跳转以及输出Z用卡诺图的形式示出,如图4.3-5所示。,图4.3-4 用综合工具综合后的电路,图4.3-5 和及输出Z的卡诺图,由卡诺图可以得出电路的输出方程和状态方程:=Q0 (4.3-7)=X (4.3-8)Z=Q1Q0X (4.3-9)根据化简的状态方程,Verilog HDL程序代码如下:/序列检测器模块module checker (Z,X,clk);,output Z;input X,clk;wire