《Verilog HDL数字系统设计与应用》 课件 PGA-第5章-基本组合逻辑电路的设计_第1页
《Verilog HDL数字系统设计与应用》 课件 PGA-第5章-基本组合逻辑电路的设计_第2页
《Verilog HDL数字系统设计与应用》 课件 PGA-第5章-基本组合逻辑电路的设计_第3页
《Verilog HDL数字系统设计与应用》 课件 PGA-第5章-基本组合逻辑电路的设计_第4页
《Verilog HDL数字系统设计与应用》 课件 PGA-第5章-基本组合逻辑电路的设计_第5页
已阅读5页,还剩112页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章基本组合逻辑电路的设计5.1VerilogHDL数字电路设计方法模块内部逻辑行为描述对外是不可见的,其内部描述的改变,不会影响模块之间的连接关系。用VerilogHDL设计模块电路内部具体逻辑行为的描述方式也称为建模方式。组合逻辑电路模块的功能描述,可以采用以下三种描述方式:(1)元件例化描述(2)数据流描述(3)always语句5.1.1元件例化描述在VerilogHDL设计中,用户常需要利用基本门电路和自定义模块或实体进行组合,设计数字系统。VerilogHDL预先定义了常见的基本门级元件,如and、or、nor等基本门级电路,并允许用户自定义设计有特定功能的模块元件。元件例化的过程是将预先设计好的模块电路定义为一个元件,然后利用映射语句将此元件与另一个模块实体指定的端口相连,实现层次化数字系统设计。采用元件例化法设计复杂数字电路时,首先需要完成描述数字系统总功能的电路原理图设计,参考数字电路相关知识;然后,根据电路原理图中各元件之间的关系,运用VerilogHDL例化所有元件,完成数字电路设计。5.1VerilogHDL数字电路设计方法元件例化具体方式主要有两种:(1)位置映射法(2)信号名称映射法其中信号名称映射法不能用于描述标准的基本门级元件。1.位置映射法位置映射法严格要求模块实体的端口名称与元件定义的输入/输出端口顺序一一对应,但不需要注明元件定义时的端口名,其一般语句引用格式如下:

元件名模块例化名(输出端口1信号名,输出端口2信号名,…,

输入端口1信号名,输入端口2信号名,…);其中,“模块例化名”是用户命名的模块实体名称,可以省略。在输入/输出端口列表中,括号左边的第一个端口通常为输出,后续端口则为输入。5.1VerilogHDL数字电路设计方法5.1.1元件例化描述举例如下:andU1(COUT,A,B,C,D);例化4输入与门,例化后与门输入为A、B、C、D信号,输出为COUT信号,名称U1可省略。orU2(COUT,A,B,C,D);例化2输入或门,例化后或门输入为A、B、C、D信号,输出为COUT信号,名称U2可省略。【例5.1】用位置映射法法设计1位半加器电路,其模块电路名称为half_add1,元件符号如图5.1所示。5.1VerilogHDL数字电路设计方法5.1.1元件例化描述图5.11位半加器元件符号加法器是一种常见的算术运算电路,包括半加器、全加器、多位加法器等。半加器是相对较简单的加法器,仅考虑两个加数本身,无需考虑来自低位的进位。5.1VerilogHDL数字电路设计方法5.1.1元件例化描述表5.11位半加器功能表1位半加器的逻辑表达式:图5.21位半加器电路原理图假设A、B分别表示半加器加数和被加数输入信号,逢二即进位,SUM表示当前位值输出信号,COUT表示进位输出信号,功能表如表5.1所示。观察逻辑表达式可知,可以使用异或门、与门等基本门级元件实现1位半加器电路,将逻辑表达式转换成电路原理图如图5.2所示。对应代码如下:modulehalf_add1(inputA,inputB,//两个加数输入端口声明 outputwireSUM,//输出端口声明 outputwireCOUT);//参考电路原理图5.2,位置映射法描述全加器电路xorE0(SUM,A,B);andE1(COUT,A,B);endmodule5.1VerilogHDL数字电路设计方法5.1.1元件例化描述5.1VerilogHDL数字电路设计方法5.1.1元件例化描述图5.31位半加器功能仿真1位半加器的功能仿真结果如图5.3所示。当A=“0”、B=“0”时,SUM输出结果为“0”,无进位信号,COUT=“0”;当A=“1”、B=“0”时,SUM输出结果为“1”,无进位信号,COUT=“0”;当A=“0”、B=“1”时,SUM输出结果为“1”,无进位信号,COUT=“0”;当A=“1”、B=“1”时,SUM输出结果为“1”,有进位信号,COUT=“1”。【例5.2】用位置映射法法设计1位全加器电路,其模块电路名称为full_add1。元件符号如图5.4所示。5.1VerilogHDL数字电路设计方法5.1.1元件例化描述图5.41位全加器元件符号5.1VerilogHDL数字电路设计方法5.1.1元件例化描述表5.21位全加器功能表1位全加器的逻辑表达式:图5.5一位全加器电路原理图根据设计原理,1位半加器功能表见表5.2。观察1位全加器的逻辑表达式可知:可使用异或门、与门、或门等基本门级元件实现1位全加器电路,将逻辑表达式转换成电路原理图,如图5.5所示。其中w1,w2,w3为异或门“E1”,与门“E2”和“E3”的输出信号。对应代码如下:modulefull_add1(inputCIN,

inputA,inputB,//两个加数输入端口声明

outputwireSUM,//输出端口声明

outputwireCOUT);wirew1,w2,w3;//定义基本门元件E1~E3的输出信号为:w1,w2,w3

