模拟与数字电路AnalogandDigitalCircuits08_PLD与VerilogHDL(1)2019/8/3模拟与数字电路—PLD与VerilogHDL(1)2内容提纲•PLD–基本结构–实现组合逻辑电路•VerilogHDL–基本语法规则–变量数据类型–程序基本结构–描述组合逻辑电路2019/8/3模拟与数字电路—PLD与VerilogHDL(1)3可编程逻辑器件•可编程逻辑器件(ProgrammableLogicDevice,简称PLD)是一种可以由用户定义和设置逻辑功能的器件–与中小规模通用逻辑器件相比,具有集成度高、速度快、功耗低、可靠性高等优点–与其他专用集成电路相比,具有产品开发周期短、用户投资风险小、小批量生产成本低等优势•按集成度PLD可分为–低密度PLD:PROM、PLA、PAL、GAL–高密度PLD:CPLD、FPGA2019/8/3模拟与数字电路—PLD与VerilogHDL(1)4PLD基本结构•输入电路–提供互补输入变量(原变量和反变量)•与阵列–产生逻辑函数所需的乘积项•或阵列–选择乘积项,形成与或式,实现逻辑函数•输出电路–提供不同的输出方式输入输出与阵列或阵列输入电路输出电路2019/8/3模拟与数字电路—PLD与VerilogHDL(1)5•与门:PLD中逻辑符号表示AAA标记连接方式编程连接固定连接无连接空白XYZFABCP==ABPXZF=•或门:•互补输入缓冲器:2019/8/3模拟与数字电路—PLD与VerilogHDL(1)6低密度PLD的与、或阵列结构PROMPLAPAL和GAL•PROM:ProgrammableReadOnlyMemory,可编程只读存储器•PLA:ProgrammableLogicArray,可编程逻辑阵列•PAL:ProgrammableArrayLogic,可编程阵列逻辑•GAL:GateArrayLogic,门阵列逻辑ABY1Y0或阵列可编程与阵列固定ABY1Y0或阵列可编程与阵列可编程固定ABY1Y0或阵列固定与阵列可编程固定2019/8/3模拟与数字电路—PLD与VerilogHDL(1)7示例─PROM实现组合逻辑F1=A·B+A·BF3=A·BF2=A·B+A·B逻辑图与阵列或阵列简化逻辑图与阵列或阵列2019/8/3模拟与数字电路—PLD与VerilogHDL(1)8示例─PLA实现一位全加器iiBCACAB与阵列或阵列AABBCiCiiCBASiOB)C(AABCABSCoΣCiiiiiABCCBACBACBASCo2019/8/3模拟与数字电路—PLD与VerilogHDL(1)9示例─PAL实现组合逻辑AL0L1L2L3BCD1234567891012345678910111212345678910DCBADCL0DCBDCBL2BDACBALL03BCADBADCBL1BDACBADCBADC2019/8/3模拟与数字电路—PLD与VerilogHDL(1)10硬件描述语言概述•HDL(HardwareDescriptionLanguag)–是一种以文本形式来描述数字系统硬件的结构和行为的语言–可以从多种抽象层次对数字系统建模•两种常用HDL–VHDL:1981年由美国国防部组织开发,1987年成为IEEE标准–VerilogHDL:1983年由GatewayDesignAutomation公司(后被Cadence收购)开发,1995年成为IEEE标准2019/8/3模拟与数字电路—PLD与VerilogHDL(1)11HDL主要特征•HDL语言既包含一些高级程序设计语言的结构形式,同时也兼顾描述硬件线路连接的具体构件•通过使用结构级或行为级描述可以在不同的抽象层次描述设计–五个抽象层次:系统级、算法级、寄存器传输级、逻辑(门)级、电路(开关)级•HDL语言是并发的,即具有在同一时刻执行多个任务的能力•HDL语言有时序的概念2019/8/3模拟与数字电路—PLD与VerilogHDL(1)12VerilogHDL与C语言的比较•虽然Verilog的某些语法与C语言接近,但存在本质上的区别–Verilog是一种硬件语言,最终是为了产生实际的硬件电路或对硬件电路进行仿真–C语言是一种软件语言,是控制硬件来实现某些功能•利用Verilog编程时,要时刻记着:Verilog是硬件描述语言,要将其与硬件电路对应起来CVerilogproceduresmodulesvariableswires/regsparametersportscontrol(if,case,?:)control(if,case,?:)2019/8/3模拟与数字电路—PLD与VerilogHDL(1)13VerilogHDL基本语法•空白符(间隔符)–主要起分隔文本的作用,可以使文本错落有致,便于阅读与修改–包括空格、制表符、换行符及换页符•注释符–改善程序的可读性,在编译时不起作用–多行注释符:以/*开始到*/结束–单行注释符:以//开始到行尾结束2019/8/3模拟与数字电路—PLD与VerilogHDL(1)14VerilogHDL基本语法(续1)•关键字–Verilog语言内部已经使用的词,例如,module、endmodule、input、output、wire、reg、and等–其中的字母都是小写,例如Input不是关键字•标识符–用于对象(如模块名、电路的输入与输出端口、变量等)命名–以字母或下划线“_”开始,字母、数字、符号“$”和下划线的组合–字母大小敏感,如Input,iNput可以是不同的标识符–不能与关键词相同2019/8/3模拟与数字电路—PLD与VerilogHDL(1)15VerilogHDL基本语法(续2)•逻辑值集合–0:低电平、逻辑0或“假”–1:高电平、逻辑1或“真”–x/X:不确定的值(未知状态)–z/Z:高阻态•常量与符号常量2019/8/3模拟与数字电路—PLD与VerilogHDL(1)16常量•整数型–十进制数形式表示,例如,30、-2–带基数形式表示,格式为:+/-位宽’基数符号数值基数符号:十进制D/d,二进制B/b,八进制O/o,十六进制H/h例如,–8’d101、5’o37、8’HeD,8’b1001_001x•实数型常量–十进制记数法,例如,0.1、2.0、5.67–科学记数法,例如,23.1e2、5E-42019/8/3模拟与数字电路—PLD与VerilogHDL(1)17符号常量•用参数定义语句定义一个标识符来代表一个常量–常用来定义变量的位宽及延时等•定义格式parameter参数名1=常量表达式1,参数名2=常量表达式2,……;例如:parameterBIT=1,BYTE=8,PI=3.14;2019/8/3模拟与数字电路—PLD与VerilogHDL(1)18变量数据类型•线网(net)型:表示元件之间的物理连线–输出值紧随输入值的变化而变化–最常用类型是wire•寄存器(register)型:表示抽象存储元件–在赋新值以前保持原值–只能在initial或always语句中被赋值–最常用类型是reg•定义格式wire/reg[MSB:LSB]变量名1,…,变量名n;例如:wirea,b;reg[3:0]state;2019/8/3模拟与数字电路—PLD与VerilogHDL(1)19VerilogHDL程序基本结构•由实现特定功能的模块构成module模块名(端口名1,端口名2,…);端口类型说明(input,outout,inout);参数定义(可选);数据类型定义(wire,reg等);实例化低层模块和基本门级元件;连续赋值语句(assign);过程块结构(initial和always)行为描述语句;endmodule说明部分功能描述部分顺序是任意的2019/8/3模拟与数字电路—PLD与VerilogHDL(1)20VerilogHDL描述组合逻辑电路•组合逻辑电路的门级描述–使用内置的基本门级元件描述•组合逻辑电路的数据流描述–使用连续赋值assign语句描述•组合逻辑电路的行为级描述–使用always结构描述2019/8/3模拟与数字电路—PLD与VerilogHDL(1)21基本门级元件元件符号功能说明元件符号功能说明and多输入端与门nand多输入端与非门or多输入端或门nor多输入端或非门xor多输入端异或门xnor多输入端异或非门buf多输出端缓冲器not多输出端反相器bufif1高电平有效三态缓冲器notif1高电平有效的三态反相器bufif0低电平有效三态缓冲器notif0低电平有效的三态反相器2019/8/3模拟与数字电路—PLD与VerilogHDL(1)22多输入门和多输出门•多输入门:允许多个输入,但只有一个输出–and,or,xor,nand,nor,xnor•多输出门:允许有多个输出,但只有一个输入–not,bufandA1(out,in1,in2,in3);bufB1(out1,out2,…,in);out1inout2outn…outin1in2in3实例名可忽略实例名可忽略2019/8/3模拟与数字电路—PLD与VerilogHDL(1)23三态门•一个输出、一个数据输入和一个控制输入–notif0,notif1,bufif0,bufif1bufif1B1(out,in,ctrl);notif0N1(out,in,ctrl);inoutctrlctrlinout2019/8/3模拟与数字电路—PLD与VerilogHDL(1)24示例─MuxwithPrimitivesmodulemux2_1(f,a,b,sel);outputf;inputa,b,sel;andg1(f1,a,nsel),g2(f2,b,sel);org3(f,f1,f2);notg4(nsel,sel);endmoduleabselfnself1f2g1g2g3g4abselfMUX012019/8/3模拟与数字电路—PLD与VerilogHDL(1)25赋值语句•连续赋值语句assign变量名=赋值表达式–只能对线网型变量进行赋值,不能对寄存器型变量进行赋值–仅用于描述组合逻辑•过程赋值语句变量名=赋值表达式–只能对寄存器数据类型的变量赋值–在always和initial语句内的赋值–可用于描述组合和时序逻辑2019/8/3模拟与数字电路—PLD与VerilogHDL(1)26VerilogHDL运算符类型符号功能说明类型符号功能说明算术运算符+-*/%二进制加二进制减二进制乘二进制除求模关系运算符====!=大于小于大于或等于小于或等于等于不等于位运算符~&|^^~或~^按位取反按位与按位或按位异或按位同或缩位运算符&~&|~|^^~或~^缩位与缩位与非缩位或缩位或非缩位异或缩位同或逻辑运算符!&&||逻辑非逻辑与逻辑或移位运算符右移左移2019/8/3模拟与数字电路—PLD与VerilogHDL(1)27示例─MuxwithAssignmodulemux2_1(f,a,b,sel);outputf;inputa,b,sel;assignf=(a&~sel)|(b&sel);endmoduleabselfabselfMUX012019/8/3模拟与数字电路—PLD与VerilogHDL(1)28if条件语句if(表达式)语句1;if(表达式)语句1;else语句2;if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;……elseif(表达式n)语句n;else语句n+1;•表达式一般为逻辑表达式或关系表达式–对表达式的值进行判断,若为0,x,z,按假处理;若为1,则按真处理,执行指定语句•if和else后可包含单个或多个语句,多句时用begin-end块语句括起来•if语句嵌套使用时,注意if与else的配对关系2019/8/3模拟与数字电路—PLD