1、1第4章 Verilog HDL数字逻辑电路设计方法 4.1 Verilog HDL语言的设计思想和可综合特性 4.2 组合电路的设计 4.3 时序电路的设计 4.4 有限同步状态机 本章小结2在数字集成电路设计过程中,设计者使用Verilog HDL硬件描述语言进行关键性步骤的开发和设计。其基本过程是,首先使用Verilog HDL对硬件电路进行描述性设计,利用EDA综合工具将其综合成一个物理电路,然后进行功能验证、定时验证和故障覆盖验证。4.1 Verilog HDL语言的设计思想语言的设计思想和可综合特性和可综合特性3与计算机软件所采用的高级程序语言(C语言)类似,Verilog HDL
2、是一种高级程序设计语言,程序编写较简单,设计效率很高。然而,它们面向的对象和设计思想却完全不同。软件高级程序语句是对通用型处理器(如CPU)的编程,主要是在固定硬件体系结构下的软件化程序设计。处理器的体系结构和功能决定了可以用于编程的固定指令集,设计人员的工作是调用这些指令,在固化的体系结构下实现特定的功能。4Verilog HDL和VHDL等硬件描述语言对电路的设计是将基本的最小数字电路单元(如门单元、寄存器、存储器等)通过连接方式,构成具有特定功能的硬件电路。在数字集成电路中,这种最小的单元是工艺厂商提供的设计标准库或定制单元;在FPGA中,这种最小的单元是芯片内部已经布局的基本逻辑单元。
3、设计人员通过描述性语言调用和组合这些基本单元实现特定的功能,其基本的电路是灵活的。5Verilog HDL给设计者提供了几种描述电路的方法。设计者可以使用结构性描述方式把逻辑单元互连在一起进行电路设计,也可以采用抽象性描述方式对大规模复杂电路进行设计,如对有限状态机、数字滤波器、总线和接口电路的描述等。由于硬件电路的设计目标是最终产生的电路,因此Verilog HDL程序设计的正确性需要通过对综合后电路的正确性进行验证来实现。逻辑上相同的电路在物理电路中的形式却有可能完全不同。对于Verilog HDL程序设计而言,数字电路的描述性设计具有一定的设计模式,这与C语言等高级软件程序设计是不同的。
4、6例4.1-1是对模256(8 bit)计数器的两种描述。程序(a)是通常的Verilog HDL语言对计数器的描述方式,通过改变计数器状态寄存器组的位宽和进位条件,可以实现对不同计数器的硬件电路设计。程序(b)是初学者经常出现的一种错误描述方式,刚开始编写Verilog HDL程序时经常会套用C语言等高级程序设计的模式,这样往往得不到目标数字电路的功能。7例4.1-1 用Verilog HDL语言设计模256(8 bit)计数器。(a)可综合程序描述方式:module counter(count,clk,reset);output count;input clk,reset;reg 7:0
5、count;reg out;always(posedge clk)8 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;9reg 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)10cou
6、nt=count+1;endendmoduleVerilog HDL的电路描述方式具有多样性,这也决定了电路设计的多样性。例4.1-2是对一个多路选择器的设计,程序(a)采用的是真值表的形式,程序(b)采用的是逻辑表达式的形式,程序(c)采用的是基本逻辑单元的结构性描述形式。11例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)12 case(sel)2b00:out=data
7、0;2b01:out=data1;2b10:out=data2;2b11:out=data3;endcaseendmodule13(b)采用逻辑表达式形式的代码:module MUX(out,data,sel);output out;input 3:0 data;input 1:0 sel;wire w1,w2,w3,w4;assign w1=(sel1)&(sel0)&data0;assign w2=(sel1)&sel0&data1;14assign w3=sel1&(sel0)&data2;assign w4=sel1&sel0&data3;assign out=w1|w2|w3|w4;
8、endmodule(c)采用结构性描述的代码:module MUX(out,data,sel);output out;15input 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);16U6(w6,sel1,sel0,data3);or U7(out,w3,w4,w5,w6);endmoduleVerilog HDL语言主要用于电路设计和验证,部分语言是为电路的测试和
9、仿真制定的,因此其语言分为用于电路设计的可综合性语言和用于测试仿真的不可综合性语言。对于可综合性语言,EDA综合工具可以将其综合为物理电路,而对于其中的部分语言,EDA工具的综合性很差,设计人员往往得不到与设计思想相符合的物理电路。17正是由于Verilog HDL语言的特殊性,初学者往往很难把握可综合电路的设计方法,得不到最终期望的电路,这也是采用Verilog HDL进行设计所面对的一个困难。为了解决这一问题,降低Verilog HDL的设计门槛,EDA工具厂商正努力设计综合性工具,使综合性工具能够适应C语言程序设计思想,但这需要一个很长的过程。在现阶段,作为设计人员,熟练掌握Verilo
10、g HDL程序设计的多样性和可综合性是至关重要的。作为数字集成电路的基础,基本数字逻辑电路的设计是进行复杂电路设计的前提。18本章通过数字电路中基本逻辑电路的Verilog HDL程序设计进行讲述,要求读者掌握基本逻辑电路的可综合性设计,为具有特定功能的复杂电路的设计打下基础。逻辑电路可以分成两大类:一类是组合逻辑电路,简称组合电路;另一类是时序逻辑电路,简称时序电路。本章将分别从这两种电路的原理和Verilog HDL程序设计方法出发,对数字逻辑电路的基本功能电路进行设计,这也是复杂数字集成电路系统设计的基础。19组合电路的特点是,电路中任意时刻的稳态输出仅仅取决于该时刻的输入,而与电路原来
11、的状态无关。组合电路没有记忆功能,只有从输入到输出的通路,没有从输出到输入的回路。4.2 组合电路的设计组合电路的设计20组合电路的设计需要从以下几个方面考虑:首先,所用的逻辑器件数目最少,器件的种类最少,且器件之间的连线最简单,这样的电路称为“最小化”电路。其次,为了满足速度要求,应使级数尽量少,以减少门电路的延迟;电路的功耗应尽可能地小,工作时稳定可靠。组合逻辑电路的描述方式有四种:真值表、逻辑代数、结构描述、抽象描述。采用Verilog HDL进行组合逻辑电路设计主要采用的就是这几种方式。下面结合具体的实例简单介绍达四种描述方式。21例4.2-1 设计一个3个裁判的表决电路,当两个或两个
12、以上裁判同意时,判决器输出“1”,否则输出“0”。方法1:真值表方式。真值表是对电路功能最直接和简单的描述方式。根据电路的功能,可以通过真值表直接建立起输出与输入之间的逻辑关系。例4.2-1有三个输入端A、B、C和一个输出端OUT,其真值表如表4.2-1所示。22表4.2-1 例4.2-1真值表23在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)24 3b000:OUT
13、=0;3b001:OUT=0;3b010:OUT=0;3b100:OUT=0;3b011:OUT=1;3b101:OUT=1;3b110:OUT=1;3b111:OUT1)OUT=1;else OUT=0;endmodule33可以看到,以上4种Verilog HDL描述方式都可以对表决电路进行设计。这里应该指出的是,Verilog HDL程序是对逻辑电路功能的描述性设计,并非最终得到的电路。EDA综合工具可以将Verilog HDL程序综合成物理电路形式,通过电路优化,从而得到符合设计要求的最简化电路。采用Synplify软件对上面4种方法中任一种方法设计的Verilog HDL程序进行综合
14、(采用Altera公司的Stratix 器件),可以得到相同的最简化电路,如图4.2-4所示。34图4.2-4 例4.2-1综合优化后的电路35Verilog HDL语言对同一个电路有不同风格的描述,对于简单的电路,其各种描述之间的差异不大。但对于复杂的电路,不同风格的代码综合出的电路将会不同,生成电路的性能也会不同。因此Verilog HDL语言是与电路对应的,要求设计者在编写代码时对所设计电路应有清楚的认识,这需要平时大量的积累。下面以典型的组合电路为例,分别对Verilog HDL基本数字逻辑组合电路的设计方法进行说明。364.2.1 数字加法器数字加法器数字加法器是一种较为常用的逻辑运
15、算器件,被广泛用于计算机、通信和多媒体数字集成电路中。广义的加法器包括加法器和减法器,在实际系统中加法器输入通常采用补码形式,因此就电路结构而言,加法和减法电路是一样的,只不过输入信号采用的是补码输入。例4.2-2 2输入1 bit信号全加器。如果运算考虑了来自低位的进位,那么该运算就为全加运算。实现全加运算的电路称为全加器。2输入1 bit信号全加器的真值表如表4.2-2所示。37表4.2-2 2输入1 bit信号全加器真值表38代数逻辑表示为SUM=A B C_IN (4.2-2)C_OUT=AB+(A B)C_IN (4.2-3)对应的电路如图4.2-5所示。39图4.2-5 2输入1
16、bit全加器电路40Verilog 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;41assign C_OUT=(A&B)|(AB)&C_IN);/全加器的输出endmodule(2)利用行为描述方式实现。module one_bit_fulladder(SUM,C_
17、OUT,A,B,C_IN);output SUM,C_OUT;input A,B,C_IN;assign C_OUT,SUM=A+B+C_IN;endmodule42采用行为描述方式可以提高设计的效率,对于一个典型的多位加法器的行为描述设计,仅需改变代码中输入和输出信号的位宽即可。例如一个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;43assign C_OUT,SUM=
18、A+B+C_IN;endmodule44例4.2-3 4位超前进位加法器。超前进位加法器是一种高速加法器,每级进位由附加的组合电路产生,高位的运算不需等待低位运算完成,因此可以提高运算速度。对于输入信号位宽为N的全加器,其进位信号是C_OUT=CN (4.2-4)输出的加法结果是 SUM_OUTNn-1=Pn-1 Cn-1 nN,1 (4.2-5)45超前进位标志信号是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-1 Bn-1 n1,N (4.2-8)上述公式中N为加法器位
19、数,在4位加法器中,N=4。由此可以推出各级进位信号表达式,并构成快速进位逻辑电路。46C1=G0+P0C0C2=G1+P1G0+P1P0C0C3=G2+P2G1+P2P1G0+P2P1P0C0C4=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0C0 (4.2-9)4位超前进位加法器的电路如图4.2-6所示。47图4.2-6 4位超前进位加法器的电路484位超前进位加法器对应的Verilog HDL代码如下:module four_bits_fast_addder(sum_out,c_out,a,b,c_in);input 3:0 a,b;/加数,被加数input c_in;
20、/来自前级的进位output 3:0sum_out;/和output c_out;/进位输出wire 4:0 g,p,c;/产生函数、传输函数和内部进位assign c0=c_in;49assign p=a|b;assign g=a&b;assign c1=g0|(p0&c0);assign c2=g1|(p1&(g0|(p0&c0);assign c3=g2|(p2&(g1|(p1&(g0|(p0&c0);assign c4=g3|(p3&(g2|(p2&(g1|(p1&(g0|(p0&c0);assign sum_out=pc3:0;50assign c_out=c4;endmodule5
21、14.2.2 数据比较器数据比较器数据比较器用来对两个二进制数的大小进行比较,或检测逻辑电路是否相等。数据比较器包含两部分功能:一是比较两个数的大小;二是检测两个数是否一致。例4.2-4 4位数值比较器。多位数值比较器的比较过程由高位到低位逐位进行,而且只有在高位相等时,才进行低位比较。4位数值比较器中进行A3A2A1A0和B3B2B1B0的比较时,首先比较最高位A3和B3。如果A3B3,那么不管其它几位数为何值,52结果均为AB;若A3B3,结果为AB、CA=B、CAB、CA=B、CAB,FA=B,FAB,CA=B,CAB)F=3b100;else if(AB)F=3b001;else F=
22、C;endmodule564.2.3 数据选择器数据选择器数据选择器又称多路选择器(Multiplexer,简称MUX),它有n位地址输入、2n位数据输入、1位数据输出。每次在输入地址的控制下,从多路输入数据中选择一路输出,其功能类似于一个单刀多掷开关,见图4.2-7。在ASIC和FPGA的器件库中,通常都有不同输入端口的多路选择器,可以利用这些选择器构成功能更加复杂的数据选择电路。57图4.2-7 数据选择器框图及等效开关58例4.2-5 8选1数据选择器。8选1数据选择器可以由多个2选1数据选择器构成,也可以采用抽象描述方式进行设计;可以采用2选1数据选择器串行连接,也可以用树形连接分成三
23、级实现。(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;59wire3: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;endmodule60图4.2-8 树形连接的8选1数据选择器电路61(2)抽象描述方式。多路选择
24、器的设计可以采用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)62 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=
25、data_in6;3b111:out=data_in7;endcaseendmodule634.2.4 数字编码器数字编码器用文字、符号或数码表示特定对象的过程称为编码。在数字电路中用二进制代码表示有关的信号称为二进制编码。实现编码操作的电路叫做编码器。例4.2-6 3位二进制8线3线编码器。用n位二进制代码对N=2n个一般信号进行编码的电路,叫做二进制编码器。例如n=3,可以对8个一般信号进行编码。这种编码器的特点是:任何时刻只允许输入一个有效信号,不允许同时出现两个或两个以上的有效信号。64假设编码器规定高电平为有效电平,则在任何时刻只有一个输入端为高电平,其余输入端为低电平。同理,如果规
26、定低电平为有效电平,则在任何时刻只有一个输入端为低电平,其余输入端为高电平。因而其输入是一组有约束(互相排斥)的变量。图4.2-9是3位二进制8线3线编码器框图,它的输入是I0I7,8个高电平有效信号,输出是3位二进制代码F2、F1、F0。输出与输入的对应关系如表4.2-4所示。65图4.2-9 3位二进制8线3线编码器框图66表4.2-4 3位二进制8线3线编码器真值表67采用抽象描述方式的Verilog HDL程序代码如下:module code_8to3(F,I);output 2:0 F;input 7:0 I;reg 2:0 F;always (I)case(I)8b00000001
27、:F=3b000;8b00000010:F=3b001;8b00000100:F=3b010;68 8b00001000:F=3b011;8b00010000:F=3b100;8b00100000:F=3b101;8b01000000:F=3b110;8b10000000:F=3b111;default:F=3bx;endcaseendmodule69例4.2-7 8线3线优先编码器。二进制编码器电路要求任何时刻只有一个输入有效,若同时有两个或更多个输入信号有效,将造成输出混乱,因此在使用过程中有一定局限性。克服这种局限性的一种方法是采用优先编码器。优先编码器允许多个输入信号同时有效,但它只对
28、其中优先级别最高的有效输入信号编码,对级别低的输入信号不予理睬。70优先编码器常用于优先中断系统和键盘编码。8线3线优先编码器的逻辑符号如图4.2-10所示,它有8个输入端,低电平为输入有效电平;3个输出端,低电平为输出有效电平。此外,为了便于电路的扩展和使用的灵活性,还设置有使能端、选通输出端和扩展端。8线3线优先编码器真值表见表4.2-5。71图4.2-10 8线3线优先编码器的逻辑符号72表4.2-5 8线3线优先编码器真值表73功能表说明:S=1 时,电路处于禁止工作状态,此时无论 8 个输入为何种状态,3 个输出端均为高电平,sY和exY也为高电平,编码器不工作。当S=0 时,电路处
29、于正常工作状态,允许0I7I当中同时几个输入端为低电平,即同时有几路编码输入信号有效。在 8 个输入端中,7I的优先权最高,0I的优先权最低。当7I=0 时,无论其它输入端有否有效输入信号(功能表中以 x表示),输出端只输出7I的编码,即012YYY=000;74当7I=1,6I=0 时,无论其余输入端有否有效输入信号,只对6I进行编码,输出为012YYY=001,其余状态依次类推。表中出现的 3 种输出012YYY=111的情况可以用sY和exY的不同状态来区别,即如果012YYY=111 且sYexY=10,则表示电路处于工作状态而且0I有编码信号输入;如果012YYY=111 且sYex
30、Y=01,则表示电路处于工作状态但没有输入编码信号。由于没有输入编码信号时sY=0,因此sY也可以称为“无编码输入信号”。758线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)76 if(sel)data_out,Ys,Yex=3b111,1b1,1b1;else begin
31、 casex(data_in)8b0?:data_out,Ys,Yex=3b000,1b1,1b0;8b10?:data_out,Ys,Yex=3b001,1b1,1b0;8b110?:data_out,Ys,Yex 77=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_
32、out,Ys,78Yex=3b111,1b1,1b0;8b11111111:data_out,Ys,Yex=3b111,1b0,1b1;endcase endendmodule79例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编码器的逻辑表达式,对应的真
33、值表见表4.2-6。80(4.2-10)975319753176327632765476549898YYYYYYYYYYAYYYYYYYYBYYYYYYYYCYYYYD81表4.2-6 8421BCD编码器真值表82可以看到,对于这样一个规模的电路,可以用逻辑代数方式和结构描述方式进行电路设计,但是效率不高。通过对功能的抽象描述,在综合工具的帮助下,可以得到期望的电路。其Verilog HDL程序代码如下:module BCD8421(data_out,data_in);output 3:0 data_out;input 8:0 data_in;reg 3:0 data_out;always
34、(data_in)case(data_in)83 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;84 9b001000000:data_out=4b0111;9b010000000:data_out=4b1000;9b100000000:data_out
35、=4b1001;default :data_out=4b0000;endcase endmodule85例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编码器的逻辑符号及功能。86表4.2-7 余3码与8421BCD码的真值表对比87图4.2-11 8421BCD转余3编码器的
36、逻辑符号及功能88和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;endmodule894.2.5 数字译码器数字译码器译码是编码的逆过程,它将二进制代码所表示的信息翻译成相应的状态信息。实现译码功能的电路称为译码器。这里只介绍二进制译码器。N位二进制译码器有N个输入端和2
37、N个输出端,一般称为N线2N线译码器。常见的译码器有2线4线译码器、3线8线译码器和4线16线译码器。90图 4.2-12 为 2 线4 线译码器的逻辑电路及逻辑符号,其真值表如表 4.2-8 所示。图中,A1、A0为地址输入端,A1为高位。0Y、1Y、2Y、3Y为状态信号输出端,非号表示低电平有效。E 为使能端(或称选通控制端),低电平有效。当 E=0 时,允许译码器工作,0Y3Y中只允许一个为有效电平输出;当 E=1 时,禁止译码器工作,所有输出0Y3Y均为高电平。一般使能端有两个用途:一是引入选通脉冲,以抑制冒险脉冲的发生;二是用来扩展输入的变量数(功能扩展)。91图4.2-12 2线4
38、线译码器的逻辑电路及逻辑符号92表4.2-8 2线4线译码器真值表93从表中可以看出,当 E=0 时,2 线4 线译码器的输出函数分别为0Y=01AA,1Y=01AA,2Y=01AA,3Y=01AA,如果用iY表示 i 端的输出,mi表示输入地址变量 A1、A0的一个最小项,则输出函数可写成iY=imE(i=0,1,2,3)。可见,译码器的每一个输出函数对应输入变量的一组取值,当使能端有效(E=0)时,它正好是输入变量最小项的非。因此变量译码器也称最小项发生器。94同编码器一样,译码器的级联扩展也可使用同样的方法,其Verilog HDL程序代码如下:module decode_2to4(Y,
39、E,A);output 3:0 Y;input 1:0 A;input E;assign Y0=(E&A1&A0);assign Y1=(E&A1&A0);95assign Y2=(E&A1&A0);assign Y3=(E&A1&A0);endmodule也可以采用抽象描述方式进行设计,其Verilog HDL程序代码如下:module decode_2to4(Y,E,A);output 3:0 Y;input 1:0 A;input E;reg 3:0 Y;96always(E or A)case(E,A)3b1?:Y=4b0000;3b000:Y=4b0001;3b001:Y=4b001
40、0;3b010:Y=4b0100;3b011:Y=4b1000;default :Y=4b0000;endcase endmodule97采用抽象描述方式的优势是不需要对电路化简,根据相对固定的设计模式,可以直接得到所需要的电路。984.2.6 奇偶校验器奇偶校验器奇偶校验器的功能是检测数据中所含“1”的个数是奇数还是偶数。在计算机和一些数字通信系统中,常用奇偶校验器来检查数据传输和数码记录中是否存在错误。奇偶校验包含两种方式:奇校验和偶校验。奇校验保证传输数据和校验位中“1”的总数为奇数。如果数据中包含奇数个“1”,则校验位置“0”;如果数据中包含偶数个“1”,则校验位置“1”。例如,需要传
41、输1100111,数据中包含5个“1”,采用奇校验,校验位为“0”,将“11001110”传输给接收机。99偶校验保证传输数据和校验位中“1”的总数为偶数。如果数据中包含奇数个“1”,则校验位置“1”,如果数据中包含偶数个“1”,则校验位置“0”。例如:要传输1100111,数据中包含5个“1”,采用偶校验,校验位为“1”,将“11001111”传输给接收机。奇偶校验只能检测部分传输错误,它不能确定错误发生在哪位或哪几位,所以不能进行错误校正。当数据发生错误时只能重新发送数据。100奇偶校验一般用在能够重新操作的计算机硬件中,例如:SCSI总线和微处理器中的高速缓存,在发生错误时,这些部件可以
42、丢掉数据,获取重发数据。例4.2-10 8 bit奇偶校验器。8 bit奇偶校验器的原理图如图4.2-13所示。101图4.2-13 8 bit奇偶校验器的原理图102图4.2-13中,校验器的输入b0b7由7 bit数据和1 bit校验位组成。Fod为判奇输出,Fev为判偶输出。当采用奇校验时,Fod=1,Fev=0;当采用偶校验时,Fod=0,Fev=1。输出表达式为 (4.2-11)76543210ev76543210odbbbbbbbbFbbbbbbbbF103例如:采用奇校验检测“1100111”,数据包含5个“1”,校验位为“0”,校验器的输入b0b7为“11001110”,Fod
43、=1,Fev=0。在Verilog HDL中,可以采用结构描述方式也可以采用抽象描述方式。104(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);105xor U5(w5,w1,w2);xor U6(w6,w3,w4);xor U7(Fod,w5,w6);not U8(Fev,Fod);endmodule(b)抽象描述方式:module c
44、hecker(Fod,Fev,b);output Fod,Fev;106input 7:0 b;assign Fod=b;assign Fev=Fod;endmodule107与组合逻辑电路不同,时序逻辑电路的输出不仅与当前时刻输入变量的取值有关,而且与电路的原状态(即过去的输入情况有关)。4.3 时序电路的设计时序电路的设计108图4.3-1是时序逻辑电路的结构框图。与组合逻辑电路相比,时序逻辑电路有两个特点:第一,时序逻辑电路包括组合逻辑电路和存储电路两部分,存储电路具有记忆功能,通常由触发器组成;第二,存储电路的状态反馈到组合逻辑电路输入端,与外部输入信号共同决定组合逻辑电路的输出。组合
45、逻辑电路的输出除包括外部输出外,还包含连接到存储电路的内部输出,它将控制存储电路状态的转移。109110图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个不同的内部状态。时序逻辑电路对于输入变量历史情况的记忆反映在状态变量的不同取值上,即不同的内部状态代表不同的输入变量的历史情况。111以上四组信号之间的逻辑关系可用以下三
46、个方程组来描述:(4.3-1)(4.3-2)q .,q ,q ,x.,x,(xfz )q ,.,q ,q ,x.,x,(xfz)q .,q ,q ,x.,x,(xfznjn2n1nnn2n1mnmnjn2n1nnn2n12n2njn2n1nnn2n11n1)q .,q ,q ,x.,x,(xgy )q ,.,q ,q ,x.,x,(xgy)q .,q ,q ,x.,x,(xgynjn2n1nnn2n1knknjn2n1nnn2n12n2njn2n1nnn2n11n1112 (4.3-3)q .,q ,q ,y .,y ,(yhq )q .,q ,q ,y .,y ,(yhq)q .,q ,q
47、,y .,y ,(yhqnjn2n1nnn2n1j1njnjn2n1nnn2n121n2njn2n1nnn2n111n1113式(4.3-1)是输出方程,式(4.3-2)是驱动方程(或称为激励方程),式(4.3-3)是状态方程。方程中的上标n和n+1表示相邻的两个离散时间(或称为相邻的两个节拍),如n1q,n2q,njq表示存储电路中每个触发器的当前状态(也称为现状态或原状态),1n1q,1n2q,1njq表示存储电路中每个触发器的新状态(也称为下一状态或次状态)。以上三个方程组可写成如下形式:114 (4.3-4)(4.3-5)(4.3-6)Q,F(XZnnn)Q,G(XYnnn)Q,H(Y
48、Qnn1n115时序逻辑电路某时刻的输出Zn决定于该时刻的外部输入Xn和Qn。时序逻辑电路的工作过程实质上就是不同输入条件下内部状态不断更新的过程。时序逻辑电路按状态变化的特点,可分为同步时序逻辑电路和异步时序逻辑电路。在同步时序逻辑电路中,电路状态的变化在同一时钟脉冲作用下发生,即各触发器状态的转换同步完成。在异步时序逻辑电路中,没有统一的时钟脉冲信号,即各触发器状态的转换是异步完成的。目前大多数数字电路是同步时序逻辑电路,本书所举例程都集中在同步时序逻辑电路上。116传统的时序逻辑电路的设计就是根据逻辑设计命题的要求,选择适当的器件,设计出合理的逻辑电路。Verilog HDL语言对于时序
49、逻辑电路的描述性设计与传统的电路设计紧密相关。同步时序逻辑电路的一般设计过程可以按图4.3-2所示的步骤进行。对时序逻辑电路功能的描述方式主要有三种:逻辑方程,状态转移表和状态转移图,时序图。同组合逻辑电路相似,采用Verilog HDL对时序逻辑电路的设计进行描述也有不同的方式,归纳起来主要有三种:状态转移图描述,基于状态化简的结构性描述,Verilog HDL抽象描述。117图4.3-2 同步时序逻辑电路设计流程118下面结合具体的实例简单介绍三种不同的描述方式。例4.3-1 用Verilog HDL设计一个“111”序列检测器,当输入三个或三个以上的“1”时,电路输出为1,否则为0。(1
50、)状态转移图描述方式。首先确定电路的输入变量和输出变量。该电路仅有一个输入端和一个输出端,设输入变量为X,代表输入序列;输出变量为Z,表示检测结果。可以得到的状态转移图如图4.3-3所示。119 图4.3-3 “111”序列检测器的状态转移图120因此设计时需要定义四种电路状态,设置如下:s0初始状态,表示电路还未收到一个有效的1。s1表示电路收到了一个1。s2表示电路收到了连续的两个1。s3表示电路收到了连续的三个1。根据状态转移图,Verilog HDL程序代码如下:module checker(Z,X,clk);parameter s0=2b00,s1=2b01,s2=2b11,s3=2