//参考电路原理图5.5,位置映射法描述全加器电路xorE1(w1,A,B);andE2(w2,A,B);andE3(w3,w1,CIN);xorE4(SUM,w1,CIN);orE5(COUT,w2,w3);endmodule5.1VerilogHDL数字电路设计方法5.1.1元件例化描述1位全加器的功能仿真结果如图5.6所示。当A=“0”、B=“0”、CIN=“0”时,SUM输出结果为“0”,无进位信号,COUT=“0”;当A=“0”、B=“0”、CIN=“1”时,SUM输出结果为“1”,无进位信号,COUT=“0”;当A=“0”、B=“1”、CIN=“1”时,SUM输出结果为“0”,有进位信号,COUT=“1”;当A=“1”、B=“1”、CIN=“1”时,SUM输出结果为“1”,有进位信号,COUT=“1”。以此类推,其功能仿真结果验证了设计的正确性。5.1VerilogHDL数字电路设计方法5.1.1元件例化描述图5.61位全加器功能仿真2.信号名称映射法信号名称映射法利用“.”符号表示元件定义时的端口名称,不要求严格遵守端口顺序,但只能用于描述用户自定义的模块元件,其一般语句引用格式如下:元件名模块例化名(.元件定义端口1信号名(端口1信号名),.元件定义端口2信号名(端口2信号名),.元件定义端口3信号名(端口1信号名),…);其中,“模块例化名”是用户命名的模块实体名称,可以省略。5.1VerilogHDL数字电路设计方法5.1.1元件例化描述举例如下:假设and与or是用户定义的2输入与门和2输入或门,其输出端口名称为:IN1,IN2,输出端口名称为:OUT。andU1(.IN1(A),.IN2(B),.OUT(COUT));例化2输入与门,例化后与门输入为A、B信号,输出为COUT信号,名称可省略。orU2(.IN1(A),.IN2(B),.OUT(COUT));例化2输入或门,例化后或门输入为A、B信号,输出为COUT信号,名称可省略。【例5.3】用信号名称映射法完成1位半加器电路,其模块电路名称half_add_2。参考例5.1完成本次设计。半加器实例的输出信号为:A2、B2,输出信号为SUM2、COUT2,其描述代码如下:5.1VerilogHDL数字电路设计方法5.1.1元件例化描述modulehalf_add2(inputA2,inputB2,

outputwireSUM2, outputwireCOUT2);//例5.1自定义的1位半加器:half_add1,信号名称映射half_add1u_half_add( .A(A2), .B(B2), .SUM(SUM2), .COUT(COUT2));endmodule功能仿真结果参考图5.7所示:5.1VerilogHDL数字电路设计方法5.1.1元件例化描述图5.71位半加器功能仿真【例5.4】用信号名称映射法设计1位全加器电路,其模块电路名称full_add2。参考例5.2所设计1位全加器完成本次设计。全加器的输出信号为:A2、B2、CIN2,输出信号为SUM2、COUT2,其描述代码如下:5.1VerilogHDL数字电路设计方法5.1.1元件例化描述modulefull_add2(inputCIN2,

inputA2,inputB2, outputwireSUM2, outputwireCOUT2);//例5.2用户定义的1位全加器:full_add1,信号名称映射full_add1u_full_add1(.A(A2),.B(B2),.CIN(CIN2),.SUM(SUM2),.COUT(COUT2));endmodule功能仿真结果如图5.8所示。5.1VerilogHDL数字电路设计方法5.1.1元件例化描述图5.81位全加器功能仿真两种映射方法各有特点:(1)位置映射法:相对比较直观,适用于端口较少的元件模块例化;(2)信号名称映射法:则相对简单,不仅代码易错性较低,而且程序可读性和可移植性更优。因此,在FPGA实际开发流程中,信号名称映射法是人们广泛采用的方式。5.1VerilogHDL数字电路设计方法5.1.1元件例化描述数据流描述是使用连续赋值assign语句对电路的逻辑功能建模方式。相对于元件例化描述,数据流描述能从更高的抽象层次设计电路,将设计重点放在电路功能描述,而无需考虑电路原理图的设计。该方式只能用于设计组合逻辑电路,并且其赋值运算为“=”。5.1VerilogHDL数字电路设计方法5.1.2数据流描述assign语句只能对wire型变量进行赋值,其等号左边变量的数据类型也必须是wire型,其语句一般引用格式如下:assign变量名=表达式;举例如下:assignY=a-b;//描述两个信号做减法assignY=a*b;//描述两个信号做乘法【例5.5】用数据流描述法设计1位半加器电路,其模块电路名称为half_add_3。参考5.1完成本次设计。半加器输出信号为A3、B3,输出信号为SUM3、COUT3,其描述代码如下。5.1VerilogHDL数字电路设计方法5.1.2数据流描述参考代码一:modulehalf_add1_3( inputA3,inputB3, outputwireSUM3, outputwireCOUT3);//assign语句描述半加器逻辑assignSUM3=A3^B3;assignCOUT3=A3&B3;endmodule参考代码二://**********1位半加器,数据流法参考*********modulehalf_add1_3( inputA3,inputB3, outputwireSUM3, outputwireCOUT3);//assign语句描述半加器逻辑assign{COUT3,SUM3}=A3+B3;endmodule功能仿真结果可参考图5.3。【例5.6】用数据流描述法设计1位全加器电路,其模块电路名称为full_add_3。参考5.2完成本次设计。全加器输出信号为:A3、B3、CIN3,输出信号为SUM3、COUT3,其描述代码如下。5.1VerilogHDL数字电路设计方法5.1.2数据流描述参考代码一://**********1位全加器,数据流法参考*********modulefull_add1_3(inputCIN3,

inputA3,inputB3,//两个加数输入端口声明

outputwireSUM3,//输出端口声明

outputwireCOUT3);//描述全加器逻辑assignSUM3=A3^B3^CIN3;assignCOUT3=(A3&B3)|(A3^B3)&CIN3;endmodule功能仿真结果可参考图5.6。【例5.6】用数据流描述法设计1位全加器电路,其模块电路名称为full_add_3。参考5.2完成本次设计。全加器输出信号为:A3、B3、CIN3,输出信号为SUM3、COUT3,其描述代码如下。5.1VerilogHDL数字电路设计方法5.1.2数据流描述参考代码二://**********1位全加器,数据流法参考*********modulefull_add1_3(inputCIN3,

