《数字集成电路设计.ppt》由会员分享,可在线阅读,更多相关《数字集成电路设计.ppt(55页珍藏版)》请在三一办公上搜索。
1、数字集成电路设计,FPGA结构与设计流程,FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。,FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect
2、)三个部分。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。,我们还是以这个电路的为例,FPGA的设计流程,一个完整的FPGA设计流程包括电路设计与输入、功能仿真、综合、综合后仿真、实现、布线后仿真和下板后调试等主要步骤,如图所示。,EDA软件工具,逻
5、辑综合工具,仿真工具,Verilog HDL硬件描述语言,Verilog HDL程序结构,Verilog HDL程序有模块构成,模块的内容都是嵌在module和endmodule两个关键字之间,每个模块式实现特定的功能,模块之间可以进行层次的嵌套。Verilog HDL程序模块包括模块名、输入输出端口说明、内部信号说明、逻辑功能定义等几部分。,程序模板如下:,module();/*端口描述*/input;output;,/*内部信号说明*/wire/nets型变量reg/register变量 integer/常数,/*逻辑功能定义*/*任务或函数*/task或function,/*使用assi
6、gn语句定义组合逻辑*/assign=;,/*使用always块描述逻辑功能*/always()begin/*行为语句*/*task或function调用*/end/*元件例化*/endmodule,1、端口定义,模块的端口声明了模块的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,端口
7、3,端口n;,端口说明也可直接写在端口声明语句中:,例如: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”语句 as
8、sign语句一般用于适用于对组合逻辑进行描述,称为连续赋值方式。,(2)用元件例化(instantiate)元件例化是指将具有一点功能的模块作为独立的元件在顶层文件中调用。采用元件礼花的方法同在电路图输入方式下调用库元件一样,键入元件的名字和引脚的名字即可。,(3)用“always”语句 always语句可以用于描述组合逻辑也可用于描述时序逻辑。,Verilog HDL数据类型,数据类型是用来表示数字电路中的数字存储和数字传送的。,Verilog HDL中的19种数据类型:,memory型、large型、medium型、scalared型、time型、small型、tri型、trio型、tri
9、l型、triand型、trireg型、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代表不定值,
10、z代表高阻值。,例如:,8b1001xxxx 表示位宽8的二进制数第四位为不定值。,.Parameter常数,在Verilog中,用parameter定义一个标识符代表一个常量,称为符号常量。采用标识符代表一个常量可提高程序的可读性和可维护性。其定义结构如下:,parameter 参数名1=表达式,参数名2=表达式,参数名n=表达式。,例如:,parameter size=4d8;,2、变量,变量是指在程序运行过程中其值可以改变的量。,网络数据类型(nets型)和寄存器类型(reg型)。,在Verilog中,变量分为两种:,.nets型变量,Verilog中提供多种nets型变量:wire、w
11、or、wand等等,这里主要介绍wire型变量。,wire型数据类型用来表示以assign语句赋值的组合逻辑信号。,在Verilog模型中,输入输出信号类型缺省时自动定义为wire型。,wire型变量的格式定义如下:,wiren:1 变量名1,变量名2,变量名n;,.register型变量,register型变量对应于具有状态保持作用的电路元件,如触发器,锁存器等。它只有明确地赋值后才能对其他变量赋值,重新赋值前一直保持原值。在设计中,此类变量必须放在块语句(always语句)中,通过过程语句赋值。同一个register型变量只能在一个块语句中重复赋值,而不能同时在多个块语句中重复赋值使用。r
12、egister型变量包括reg型和integer型。,integer型变量的最大位宽是32位,定义一个integer型变量时可以不指定位宽,综合时编译器自动调整其位宽。,.memory型变量,memory型变量实际是由若干个相同宽度的向量组成的数组。,它的定义如下:,regn-1:0 memorym-1:0;,例如:reg7:0 memory23:0;,该语句定义一个有24个字节、每个字节宽度为8bit的存储器,存储器名是mymemeory。,在数组中,不能直接对存储器中的某一位进行寻址,只能间接寻址。例如在上例中,对第8个存储单元中的第4位赋值,方法如下:,myreg=mymemory7;m
13、yreg3=1b1;,运算符,Verilog HDL提供丰富的运算符,按功能分可分为:,算术运算符、关系运算符逻辑运算符、位于算符、缩减运算符、移位运算符、条件运算符和拼接运算符。,按运算符所带的操作数来分,又可分为3类:,单目运算符(unary operator),双目运算符(binary operator),三目运算符(ternary operator)。,.算术运算符,算术运算符可实现简单的算术操作。常用的算术运算符有:,+加-减*乘(常数或乘数是2的整数次幂)/除(常数或除数是2的整数次幂)%求余(常数或有操作数是2的整数次幂),在算术运算中,如果某一个操作数是不定值x,则整个结果将是
14、不定值x。,在Verilog中,reg型和nets型数据综合将生成无符号数,integer型数据将综合生成有符号数。,.关系运算符,关系运算符包括:,大于=大于或等于,关系运算符对两个数进行比较,如果比较结果为真,返回值为1;如果比较结果为假,则返回值为0;如果某个操作数为不定值x,则结果返回值为x。,.等式运算符,等式运算符包括:,=等于!=不等于=全等于!=全不等于,等式运算符是双目运算符,其结果有两个操作数决定。如果声明的关系是真,返回值是1,否则为0。,“=”和“=”运算符有所不同,“=”运算符是对两个运算符进行逐位比较,只有当两个操作数的每一位都相等时,结果才为1,如果操作数中有不定
15、值则结果为不定。“=”是对操作数的高阻值和不定值也进行比较,当两个操作数完全一致时,结果为1,否则结果为0。,例如:设A=5b11x01,B=5b11x01,则A=B的返回值为不定值x,而A=B的返回值为1。,.逻辑运算符,逻辑运算符包括:,&逻辑与|逻辑或!逻辑非,.位运算符,位运算符反映的是操作数的位运算,在Verilog中有以下几种位运算符:,按位取反&按位与|按位或按位异或按位同或,两个不同长度的数据进行位操作时,自动将两个操作数右对齐,位数少的操作数会在高位用0补齐。,.缩减运算符,缩减运算符是单目运算符,包括以下几种:,&与|或&与非|或非异或同或,缩减运算符的运算规则与位运算符的
16、运算规则类似,但运算过程不同。位运算是对两个操作数相应位进行运算,操作数的位数是不变的,而缩减运算时针对单个操作数,先将操作数的第一位于第二位进行运算,再将结果与第三位进行运算,以此类推,直到最后一位,其结果是一个一位二进制数。,.移位运算符,Verilog HDL中包括两种移位算符:,右移,移位运算符用法如下:,A n/将操作数B右移n位,移位运算时,移出的空位用“0”来填充。,.条件算符,条件运算符为:,?:,条件运算符是一个三目运算符,对三个操作数进行运算,其定义与C语言是相同的,方法如下:,信号=条件?表达式1:表达式2;,.位拼接运算符,表达式为:,位拼接运算符为Verilog中一个
17、特殊的运算符,它可以将两个或多个信号的某些位拼接起来组成一个新的数据。例如:,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语句。,在一个模块中,使用init
18、ial和always块语句的次数是不受限制,initial说明可用于模拟的初始化,仅执行一次;always则不断执行。Task和function语句可以在程序中的一处或多处调用。,.initial语句,initial语句格式如下:,initialbegin 语句1;语句2;end,initial语句不带触发条件,initial过程中的块语句沿时间轴只执行一次initial语句通常用于仿真模拟块中对激励向量的描述,或用于给寄存器变量赋初值,它是面向模拟仿真的过程语句,通常不能被逻辑综合工具所支持。,.always语句,always块语句是Verilog HDL语言中经常用到的语句。always语
19、句在程序执行时将不断的被执行。其格式如下:,always(敏感信号表达式)begin 语句1;语句2;end,敏感信号表达式申明了触发控制或时序控制信号,可以是一个或一组信号若多个信号时,它们之间用“or”关键字连接。可以是电平敏感信号,也可以是一个边沿敏感信号(使用posedge上升沿和negedge下降沿关键字)。当敏感信号列表中任何一个信号发生改变时,块中的内容就会执行一次。,.task语句,task语句的定义格式如下:,task;endtask,例如:task my_task;/任务申明 input a,b;outputc;assign c=a&b;endtask,任务调用:my_ta
20、sk(in1,in2,out);,任务调用变量和任务定义时端口说明是一一对应得。当任务启动时in1和in2的值赋给a和b。任务完完成后,输出又通过c赋值给了out,实现了任务的调用。,.function语句,函数的目的是返回一个用于表达式的值。其定义结构如下:,function函数名;端口申明;局部变量定义;其他语句;endfunction,是一个可选项,如果缺省,则返回值为一位寄存器类型的数据。值得注意的是函数体本身是并发执行的,而函数体内的语句是顺序执行的。,任务与函数与许多不同之处,下表列出了它们的区别。,赋值语句,.持续赋值语句,assign为持续赋值语句,主要用于对wire型变量进行
21、赋值。,比如:assign=a&b;,在上面的赋值中,a、b、c三个变量皆为wire型,a和b信号的任何变化都将随时反映到c上面点来。,.过程赋值语句,过程赋值语句多用于对reg型变量进行赋值。过程赋值由阻塞赋值和非阻塞赋值两种方式。,非阻塞赋值方式,赋值符号为“=”,如 b=a;,非阻塞赋值在整个过程块结束时才进行赋值操作。即b的值不是立刻就改变的。,阻塞赋值方式,赋值符号为“=”,如 b=a;,阻塞赋值是在该语句结束时就立刻完成赋值操作,即b的值在该语句执行完后就改变了。如果在一个块语句中有多条阻塞赋值语句,那么前面赋值语句没有完成之前,后面的语句就不能被执行,就像被阻塞了一样。,条件语句
22、,在Verilog 中,条件语句有if-else语句和case语句两种,放在always块内使用。,.if-else语句,if-else语句根据表达式的值来执行块中的内容,其格式与C语言中的if-else语句相似:,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-
23、else语句类似,但它是一种多分支选择语句。case语句有case、casez、casex三种表示方式。,case语句,case语句使用格式如下:,case(表达式)结果1:结果1;结果2:语句2;.结果年:语句n;default:语句n+1;endcase,当表达式的值结果为1时,执行语句1;为结果2时,执行语句2;依此类推。如果表达式的值与列出所有分项的值都不相同的话,则执行default后面的语句。值得注意的是如果没有default分支,程序在综合时会引入锁存器。,casez语句与casex语句,在case语句中,表达式与结果1结果n之间必须保证对应位全等。casez语句与casex语句
24、是case语句的两种变种。在casez语句和casex语句中,如果分支表达式某些位的值是z或x,那么对这些位就不予以考虑了,只要关注其他位的结果即可。,循环语句,在Verilog中存在4种类型的循环语句:for、while、forever和repeat。与条件语句一样,循环语句应放在always块内。由于forever和repeat语句不可综合,主要用于仿真。因此,这里主要介绍for语句和while语句。,.for语句,for语句的使用格式如下:,for(循环变量赋初值;循环结果条件;循环变量增值)执行语句;,“执行语句”可以是单句,也可以是多句。多句时要用begin-end语句括起来。for
25、语句也可以套用。,.while语句,while语句的格式如下:,while(表达式)语句;,或 while(表达式)begin 语句;end,while语句在执行时,首先判断表达式是否为真。若为真,执行后面的语句或语句块,然后再判断表达式是否为真,若为真,继续执行,直到条件为假,跳出循环。,块语句,块语句是由块标志符begin-end和fork-join界定的一组语句,当块语句只包含一句语句时,块符号标志可以省略。下面分别介绍串行块begin-end和并行块fork-join。,.串行块,begin-end串行块中的语句按串行方式顺序执行。,比如:beginregb=rega;regc=reg
26、b;end,由于语句是顺序执行,在最后,将regb和rega的值都更新为rega得值了。,.并行块,并行块fork-join中的所有语句是并行的。,比如:fork regb=rega;regc=regb;join,由于fork-join并行块的语句是同时执行的,在上面的块语句执行完后,regb更新为rega的值,而regc的值更新为没有改变前的regb的值,故执行后,regb与regc的值不同。,fork-join不支持综合,在进行仿真时,fork-join并行块中的每条语句前面的延时都是相对于该并行语句起始执行的时间。,编译向导,Verilog语言和C语言一样也提供了编译向导功能。Veril
27、og HDL允许在程序中使用特殊的向导语句进行“预处理”,然后再将预处理的结果和源程序一起进行编译。,向导语言以符号“”开头,以区别其他语言。Verilog HDL提供了十几条编译向导语句,比较常用的有define,include和ifdef、else、endif等,下面就这些常用语句进行介绍。,.宏替换define,define语句用于将一个简单的名字或标志符(或称为宏名)来替代一个复杂的名字或字符串,其使用格式为:,define宏名 字符串,如:,definesum ina+inb+inc+ind,在上面语句中,用简单的宏名sum来代替一个复杂的表达式ina+inb+inc+ind,采用了
28、这样的定义形式之后,在后面的程序中就可以直接用sum来替代表达式ina+inb+inc+ind了。,assign out=sum+ine;,它实际上与 assign out=ina+inb+inc+ind+ine;是完全等价的。,再比如:,defineWORDSIZE 8,reg WORDSIZE:1 data;/相当定义reg8:1 data;,从上面的例子可以看出:,(1)define用于将一个简单的宏名来替换一个字符串或一个 复杂的表达式。(2)宏定义语句行末尾不加分号,这一点需要注意。(3)在运用已定义的宏名时,不要忘记宏名前加符号“”(4)采用宏定义可以简化程序的书写,也便于修改。,
29、.文件包含include,include是文件包含语句,它可以将一个文件全部包含到另一个文件中。其格式为:,include“文件名”,使用include语句是注意以下几点:,(1)一个include语句只能指定一个被包含的文件。(2)include语句可以出现在源程序任意位置,被包含的文件与包含文件不在同一目录下,必须指明其路径。(3)文件包含允许多重包含,如文件1包含文件2,文件2包含文件3。,.条件编译ifdef、else、endif,条件编译命令ifdef、else、endif可以指定对程序中的部分内容进行编译,这三个命令有如下两种使用形式。,ifdef 宏名 语句块 endif,这种形式的意思是:当宏名在程序中被定义过的话,则下面的语句块参与源文件的编译,否则,就不参与编译。,ifdef 宏名语句块1 else 语句块2 endif,这种形式的意思是:当宏名在程序中被定义过的话,则语句块1将被编译到文件中,否则语句块2将被编译到文件中。,