《《数字集成电路设计》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《数字集成电路设计》PPT课件.ppt(55页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数字集成电路设计FPGA结构与设计流程结构与设计流程 FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interco
2、nnect)三个部分。FPGA的基本特点主要有:1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。2)FPGA可做其它全定制或半定制ASIC电路的中试样片。3)FPGA内部有丰富的触发器和I/O引脚。4)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。目前FPGA的品种很多,有XILINX的XC系列、TI公司的TPC系列、ALTERA公司的FIEX系列等FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采
3、用不同的编程方式。加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持一片PROM编程多片FPGA;串行模式可以采用串行PROM编程FPGA;外设模式可以将FPGA作为
4、微处理器的外设,由微处理器对其编程。FPGA基本结构与原理基本结构与原理 采用查找表(Look-Up-Table)结构的PLD芯片我们也可以称之为FPGA:如Altera的ACEX,APEX系列,Xilinx的Spartan,Virtex系列等。查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的161的RAM。实际逻辑电路LUT的实现方式a,b,c,d 输入逻辑输出地址RAM中存储的内容00000000000001000010.001111111111我们还是以这个电路的为例 FPGA的设
5、计流程的设计流程一个完整的FPGA设计流程包括电路设计与输入、功能仿真、综合、综合后仿真、实现、布线后仿真和下板后调试等主要步骤,如图所示。EDA软件工具软件工具 软件简介MAX-PLUS II是Altera的集成开发软件,使用广泛,支持Verilog HDL、VHDL和AHDL多种语言。Quartus II是Altera继MAX-PLUS II后的新一代开发工具,能够支持百万门级的设计,适合大规模FPGA的开发。Quartus II提供了更优化的综合和适配功能,改善了对第三方仿真和时域分析工具的支持。软件包括SOPC Builder,可自动添加、参数化和链接IP核,包括嵌入处理器、协处理器、
6、外设和用户定义逻辑等。ISE是xilinx公司最新的FPGA集成开发软件,它提供给用户一个设计输入到综合、布局、仿真、下载的全套解决方案,并能很方便的同其他EDA工具接口。其中,原理图输入用的是第三方软件ECS,HDL综合可以使用Xilinx公司开发的XST、Synopsys的FPGA Express 和Synplicity的Synplicity/Synplicity Pro,测试输入是图形化的HDL Bencher,状态图输入用的是StatCAD,前、后仿真可以使用Modelsim XE或Modelsim SE。ispLEVER是Lattice公司继ispDesignerEXPRET后的新一
7、代集成工具,该软件同时集成了许多第三方工具,如Synplicity/Synplicity Pro和Leonardo Spectrum,仿真软件Modelsim等。逻辑综合工具逻辑综合工具软件简介Synplicity/Synplicity Pro是Spnlicity公司推出的HDL综合工具,使用广泛。Synplicity Pro除了具有原理图生成器、延时分析器外,还带有一个FSM Complier(有限状态级编译器),能从HDL设计文本中提出存在的FSM设计模块,并用状态图的方法显示出来,用表格的方式来说明状态的转移条件及输出。FPGA Compiler II是Synopsis公司的HDL综合工
8、具。Synopsis是最早推出HDL综合工具的公司。它改变了早先HDL语言只能用于电路的模拟仿真的情况。Synopsis的综合器包括FPGA Express、FPGA Compiler,目前其最新的综合工具软件为FPGA Compiler II。Leonardo Spectrum是Mentor的子公司Exemplar Logic出品的HDL综合工具软件,并作为FPGA Advantage软件的一个组成部分。Leonardo Spectrum可同时用于CPLD/FPGA和ASIC设计两类目标,性能稳定。仿真工具仿真工具软件简介Modelsim是Mentor的子公司model Technology
9、 一个出色的HDL混合仿真工具,它属于编译型仿真器,仿真速度快,功能强。NC-Verilog/NC-VHDL/NC-Sim 都是Cadence公司的仿真工具,其中NC-Verilog的前身是Verilog仿真软件Verilog-XL,用于Verilog程序仿真;NC-VHDL用于VHDL仿真;而NC-Sim则能够进行混合仿真。VCS是Synopsis公司的Verilog HDL仿真工具,Scirocco是Synopsis的VHDL仿真功能工具。Active HDLActive HDL是Aldec的verilog/VHDL仿真软件,界面友好,简单易用。Verilog HDL硬件描述语言硬件描述语
10、言 Verilog HDL程序结构程序结构 nVerilog HDL程序有模块构成,模块的内容都是嵌在module和endmodule两个关键字之间,每个模块式实现特定的功能,模块之间可以进行层次的嵌套。nVerilog HDL程序模块包括模块名、输入输出端口说明、内部信号说明、逻辑功能定义等几部分。程序模板如下:module();/*端口描述*/input;output;/*内部信号说明*/wire /nets型变量reg /register变量 integer /常数/*逻辑功能定义*/*任务或函数*/task或function/*使用assign语句定义组合逻辑*/assign=;/*使
11、用always块描述逻辑功能*/always()begin/*行为语句*/*task或function调用*/end/*元件例化*/endmodule1、端口定义、端口定义模块的端口声明了模块的I/O口,其格式如下:Module 模块名(端口1,端口2,端口3,);例如:module and(a,b,c);表示模块名为and,该模块有三个端口a、b和c。2、输入输出端口说明、输入输出端口说明输入输出端口说明格式如下:输入端口:input端口1,端口2,端口3,端口n;输出端口:output 端口1,端口2,端口3,端口n;双向端口:inout端口1,端口2,端口3,端口n;端口说明也可直接写在
12、端口声明语句中:例如:module ex1(input indata,an,clock,output outdata);3、内部信号说明、内部信号说明定义各变量及常量的类型,其格式为:wire 数据名1,数据名2,数据名3,;reg 数据名1,数据名2,数据名3,;wire是定义网络数据类型变量(nets)的关键词,信号变量类型缺省时默认为wire型。reg是定义寄存器型变量(register)的关键词。4、逻辑功能定义、逻辑功能定义模块中最重要的部分是逻辑功能定义,它描述输入输出变量及中间变量的逻辑功能。在模块中描述逻辑功能有三种方法:(1)用“assign”语句 assign语句一般用于适
13、用于对组合逻辑进行描述,称为连续赋值方式。(2)用元件例化(instantiate)元件例化是指将具有一点功能的模块作为独立的元件在顶层文件中调用。采用元件礼花的方法同在电路图输入方式下调用库元件一样,键入元件的名字和引脚的名字即可。(3)用“always”语句 always语句可以用于描述组合逻辑也可用于描述时序逻辑。Verilog HDL数据类型数据类型数据类型是用来表示数字电路中的数字存储和数字传送的。Verilog HDL中的19种数据类型:memory型、large型、medium型、scalared型、time型、small型、tri型、trio型、tril型、triand型、tr
14、ireg型、vectored型、wand型、wor型。介绍4种基本的数据类型:parameter型、reg型、wire型和memory型。在Verilog中也有常量和变量之分,它们分属于以上两种类型。1、常量、常量.数字数字 整数 在Verilog中,整数(即整常数)有4种进制表示方法:二进制整数(b或B)、十进制整数(d或D)、八进制整数(o或O)、十六进制整数(h或H)。例如:8b11000101 /位宽为8位的二进制数110001018hD5 /位宽为8位的十六进制数D5十进制可缺省表示对位宽和进制的说明,例如:128 x和z值 在数字电路中,x代表不定值,z代表高阻值。例如:8b100
15、1xxxx 表示位宽8的二进制数第四位为不定值。.Parameter常数常数在Verilog中,用parameter定义一个标识符代表一个常量,称为符号常量。采用标识符代表一个常量可提高程序的可读性和可维护性。其定义结构如下:parameter 参数名1=表达式,参数名2=表达式,参数名n=表达式。例如:parameter size=4d8;2、变量、变量 变量是指在程序运行过程中其值可以改变的量。网络数据类型(nets型)和寄存器类型(reg型)。在Verilog中,变量分为两种:.nets型变量型变量 Verilog中提供多种nets型变量:wire、wor、wand等等,这里主要介绍wi
16、re型变量。wire型数据类型用来表示以assign语句赋值的组合逻辑信号。在Verilog模型中,输入输出信号类型缺省时自动定义为wire型。wire型变量的格式定义如下:wiren:1 变量名1,变量名2,变量名n;.register型变量型变量register型变量对应于具有状态保持作用的电路元件,如触发器,锁存器等。它只有明确地赋值后才能对其他变量赋值,重新赋值前一直保持原值。在设计中,此类变量必须放在块语句(always语句)中,通过过程语句赋值。同一个register型变量只能在一个块语句中重复赋值,而不能同时在多个块语句中重复赋值使用。register型变量包括reg型和inte
17、ger型。integer型变量的最大位宽是32位,定义一个integer型变量时可以不指定位宽,综合时编译器自动调整其位宽。.memory型变量型变量memory型变量实际是由若干个相同宽度的向量组成的数组。它的定义如下:regn-1:0 memorym-1:0;例如:reg7:0 memory23:0;该语句定义一个有24个字节、每个字节宽度为8bit的存储器,存储器名是mymemeory。在数组中,不能直接对存储器中的某一位进行寻址,只能间接寻址。例如在上例中,对第8个存储单元中的第4位赋值,方法如下:myreg=mymemory7;myreg3=1b1;运算符运算符Verilog HDL
18、提供丰富的运算符,按功能分可分为:算术运算符、关系运算符逻辑运算符、位于算符、缩减运算符、移位运算符、条件运算符和拼接运算符。按运算符所带的操作数来分,又可分为3类:单目运算符(unary operator),双目运算符(binary operator),三目运算符(ternary operator)。.算术运算符算术运算符算术运算符可实现简单的算术操作。常用的算术运算符有:+加-减*乘(常数或乘数是2的整数次幂)/除(常数或除数是2的整数次幂)%求余(常数或有操作数是2的整数次幂)在算术运算中,如果某一个操作数是不定值x,则整个结果将是不定值x。在Verilog中,reg型和nets型数据综
19、合将生成无符号数,integer型数据将综合生成有符号数。.关系运算符关系运算符关系运算符包括:小于大于=大于或等于关系运算符对两个数进行比较,如果比较结果为真,返回值为1;如果比较结果为假,则返回值为0;如果某个操作数为不定值x,则结果返回值为x。.等式运算符等式运算符等式运算符包括:=等于!=不等于=全等于!=全不等于等式运算符是双目运算符,其结果有两个操作数决定。如果声明的关系是真,返回值是1,否则为0。“=”和“=”运算符有所不同,“=”运算符是对两个运算符进行逐位比较,只有当两个操作数的每一位都相等时,结果才为1,如果操作数中有不定值则结果为不定。“=”是对操作数的高阻值和不定值也进
20、行比较,当两个操作数完全一致时,结果为1,否则结果为0。例如:设A=5b11x01,B=5b11x01,则A=B的返回值为不定值x,而A=B的返回值为1。.逻辑运算符逻辑运算符逻辑运算符包括:&逻辑与|逻辑或!逻辑非.位运算符位运算符位运算符反映的是操作数的位运算,在Verilog中有以下几种位运算符:按位取反&按位与|按位或按位异或按位同或两个不同长度的数据进行位操作时,自动将两个操作数右对齐,位数少的操作数会在高位用0补齐。.缩减运算符缩减运算符缩减运算符是单目运算符,包括以下几种:&与|或&与非|或非异或同或缩减运算符的运算规则与位运算符的运算规则类似,但运算过程不同。位运算是对两个操作
21、数相应位进行运算,操作数的位数是不变的,而缩减运算时针对单个操作数,先将操作数的第一位于第二位进行运算,再将结果与第三位进行运算,以此类推,直到最后一位,其结果是一个一位二进制数。.移位运算符移位运算符Verilog HDL中包括两种移位算符:右移 移位运算符用法如下:A n/将操作数B右移n位移位运算时,移出的空位用“0”来填充。.条件算符条件算符条件运算符为:?:条件运算符是一个三目运算符,对三个操作数进行运算,其定义与C语言是相同的,方法如下:信号=条件?表达式1:表达式2;.位拼接运算符位拼接运算符表达式为:位拼接运算符为Verilog中一个特殊的运算符,它可以将两个或多个信号的某些位
22、拼接起来组成一个新的数据。例如:wire5:0 cancat;input3:0 ina;inb;assign cancat=ina,inb1:0;表示将ina和inb的低两位拼接后赋值给cancat,其中ina3作为cancat的最高位,inb0作为其最低位。.算符的优先级算符的优先级下表列出了各运算符的优先级。为避免出错且增加程序的易读性,在书写过程中可用“()”来控制运算的优先级。运算符优先级别!高优先级()*/%+-=!=!=&|&|?:低优先级结构说明语句结构说明语句在Verilog HDL中包括以下4种结构说明语句:initial语句;always语句;task语句;function
23、语句。在一个模块中,使用initial和always块语句的次数是不受限制,initial说明可用于模拟的初始化,仅执行一次;always则不断执行。Task和function语句可以在程序中的一处或多处调用。.initial语句语句initial语句格式如下:initialbegin 语句1;语句2;endinitial语句不带触发条件,initial过程中的块语句沿时间轴只执行一次initial语句通常用于仿真模拟块中对激励向量的描述,或用于给寄存器变量赋初值,它是面向模拟仿真的过程语句,通常不能被逻辑综合工具所支持。.always语句语句always块语句是Verilog HDL语言中经
24、常用到的语句。always语句在程序执行时将不断的被执行。其格式如下:always(敏感信号表达式)begin 语句1;语句2;end敏感信号表达式申明了触发控制或时序控制信号,可以是一个或一组信号若多个信号时,它们之间用“or”关键字连接。可以是电平敏感信号,也可以是一个边沿敏感信号(使用posedge上升沿和negedge下降沿关键字)。当敏感信号列表中任何一个信号发生改变时,块中的内容就会执行一次。.task语句语句task语句的定义格式如下:task;endtask例如:task my_task;/任务申明 input a,b;outputc;assign c=a&b;endtask任
25、务调用:my_task(in1,in2,out);任务调用变量和任务定义时端口说明是一一对应得。当任务启动时in1和in2的值赋给a和b。任务完完成后,输出又通过c赋值给了out,实现了任务的调用。.function语句语句函数的目的是返回一个用于表达式的值。其定义结构如下:function函数名;端口申明;局部变量定义;其他语句;endfunction是一个可选项,如果缺省,则返回值为一位寄存器类型的数据。值得注意的是函数体本身是并发执行的,而函数体内的语句是顺序执行的。任务与函数与许多不同之处,下表列出了它们的区别。比较项任务(task)函数(function)输入与输出可有任意个各种类型
26、的函数至少有一个输入,不能将inout类型作为输入调用只有过程语句中调用,不能在连续赋值语句assign中调用可作为表达式中的一个操作数来调用,在过程赋值和连续赋值语句中均可被调用调用其他函数和任务可调用其他任务和函数可调用其他函数,但不能调用任务返回值不返回向调用它的表达式返回一个值赋值语句赋值语句.持续赋值语句持续赋值语句 assign为持续赋值语句,主要用于对wire型变量进行赋值。比如:assign=a&b;在上面的赋值中,a、b、c三个变量皆为wire型,a和b信号的任何变化都将随时反映到c上面点来。.过程赋值语句过程赋值语句 过程赋值语句多用于对reg型变量进行赋值。过程赋值由阻塞
27、赋值和非阻塞赋值两种方式。非阻塞赋值方式 赋值符号为“=”,如 b=a;非阻塞赋值在整个过程块结束时才进行赋值操作。即b的值不是立刻就改变的。阻塞赋值方式 赋值符号为“=”,如 b=a;阻塞赋值是在该语句结束时就立刻完成赋值操作,即b的值在该语句执行完后就改变了。如果在一个块语句中有多条阻塞赋值语句,那么前面赋值语句没有完成之前,后面的语句就不能被执行,就像被阻塞了一样。条件语句条件语句在Verilog 中,条件语句有if-else语句和case语句两种,放在always块内使用。.if-else语句语句 if-else语句根据表达式的值来执行块中的内容,其格式与C语言中的if-else语句相
28、似:if(表达式)语句;if(表达式)语句1;else 语句2;if(表达式1)语句1;else if(表达式2)语句2;.else if(表达式n)语句n;else 语句n+1;其中,表达式一般为逻辑表达式或关系式,也肯能使一位的变量。系统对表达式的值进行判断,若为0,x,z,按假处理,然后执行指定的语句。语句可以是单语句,也可以是多语句。.case语句语句case语句与if-else语句类似,但它是一种多分支选择语句。case语句有case、casez、casex三种表示方式。case语句case语句使用格式如下:case(表达式)结果1:结果1;结果2:语句2;.结果年:语句n;defa
29、ult:语句n+1;endcase 当表达式的值结果为1时,执行语句1;为结果2时,执行语句2;依此类推。如果表达式的值与列出所有分项的值都不相同的话,则执行default后面的语句。值得注意的是如果没有default分支,程序在综合时会引入锁存器。casez语句与casex语句在case语句中,表达式与结果1结果n之间必须保证对应位全等。casez语句与casex语句是case语句的两种变种。在casez语句和casex语句中,如果分支表达式某些位的值是z或x,那么对这些位就不予以考虑了,只要关注其他位的结果即可。循环语句循环语句在Verilog中存在4种类型的循环语句:for、while、
30、forever和repeat。与条件语句一样,循环语句应放在always块内。由于forever和repeat语句不可综合,主要用于仿真。因此,这里主要介绍for语句和while语句。.for语句语句for语句的使用格式如下:for(循环变量赋初值;循环结果条件;循环变量增值)执行语句;“执行语句”可以是单句,也可以是多句。多句时要用begin-end语句括起来。for语句也可以套用。.while语句语句while语句的格式如下:while(表达式)语句;或 while(表达式)begin 语句;end while语句在执行时,首先判断表达式是否为真。若为真,执行后面的语句或语句块,然后再判断
31、表达式是否为真,若为真,继续执行,直到条件为假,跳出循环。块语句块语句块语句是由块标志符begin-end和fork-join界定的一组语句,当块语句只包含一句语句时,块符号标志可以省略。下面分别介绍串行块begin-end和并行块fork-join。.串行块串行块begin-end串行块中的语句按串行方式顺序执行。比如:beginregb=rega;regc=regb;end由于语句是顺序执行,在最后,将regb和rega的值都更新为rega得值了。.并行块并行块并行块fork-join中的所有语句是并行的。比如:fork regb=rega;regc=regb;join 由于fork-jo
32、in并行块的语句是同时执行的,在上面的块语句执行完后,regb更新为rega的值,而regc的值更新为没有改变前的regb的值,故执行后,regb与regc的值不同。fork-join不支持综合,在进行仿真时,fork-join并行块中的每条语句前面的延时都是相对于该并行语句起始执行的时间。编译向导编译向导Verilog语言和C语言一样也提供了编译向导功能。Verilog HDL允许在程序中使用特殊的向导语句进行“预处理”,然后再将预处理的结果和源程序一起进行编译。向导语言以符号“”开头,以区别其他语言。Verilog HDL提供了十几条编译向导语句,比较常用的有define,include和
33、ifdef、else、endif等,下面就这些常用语句进行介绍。.宏替换宏替换definedefine语句用于将一个简单的名字或标志符(或称为宏名)来替代一个复杂的名字或字符串,其使用格式为:define 宏名 字符串如:define sum ina+inb+inc+ind 在上面语句中,用简单的宏名sum来代替一个复杂的表达式ina+inb+inc+ind,采用了这样的定义形式之后,在后面的程序中就可以直接用sum来替代表达式ina+inb+inc+ind了。assign out=sum+ine;它实际上与 assign out=ina+inb+inc+ind+ine;是完全等价的。再比如:
34、define WORDSIZE 8reg WORDSIZE:1 data;/相当定义reg8:1 data;从上面的例子可以看出:(1)define用于将一个简单的宏名来替换一个字符串或一个 复杂的表达式。(2)宏定义语句行末尾不加分号,这一点需要注意。(3)在运用已定义的宏名时,不要忘记宏名前加符号“”(4)采用宏定义可以简化程序的书写,也便于修改。.文件包含文件包含includeinclude是文件包含语句,它可以将一个文件全部包含到另一个文件中。其格式为:include“文件名”使用include语句是注意以下几点:(1)一个include语句只能指定一个被包含的文件。(2)includ
35、e语句可以出现在源程序任意位置,被包含的文件与包含文件不在同一目录下,必须指明其路径。(3)文件包含允许多重包含,如文件1包含文件2,文件2包含文件3。.条件编译条件编译ifdef、else、endif条件编译命令ifdef、else、endif可以指定对程序中的部分内容进行编译,这三个命令有如下两种使用形式。ifdef 宏名 语句块 endif 这种形式的意思是:当宏名在程序中被定义过的话,则下面的语句块参与源文件的编译,否则,就不参与编译。ifdef 宏名语句块1 else 语句块2 endif这种形式的意思是:当宏名在程序中被定义过的话,则语句块1将被编译到文件中,否则语句块2将被编译到文件中。