inputA3,inputB3,

outputwireSUM3,

outputwireCOUT3);assign{COUT3,SUM3}=A3+B3+CIN3;endmodule功能仿真结果可参考图5.6。在VerilogHDL中,always语句可以用于描述组合逻辑电路,也可以用于描述时序逻辑电路,是行为级描述中最重要的一种形式,其格式为:always@(敏感事件列表)begin块内局部变量说明,可选;过程赋值语句;end5.1VerilogHDL数字电路设计方法5.1.3always语句描述例如:always@(aorb)//对输入信号a,b敏感beginY=a-b;//描述两个信号做减法F=a*b;//描述两个信号做乘法end5.1VerilogHDL数字电路设计方法5.1.3always语句描述always语句属于无限循环语句,只要触发语句敏感事件,一直重复执行其内部的过程赋值语句。语句使用时,需注意以下事项:(1)敏感事件列表,若敏感参数发生变化,则触发always块中语句执行,可选项,若无敏感信号,缺省表示对所有输入信号都敏感。(2)赋值语句既可以使用阻塞操作符“=”,也可以使用非阻塞操作符“<=”,描述时序逻辑电路时推荐使用非阻塞赋值语句。(3)begin_end块语句与C语言中大括号{}类似,界定一组行为描述,通常用于标识顺序执行语句块。(4)在always块语句中赋值时,等式左边变量类型必须定义为variable类型。(5)一个程序设计中,可以有1个或多个always块语句,always块语句不能嵌套使用,多个always块语句之间是并行执行关系。5.1VerilogHDL数字电路设计方法5.1.3always语句描述【例5.7】用always语句设计1位半加器电路,其模块电路名称half_add_4。半加器输出信号为:A4、B4,输出信号为SUM4、COUT4,其描述代码如下:modulehalf_add_4(

inputA4,

inputB4,

outputwireSUM4,

outputwireCOUT4);always@(*)//“*”表示对所有输出信号敏感begin{COUT4,SUM4}=A4+B4;endendmodule功能仿真结果参考图5.3所示。5.1VerilogHDL数字电路设计方法5.1.3always语句描述【例5.8】用always语句设计1位全加器电路,其模块电路名称为full_add_4。全加器输出信号为:A4、B4、CIN4,输出信号为SUM4、COUT4,其描述代码如下:modulefull_add_4(inputCIN4,

inputA4,inputB4,

outputwireSUM4,

outputwireCOUT4);//使用并接操作符,描述全加器功能always@(*)begin{COUT4,SUM4}=A4+B4+CIN4;endendmodule功能仿真结果可参考图5.6。模块是VerilogHDL数字电路设计的基本单位,其描述包含了具体硬件电路的功能或结构,以及与其他模块通信的外部端口,是层次化设计的基础。层次化设计基本思想就是将一个比较复杂的数字电路划分多模块、多层次,再分别对每个模块建模,然后将同一层次的功能模块层层组合成子模块和总模块,完成所需的设计。在层次化设计中所使用的模块通常有两种,一种是开发环境提供的标准模块,如and、or、nor等基本门电路,另一种是由用户设计的具有特定功能的模块。5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计数字电路层次化设计有两种设计方法:(1)自顶向下(top-down)(2)自底向上(bottom-up)自顶向下:是先将最终设计数字系统抽象为顶层模块,再按特定方式将顶层模块划分为各个子模块,然后对子模块进行逻辑设计。自底向上:是传统数字系统设计多采用的方法,设计者选用集成电路芯片和其他元器件,由底层逐级向上构成子系统和系统。5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计

图5.9自顶向下设计结构图图5.9是自顶向下设计的层次结构图,其设计过程可以理解为从电路顶层抽象描述向最底层描述的一系列转换过程,直到得到易实现的硬件单元描述。【例5.9】根据图5.10所示的1位全加-减器的层次结构框图,使用自顶向下方法实现设计1位全加-减电路系统(SEL端为全加减器的控制端,SEL为1时,数字系统执行全加功能,反之数字系统执行全减功能)。5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计图5.101位全加-减器层次结构图由图5.10可知,1位全加-减器划分为3个次层,由3个用户设计的模块,以及开发环境提供的基本门级元件构成。首先,通过VerilogHDL描述方式,分别构建1位全加器、全减器模块,以及选择控制模块,接着引用此3个元件模块完成顶层模块设计。当控制端“SEL”为“1”时,选择控制器输出全加器的运算结果,反之选择全减器运算结果作为当前输出结果。参考设计方案如图5.11所示。5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计图5.111位全加-减器设计方案为加深数字电路设计基础理论理解,本例电路设计分别采用元件例化、数据流和always语句描述方式。读者可以尝试运用以上任意1种方式重新描述这些子模块,并在Vivado或Quartus等开发工具中进行仿真验证。1.1位全加器VerilogHDL设计5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计参考代码如下:modulefull_add1(//参考例5.2inputCIN,

inputA,inputB,

outputwireSUM,

outputwireCOUT);//定义基本门元件E1~E3的输出信号为:w1,w2,w3wirew1,w2,w3;xorE1(w1,A,B);andE2(w2,A,B);andE3(w3,w1,CIN);xorE4(SUM,w1,CIN);orE5(COUT,w2,w3);endmodule其功能仿真结果可参考图5.6。2.1位全减器VerilogHDL设计5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计典型的1位全减器:AS、BS分别表示减数和被减数输入信号,CS表示借位输入信号,S表示当前位值输出信号,CSUB表示借位输出信号,其功能如表5.3所示:表5.31位全减器功能表1位全加器的逻辑表达式:图5.121位全减器电路原理图观察逻辑表达式可知,可以使用异或门、与门、或门等基本门级元件实现1位全加器电路,其电路原理参考图如图5.12所示:图5.131位全减器元件符号5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计其描述代码如下:modulefull_sub1(inputAS,inputBS,inputCIN,outputwireS,outputwireCSUB);//定义基本门元件E1-E5的输出信号为:w1,w2,w3,w4,w5wirew1,w2,w3,w4,w5;//全减器功能描述,参考电路原理图xor(w1,AS,BS);nor(w2,AS);nor(w3,w1);and(w4,BS,w2);and(w5,CIN,w3);xor(S,CIN,w1);or(CSUB,w4,w5);endmodule1位全减器的功能仿真结果如图5.14所示。当AS=“0”、BS=“0”、CIN=“0”时,S输出结果为“0”,无借位信号,CSUB=“0”;当AS=“0”、BS=“0”、CIN=“1”时,S输出结果为“0”,需要向高位借位,CSUB=“1”;当AS=“1”、BS=“0”、CIN=“1”时,S输出结果为“0”,无需借位,CSUB=“0”;当AS=“1”、BS=“1”、CIN=“1”时,S输出结果为“1”,需要借位,CSUB=“1”,以此类推。5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计图5.141位全减器功能仿真3.1控制器模块设计5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计设计原理:SEL表示选择控制输入信号,SEL为1时,选择加法运算,SEL为0时,选择减法运算;DATA[1:0]表示来自加法器的输出信号{COUT,SUM},DATA[3:2]表示来自减法器的输出信号{S,CSUB};SUM_S表示选择器当前位值输出信号,COUT_S表示选择器进位/借位输出信号,其功能如表5.4所示,模块电路参考元件符号如图5.15所示。表5.4选择控制器功能表图5.15选择控制器元件符号观察功能表5.4,运用always语句实现选择控制器电路,其行为级描述代码如下:modulefull_sel(inputSEL,//控制输入端口声明input[3:0]DATA,//数据输入端口声明outputregSUM_S=1'b0,//SUM_S表示加-减运算后的当前位值//COUT_S表示加-减运算后,进位或借位输出端口声明outputregCOUT_S=1'b0

);//选择控制模块功能描述always@(*)beginif(SEL)begin//SEL=1,选择加法运算 SUM_S<=DATA[0];COUT_S<=DATA[1];end

elsebegin//SEL=0,选择减法运算 SUM_S<=DATA[2];COUT_S<=DATA[3];endendendmodule5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计选择控制器的功能仿真结果如图5.16所示。当SEL=“0”时,此时选择DATA[3:2]作为系统当前输出,SUM_S=DATA[2],COUT_S=DATA[3];当SEL=“1”时SUM_S=DATA[0],COUT_S=DATA[1]。5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计图5.16选择控制器功能仿真4.1位全加-减器VerilogHDL设计5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计引用全加器、全减器和选择器模块,完成1位全加-减器顶层模块设计,其电路原理图如5.17所示。图5.171位全加-减器电路原理图元件例化描述代码如下:modulefull_add_sub1(inputA,inputB,inputCIN,inputSEL,//输入控制端口声明outputwireSUM,//SUM表示加-减运算后的当前位值//COUT表示加-减运算后,进位或借位输出端口声明outputwireCOUT);//w[3:0],加法器、减法器与选择器模块之间连线信号wire[3:0]w;//参考电路原理图,名称关联法描述全减器功能full_add1U1(.SUM(w[0]),.COUT(w[1]),.A(A),.B(B),.CIN(CIN));full_sub1U2(.S(w[2]),.CSUB(w[3]),.AS(A),.BS(B),.CIN(CIN));

full_selU3(.SUM_S(SUM),.COUT_S(COUT),.DATA(w),.SEL(SEL));endmodule5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计1位全加-减器的功能仿真结果如图5.18所示。当SEL=“0”时,此时进行减法运算,A=“0”、B=“0”、CIN=“0”,{COUT,SUM}=“00”;A=“0”、B=“0”、CIN=“1”,{COUT,SUM}=“10”;A=“0”、B=“1”、CIN=“0”,{COUT,SUM}=“10”。当SEL=“1”时,此时进行加法运算,若A=“0”、B=“0”、CIN=“0”,{COUT,SUM}=“00”;A=“0”、B=“0”、CIN=“1”,{COUT,SUM}=“01”;A=“0”、B=“1”、CIN=“0”,{COUT,SUM}=“01”。5.1VerilogHDL数字电路设计方法5.1.4VerilogHDL层次化设计图5.181位全加-减器功能仿真5.2数据选择器的设计

数据选择器(mux)是从一组指定数据中选出要求的1个数据,作为当前输出,实现信号选择的组合逻辑电路。它的作用相当于多输入端的单刀多掷开关。2n路输入信号和1路输出信号的多路数据选择器需要n个选择控制变量(也称为地址信号),控制变量的每种取值组合对应选中1路输入,将其作为当前状态下的输出。5.2.1基于元件例化的mux设计常用的数据选择器有4选1、8选1和16选1等类型,比如74LS153、74LS151是典型的4选1、8选1集成电路。本小节以4选1,8选1为例,介绍如何用VerilogHDL设计数据选择器电路。5.2数据选择器的设计4选1数据选择器设计原理:元件符号如图5.19所示,EN是使能端,当EN=“1”时,控制译码器正常工作;当EN=“0”时,译码器不工作。A[1..0]是二进制址址信号输入端,表示某一数据的地址信息,D[3..0]是等待被选择的数据。当EN=“1”时,若A=’b00,数据选择器输出F=D[0];若A=’b01,数据选择器输出F=D[1];若A=’b10,数据选择器输出F=D[2];若A=’b11,数据选择器输出F=D[3]。而当EN=“0”时,数据选择器不工作,输出信号默认F=’b0。图5.194选1数据选择器元件符号5.2数据选择器的设计4选1数据选择器功能表如表5.5所示。其中,A0~A1为地址信号输入,D0~D7为数据信号输入,EN是使用控制端,EN高电平有效,F是数据信号输出,X表示任意值。

5.2数据选择器的设计由式4选1数据选择器的表达式可得到电路原理图,如图5.20所示:图5.204选1数据选择器原理图5.2数据选择器的设计代码如下:modulesel4_1_1(inputEN,//使能控制端口声明input[1:0]A,//地址端口声明input[3:0]D,//待选数据端口声明outputwireF//输出端口声明);//定义非门元件N0~N1的输出信号为:n[0]~n[1]wire[1:0]n;//定义与门元件E0~E3的输出信号为:w[0]~w[3];或门元件E4输出:w[4]wire[4:0]w;//参考逻辑图,使用基本逻辑门元件,例化描述电路功能notN0(n[0],A[0]);//非门输出n[0]=!A[0]notN1(n[1],A[1]);//非门输出n[1]=!A[1]andE0(w[0],n,EN,D[0]);//4输入与门

andE1(w[1],n[1],A[0],D[1]);andE2(w[2],A[1],n[0],D[2]);

andE3(w[3],A[1],A[0],D[3]);orE4(w[4],w[3],w[2],w[1],w[0]);andE5(F,w[4]);endmodule4选1数据选择器的功能仿真结果如图5.21所示,D0~D3用不同频率的数据信号驱动,当EN=“1”时,且地址信号取值变化时,F输出信号也相应改变;当EN=“0”时,F没有输出信号,保持缺省值“0”。5.2数据选择器的设计图5.214选1数据选择器功能仿真5.2数据选择器的设计2.8选1数据选择器设计原理:元件符号如图5.22所示,EN是使能端,EN=“1”时,控制译码器正常工作;EN=“0”时,译码器不工作。A[2..0]是二进制址址信号输入端,表示某一数据的地址信息,D[7..0]是等待被选择的数据。当EN=“1”,若A=’b000,数据选择器输出F=D[0];若A=’b001,数据选择器输出F=D[1];若A=’b010,数据选择器输出F=D[2],以此类推;当EN=“0”时,数据选择器不工作,输出信号默认为F=’b0。图5.228选1数据选择器元件符号5.2数据选择器的设计8选1数据选择器功能表如表5.6所示。其中,A0~A2为地址信号输入,D0~D7为数据信号输入,EN是使用控制端,EN高电平有效,F是数据信号输出,X表示任意值。表5.68选1数据选择器功能表

由8选1数据选择器的输出表达式,可得到电路原理图,如图5.23所示:5.2数据选择器的设计图5.238选1数据选择器电路原理图5.2数据选择器的设计代码如下:modulesel8_1_1(inputEN,input[2:0]A,input[7:0]D,outputwireF);wire[2:0]n;//定义非门元件N0-N2的输出信号为:n[0]~n[2]wire[7:0]w;//定义与门元件E0-E7的输出信号为:w[0]~w[7]//参考逻辑图,使用基本门元件,例化描述电路功能notN0(n[0],A[0]);//非门输出n[0]=!A[0]notN1(n[1],A[1]);//非门输出n[1]=!A[1]notN2(n[2],A[2]);//非门输出n[2]=!A[2]andE0(w[0],n,D[0]);//5输入与门

andE1(w[1],n[2],n[1],A[0],D[1]);andE2(w[2],n[2],A[1],n[0],D[2]);andE3(w[3],n[2],A[1],A[0],D[3]);andE4(w[4],A[2],n[1],n[0],D[4]);andE5(w[5],A[2],n[1],A[0],D[5]);andE6(w[6],A[2],A[1],n[0],D[6]);

andE7(w[7],A,D[7]);orE8(w[8],w[7],w[6],w[5],w[4],w[3],w[2],w[1],w[0]);andE9(F,w[8],EN);endmodule5.2数据选择器的设计8选1数据选择器的功能仿真结果如图5.24所示。D0~D7给予不同频率的数据信号,当EN=“1”且地址信号取值变化时,F输出信号也相应改变;当EN=“0”时,F没有输出信号,保持缺省值“0”。5.2数据选择器的设计图5.248选1数据选择器功能仿真5.2数据选择器的设计5.2.2基于数据流描述的mux设计1.4选1数据选择器4选1选择器数据流描述代码如下:modulesel4_1_2(inputEN,input[1:0]A,input[3:0]D,outputwireF);//参考逻辑表达式,描述电路功能assignF=(((~A[1])&(~A[0])&D[0])|((~A[1])&A[0]&D[1])|(A[1]&(~A[0])&D[2])|(A[1]&A[0]&D[3]))&EN;endmodule数据流描述方式的功能仿真结果可参考图5.21。2.8选1数据选择器8选1数据选择器,数据流描述代码如下:modulesel8_1_2(inputEN,input[2:0]A,input[7:0]D,outputregF);wire[1:0]w;//定义2个线性变量w[0]、w[1],避免代码过长//参考逻辑表达式,描述电路功能assignw[0]=((~A[2])&(~A[1])&(~A[0])&D[0])|((~A[2])&(~A[1])&A[0]&D[1])|((~A[2])&A[1]&(~A[0])&D[2])|((~A[2])&A[1]&A[0]&D[3]);assignw[1]=(A[2]&(~A[1])&(~A[0])&D[4])|(A[2]&(~A[1])&A[0]&D[5])|(A[2]&A[1]&(~A[0])&D[6])|(A[2]&A[1]&A[0]&D[7]);assignF=(w[1]|w[0])&EN;endmodule5.2数据选择器的设计数据流描述方式的功能仿真结果参考图5.24。5.2数据选择器的设计5.2.3基于always语句描述的mux设计1.4选1数据选择器always语言描述代码如下:modulesel4_1_3(inputEN,input[1:0]A,input[3:0]D,outputregF);always@(*)beginif(!EN)F=0; else case(A)//采用case语句实现 2'b00:F=D[0]; 2'b01:F=D[1];2'b10:F=D[2]; 2'b11:F=D[3];

default:F=0;endcaseendendmodule5.2数据选择器的设计4选1数据选择器的功能仿真结果参考图5.21。5.2数据选择器的设计2、8选1数据选择器always语言描述代码如下:modulesel8_1_3(inputEN,input[2:0]A,input[7:0]D,outputregF);always@(*)beginif(!EN)F=0; else case(A) 3'b000:F=D[0]; 3'b001:F=D[1];3'b010:F=D[2]; 3'b011:F=D[3]; 3'b100:F=D[4]; 3'b101:F=D[5];

3'b110:F=D[6]; 3'b111:F=D[7]; default:F=0;endcaseendendmodule5.2数据选择器的设计功能仿真结果可参考图5.24。5.3编译码器的设计5.3.14-2编码器设计在数字系统中,将有特定含义信息变换为二进制码的过程称为编码,具有编码功能的逻辑电路称为编码器。将2n个离散信息代码用n位二进制码组表示,也称为二进制编码器,可分为普通和优先编码器两类。1、普通编码器在任何时刻,普通编码器只允许一个输入信号有效,当存在多个有效信号时,电路逻辑功能将会混乱。下面以4-2线编码器为例,介绍普通编码器的设计。4-2编码器元件符号如图5.25所示。EN是使用端,高电平“1”有效,A、B、C、D表示4路有特定意义信号输入,高电平“1”有效,F表示信号编码后的二进制码组(2位位宽),X表示任意值。4-2编码器功能表见表5.7。图5.254-2编码器元件符号5.3编译码器的设计表5.74-2编码器功能表

5.3编译码器的设计参考编码器逻辑表达式,编码器电路原理图如图5.26所示:图5.264-2编码器原理图5.3编译码器的设计参考电路原理图图5.26,VerilogHDL元件例化代码描述如下:modulecode4_2(inputEN,//使能控制端口声明inputA,inputB,inputC,inputD,//输入信号声明outputwire[1:0]F//输出端口声明);wire[4:0]w;//参考逻辑电路图,描述电路功能notE0(w[0],A);notE1(w[1],B);

notE2(w[2],C);xorE3(w[3],B,D);

xorE4(w[4],C,D);andE5(F[1],w[0],w[1],w[4],EN);andE6(F[0],w[0],w[2],w[3],EN);endmodule5.3编译码器的设计参考逻辑表达式,VerilogHDL数据流描述代码如下:modulecode4_2(inputEN,//使能控制端口声明inputA,inputB,inputC,inputD,//输入信号声明outputwire[1:0]F//输出端口声明);//数据流方式描述电路功能assignF[0]=(~A)&(~C)&(B^D);assignF[1]=(~A)&(~B)&(C^D);endmodule5.3编译码器的设计参考表格5.7,VerilogHDLalways语句描述代码如下:modulecode4_2(inputEN,//使能控制端口声明inputA,inputB,inputC,inputD,//输入信号声明outputwire[1:0]F//输出端口声明);//参考表格5.7,CASE语句描述电路功能always@(*)beginif(~EN)F=0;elsecase({A,B,C,D})'b1000:F='b00; 'b0100:F='b01; 'b0010:F='b10; 'b0001:F='b11; default:F='b00; endcaseend endmodule5.3编译码器的设计5.3编译码器的设计4-2编码器的功能仿真结果如图5.27所示。若EN=“1”,当输入信号为有效电平“1”(不能同时为1),F输出对应的二进制码组;当EN=“0”时,F没有输出信号,保持缺省值“0”。图5.274-2编码器功能仿真2.优先编码器优先编码器允许多个输入端信号有效。当存在多个有效信号时,输入端优先级高的信号将被编码,下面以4-2线优先编码器为例,介绍优先编码器的设计。5.3编译码器的设计4-2优先编码器元件符号如图5.28所示,其中EN是使用端,高电平“1”有效,A、B、C、D表示4路有特定意义信号输入,高电平“1”有效,A优先级最高,D优先级最低,F表示信号编码后的二进制码组(2位位宽),X表示任意值。4-2优先编码器功能表见表5.8。图5.284-2优先编码器元件符号5.3编译码器的设计表5.84-2优先编码器功能表

5.3编译码器的设计参考优先编码器逻辑表达式,编码器电路原理图如图5.29所示:图5.294-2优先编码器原理图5.3编译码器的设计参考电路原理图5.29,VerilogHDL元件例化代码描述如下:modulepri_code4_2(inputEN,//使能控制端口声明inputA,inputB,inputC,inputD,//输入信号声明outputwire[1:0]F//输出端口声明);wire[5:0]w;//参考逻辑电路图,描述电路功能notE0(w[0],A);notE1(w[1],B);notE2(w[2],C);orE3(w[3],C,D);andE4(w[4],w[2],D);orE5(w[5],w[4],B);andE6(F[0],w[0],w[5],EN);andE7(F[1],w[0],w[1],w[3],EN);endmodule5.3编译码器的设计VerilogHDL数据流描述如下:modulepri_code4_2(inputEN,//使能控制端口声明inputA,inputB,inputC,inputD,//输入信号声明outputwire[1:0]F//输出端口声明);//参考逻辑表达式,描述电路功能assignF[0]=(~A)&(B|((~C)&D))&EN;assignF[1]=(~A)&(~B)&(C|D)&EN;endmodule5.3编译码器的设计参考功能表5.8,VerilogHDLalways语句描述如下:modulepri_code4_2(inputEN,//使能控制端口声明inputA,inputB,inputC,inputD,//输入信号声明outputreg[1:0]F//输出端口声明);//if..else语句嵌套,描述电路优先级别always@(*)beginif(~EN)F=0;elsebeginif(A)F='b00; elseif(B)F='b01; elseif(C)F='b10; elseF='b11;end endendmodule5.3编译码器的设计4-2优先编码器的功能仿真结果如图5.30所示。若EN=“1”时,当某个输入信号为有效电平“1”,F输出对应信号二进制码组,当多个输入信号为有效电平“1”时,F输出优先级最高信号的二进制码组;当EN=“0”时,F不进行编码,保持缺省值“0”。图5.304-2优先编码器功能仿真5.3编译码器的设计3.二-十进制编码器在数字系统中,常用四位二进制代码来表示一位十进制数字“0、1、2、…、9”,称为二-十进制代码,即BCD码。二-十进制(BCD)编码器就是将0-9十个十进制数转换为二进制代码的电路。BCD编码的方案很多,可分为有权码和无权码两类,比如典型有权码有8421码、2424码等,无权码有余3码、格雷码等。其中,8421码是基本和最常用的BCD码,本小节介绍8421优先编码器的设计。BCD-8421编码器元件符号如图5.31所示,其中EN是使能端,高电平“1”有效,D[9..0]表示十进制数字输入端,高电平有效,BCD[3..0]表示1位十进制的二进制编码输出,X表示任意值。当EN=”1”,控制译码器正常工作,当EN=“0”时,译码器不工作。D[9..0]是一位十进制数字“0、1、2、…、9”输入信号,BCD[3..0]表示一位十进制的二进制编码输出。当D[9]优先级为最高时,D[0]优先级最低,以此类推。图5.31BCD-8421编码器元件符号5.3编译码器的设计BCD-8421优先编码器功能表见表5.9。表5.9BCD-8421优先编码器功能表5.3编译码器的设计

5.3编译码器的设计参考DCB-8421优先编码器的逻辑表述式,编码器电路的原理图如图5.32所示。图5.32BCD-8421优先编码器电路原理图5.3编译码器的设计参考电路原理图5.32,VerilogHDL元件例化代码描述如下:modulebcd_8421(inputEN,input[9:0]D,outputwire[3:0]BCD);N[9:2]w;//N2~N9等非门输出D[2]~D[9]的反信号wire[10:0]w;//表示E0~E11等逻辑门的输出信号//参考逻辑电路图5.32,描述电路功能

notN2(N[2],D[2]);notN3(N[3],D[3]);notN3(N[4],D[4]);notN4(N[4],D[4]);notN5(N[5],D[5]);notN6(N[6],D[6]);notN7(N[7],D[7]);notN8(N[8],D[8]);

notN9(N[9],D[9]);//BCD[0]输出电路描述

andE0(w[0],N[2],N[3],N[4],N[5],N[6],N[7],N[8],N[9]);andE1(w[1],w[0],D[1]);andE3(w[3],D[3],N[4],N[5],N[6],N[7],N[8],N[9]);andE5(w[5],D[5],N[6],N[7],N[8],N[9]);andE7(w[7],D[7],N[8],N[9]);orE8(w[8],D[9],w[1],w[3],w[5],w[7]);andE12(BCD[0],w[8],EN);//BCD[1]输出电路描述andE2(w[2],D[2],N[3],N[4],N[5],N[6],N[7],N[8],N[9]);andE6(w[6],D[6],N[7],N[8],N[9]);andE9(w[9],w[2],w[3],w[6],w[7]);andE13(BCD[1],w[9],EN);//BCD[2]输出电路描述andE4(w[4],D[4],N[5],N[6],N[7],N[8],N[9]);andE10(w[10],w[4],w[5],w[6],w[7]);andE14(BCD[2],w[10],EN);//BCD[3]输出电路描述orE11(w[11],D[8],D[9]);andE15(BCD[3],w[11],EN);endmodule5.3编译码器的设计5.3编译码器的设计从5.2小节和5.3小节的设计示例,如“8选1数据选择器”、“二-十进制编码器”等系统设计可以看出:随着数字系统趋向复杂,元器例化和数据流方式繁琐的描述方式已逐渐不适用。本小节暂省略数据流方式描述,建议使用always语句描述。VerilogHDLalways语句描述代码如下://**********8421编码器,元件例化描述参考***********modulebcd_8421(inputEN,input[9:0]D,outputreg[3:0]BCD);//参考功能表5.9,case语句描述电路功能always@(*)beginif(~EN)BCD='b0000;elsecasex(D)'b0000000001:BCD='b0000; 'b000000001X:BCD='b0001; 'b00000001XX:BCD='b0010; 'b0000001XXX:BCD='b0011;

'b000001XXXX:BCD='b0100; 'b00001XXXXX:BCD='b0101; 'b0001xxxxxx:BCD='b0110; 'b001xxxxxxx:BCD='b0111; 'b01xxxxxxxx:BCD='b1000; 'b1xxxxxxxxx:BCD='b1001; default:BCD='b0000; endcase end endmodule5.3编译码器的设计5.3编译码器的设计BCD-8421优先编码器的功能仿真结果如图5.33所示。当EN=“1”时,输入二进制码组信号变化,F输出对应的译码信号;当EN=“0”时,F没有输出信号,保持缺省值“0”。图5.33BCD-8421编码器功能仿真5.3编译码器的设计5.3.2译码器设计将二进制码组翻译成有特定含义信息的过程称为译码,译码是编码的逆过程。译码器的n位二进制输入码组可以翻译为小于等于2n个离散输出信号,如常用的2-4译码器、3-8译码器、显示译码器等。本小节以2-4线编码器为例,介绍译码器的设计。2-4译码器元件符号如图5.34,其中EN是使能端,高电平“1”有效,F[1..0]表示2位二进制码组输入端,A、B、C、D表示4路有特定意义信号输出,高电平“1”有效。设计原理:EN是使能端,EN=”1”时,控制译码器正常工作;EN=“0”时,译码器不工作。F[1..0]是二进制码组输入端,表示某特定信息的编码。当F=’b00时,译码器输出{A,B,C,D}=’b1000,表示译码的有效输出信号是A(高电平“1”);当F=’b01时,译码器输出{A,B,C,D}=’b0100,表示译码的有效输出信号是B(高电平“1”),以此类推。图5.342-4译码器元件符5.3编译码器的设计2-4译码器功能表见表5.10。表5.102-4编码器功能表

5.3编译码器的设计参考4-2编码器逻辑表达式,其电路原理图如图5.35所示:图5.352-4译码器原理图5.3编译码器的设计参考2-4译码器电路原理图,VerilogHDL元件例化代码描述如下:moduledecode2_4(inputEN,input[1:0]F,outputwireA,B,C,D);wire[1:0]w;//参考2-4译码器逻辑电路图,描述电路功能notE0(w[0],F[0]);notE1(w[1],F[1]);andE2(A,w[1],w[0],EN);andE3(B,w[1],F[0],EN);andE4(C,F[1],w[0],EN);andE5(D,F[1],F[0],EN);endmodule5.3编译码器的设计参考2-4译码器逻辑表达式,VerilogHDL数据流描述代码如下:moduledecode2_4(inputEN,input[1:0]F,outputwireA,B,C,D);//参考4-2编码器的逻辑表达式,描述电路功能assignA=(~F[1])&(~F[0]);assignB=(~F[1])&F[0];assignC=F[1]&(~F[0]);assignD=F[1]&F[0];endmodule参考功能表5.10,VerilogHDLalways语句描述代码如下:moduledecode2_4(inputEN,input[1:0]F,outputwireA,B,C,D);//参考功能表5.10,CASE语句描述电路功能always@(*)beginif(~EN){A,B,C,D}='b0000;elsecase(F)'b00:{A,B,C,D}='b1000; 'b01:{A,B,C,D}='b0100; 'b10:{A,B,C,D}='b0010; 'b11:{A,B,C,D}='b0001; default:{A,B,C,D}='b0000; endcase end endmodule5.3编译码器的设计2-4译码器的功能仿真结果如图5.36所示。当EN=“1”时,输入二进制码组信号变化,F输出对应的译码信号;当EN=“0”时,F没有输出信号,保持缺省值“0”。5.3编译码器的设计图5.364-2译码器功能仿真5.4比较器的设计5.4比较器的设计比较器是常用的组合逻辑电路,特别是在计算机中常常需要对两个数A、B的大小进行比较,其比较结果有A>B,A=B,A<B三种情况。两个多位宽数A[n..0]、B[n..0]比较基本原则如下:(1)从高位向低位逐位比较。(2)高位不相等时,高位比较的结果就是两个数的比较结果。(3)高位相等时,两数的比较结果由低位比较决定。本小节以4位数据比较器为例,介绍数据比较器的设计。4位数据比较器元件符号如图5.37所示:其中EN是使能端,高电平“1”有效,A[3..0]和B[3..0]表示2个4位待比较的输入数据,F[2..0]表示比较结果输出。F[2]表示“A>B”输出结果,F[1]表示“A<B”输出结果,F[0]表示“A=B”输出结果,高电平“1”有效,X表示任意值。设计原理:EN是使能端,当EN=”1”时,数据比较器正常工作;EN=“0”时,数据比较器不工作。首先比较A[3]和B[3],若A[3]>B[3],则比较器输出F=’b100;若A[3]<B[3],则比较器输出F=’b010;若A[3]=B[3],则需要比较次高位A[2]和B[2]。如果A[2]>B[2],则比较器输出F=’b100;若A[2]<B[2],则比较器输出F=’b010;若A[3]=B[3],则需要比较A[1]和B[1],以此类推。5.374位比较器元件符号5.4比较器的设计根据设计原理,4位比较器功能表见表5.11。表5.114位比较器功能表输入输出ENA[3]B[3]A[2]B[2]A[1]B[1]A[0]B[0]F[2]F[1]F[0]0A[3]>B[3]XXXXXX1001A[3]<B[3]XXXXXX0101A[3]=B[3]A[2]>B[2]XXXX1001A[3]=B[3]A[2]<B[2]XXXX0101A[3]=B[3]A[2]=B[2]A[1]>B[1]XX1001A[3]=B[3]A[2]=B[2]A[1]<B[1]XX0101A[3]=B[3]A[2]=B[2]A[1]=B[1]A[0]>B[0]1001A[3]=B[3]A[2]=B[2]A[1]=B[1]A[0]<B[0]0101A[3]=B[3]A[2]=B[2]A[1]=B[1]A[0]=B[0]001参考功能表5.11,4位比较器的逻辑表达式如下:

5.4比较器的设计根据4位比较器的逻辑表达式,其电路原理图如图5.38。5.384位比较器电路原理图5.4比较器的设计参考4位比较器电路原理图,VerilogHDL元件例化代码描述如下:modulecomp4_2(

inputEN,//使能控制端口声明

input[3:0]A,B,//两个4位待比较输入信号声明

outputwire[2:0]F//比较结果输出端口声明);//A>B时,相关基本门元件E0-E8输出信号为:wa[0]~wa[8]wire[8:0]wa;//A<B时,相关基本门元件E9-E17输出信号为:wb[0]~wb[8]wire[8:0]wb;//A=B时,E20输出信号为wab[0],wab[3:1]则为同或运算输出wire[3:0]wab;//参考逻辑电路图,同或运算元件例化描述xnorE22_A(wab[1],A[1],B[1]);xnorE22_B(wab[2],A[2],B[2]);xnorE22_C(wab[3],A[3],B[3]);//首先描述A>B情况下的电路功能,F[2]表示"A>B"比较结果notE0(wa[0],B[0]);notE1(wa[1],B[1]);notE2(wa[2],B[2]);5.4比较器的设计notE3(wa[3],B[3]);andE4(wa[4],wa[3],A[3]);andE5(wa[5],wab[3],wa[2],A[2]);andE6(wa[6],wab[3],wab[2],wa[1],A[1]);andE7(wa[7],wab[3],wab[2],wab[1],wa[0],A[0]);orE8(wa[8],wa[7],wa[6],wa[5],wa[4]);andE18(F[2],wa[8],EN);//描述A<B情况下的电路功能,F[1]表示"A<B"比较结果notE9(wb[0],A[0]);notE10(wb[1],A[1]);notE11(wb[2],A[2]);notE12(wb[3],A[3]);andE13(wb[4],wb[3],B[3]);andE14(wb[5],wab[3],wb[2],B[2]);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论