FPGA的基础知识.docx
《FPGA的基础知识.docx》由会员分享,可在线阅读,更多相关《FPGA的基础知识.docx(47页珍藏版)》请在冰豆网上搜索。
FPGA的基础知识
第一章FPGA概述
1、数字集成电路的发展
数字集成电路由最初的电子管、晶体管、中小规模集成电路、超大规模集成电路(VLSIC)发展到专用集成电路(ASIC),专用集成电路的出现降低了设计的成本、提高了可靠性、缩小了物理尺寸,但ASIC的设计周期长、改版投资大、灵活性差。
例如0.18um的芯片,如果集成的芯片超过100万门,其成本超过200万元人民币以上,其风险是显而易见的。
为了避免这种风险,就出现了可编程逻辑器件,包括现场可编程门阵列FPGA(FieldProgrammableGateArray)器件和复杂可编程逻辑器件CPLD(ComplexProgrammableLogicDevice),可编程逻辑器件能够在实验室中进行设计、更改、研制并马上投入使用。
和ASIC相比,PLD的集成度更高,设计的个性化更浓,且具有可修改性,开发成本也较低。
FPGA由Xilinx公司在1985年首家推出,采用CMOS-SRAM工艺制作。
FPGA的结构一般分为三部分:
可编程逻辑块CLB(configurableLogicBlock)、可编程I/O模块(I/OBlock)和可编程内部连线,FPGA出现后受到电子设计工程师的普遍欢迎,发展十分迅速。
Xilinx、Altera和Actel等公司都提供高性能的FPGA芯片。
2、FPGA技术的发展现状及发展趋势
FPGA在1985年由Xilinx公司首家推出至今已有近30年的历史,不过过去十多年时间内FPGA都未受到太多的重视,原因是FPGA的功耗用电、电路密度、频率效能、电路成本等都不如ASIC,在这十多年时间内,FPGA多半只用在一些特殊领域,例如芯片业者针对新产品测试市场反应,即便初期产品未达量产规模,也能先以FPGA制成产品测试。
或者有些芯片设计公司承接了小型的设计项目,在量产规模不足下也一样使用FPGA,或如政府、军方的特殊要求,不期望使用开放、标准性的芯片与电路,也会倾向使用FPGA。
随着工艺技术的发展,FPGA在电路密度及频率效能方面逐渐逼近ASIC,而其独有的现场可编程特性是ASIC无法比拟的。
目前FPGA的应用主要有三个方向:
第一个方向,也是传统方向主要用于通信设备的高速接口电路设计,这一方向主要是用FPGA处理高速接口的协议,并完成高速的数据收发和交换。
这类应用通常要求采用具备高速收发接口的FPGA,同时要求设计者懂得高速接口电路设计和高速数字电路板级设计,具备EMC/EMI设计知识,以及较好的模拟电路基础,需要解决在高速收发过程中产生的信号完整性问题。
FPGA最初以及到目前最广的应用就是在通信领域,一方面通信领域需要高速的通信协议处理方式,另一方面通信协议随时在修改,非常不适合做成专门的芯片。
因此能够灵活改变功能的FPGA就成为首选。
到目前为止FPGA的一半以上的应用也是在通信行业。
第二个方向,可以称为数字信号处理方向或者数学计算方向。
例如早在2006年美国就将FPGA用于金融数据分析,后来又出现将FPGA用于医学数据分析的案例。
在这一方向要求FPGA设计者有一定的数学功底,能够理解并改进较为复杂的数学算法,并利用FPGA内部的各种资源使之变为实际的运算电路。
第三个方向就是SOPC(可编程片上系统)方向。
利用FPGA平台搭建一个嵌入式系统的底层硬件环境,然后由设计者在上面进行嵌入式软件开发。
进入21世纪,随着集成工艺的发展,生产规模的提高及应用成本的下降,使FPGA的应用越来越广泛。
比如说高效运算方面,将一些重复性的常用函数式改用FPGA的硬件线路执行,以硬件线路方式来执行运算,将比以前用纯软件方式执行快数十倍甚至数百倍的效能;再如在芯片开发时的逻辑功效验证方面,将新芯片的逻辑电路加载到FPGA,让FPGA充当新芯片来执行,不仅加速验证程序,也可以节省验证成本;此外,由于FPGA同时间可平行执行的数字信号运算量比DSP大,当数字信号运算的需求量足够大时,FPGA在价格效能比上足以远超DSP,因此可取代DSP进行数字信号处理。
随着新一代FPGA芯片工艺和设计方法的进步及新的应用领域和市场需求的变化,跨越器件、学科甚至跨公司的设计应用越来越多,针对不同领域优化的多平台FPGA以其革命性的能力促使FPGA技术加速进入更多的应用领域中,并大大缩短了产品的上市时间。
随着器件复杂性的增加,设计人员需要更精密复杂的工具,定位在FPGA设计上的EDA工具也面临着更大的发展契机。
第二章Verilog-HDL概述
§2.1综述
1、硬件描述语言(HDL)概述
硬件描述语言(HardwareDescriptionLanguage)是硬件设计人员和电子设计自动化(EDA)工具之间的界面。
其主要目的是用来编写设计文件,建立电子系统行为级的仿真模型。
即利用计算机的巨大能力对用VerilogHDL或VHDL建模的复杂数字逻辑进行仿真,然后再自动综合以生成符合要求且在电路结构上可以实现的数字逻辑网表(Netlist),根据网表和某种工艺的器件自动生成具体电路,然后生成该工艺条件下这种具体电路的延时模型。
仿真验证无误后,用于制造ASIC芯片或写入EPLD和FPGA器件中。
在EDA技术领域中把用HDL语言建立的数字模型称为软核(SoftCore),把用HDL建模和综合后生成的网表称为固核(HardCore),对这些模块的重复利用缩短了开发时间,提高了产品开发率,提高了设计效率。
随着PC平台上的EDA工具的发展,PC平台上的VerilogHDL和VHDL语言的综合性能已相当优越,这就为大规模普及这种新技术铺平了道路。
随着电子系统向集成化、大规模、高速度的方向发展,HDL语言将成为电子系统硬件设计人员必须掌握的语言。
2、使用硬件描述语言的优点
传统的用原理图设计电路的方法已逐渐消失,HDL语言正逐渐为人们广泛接受,这主要是由硬件描述语言的以下优点决定的。
电路设计将继续保持向大规模和高复杂度发展的趋势。
随着科学技术的大幅度提高,芯片的集成度和设计的复杂度都大大增加,芯片的集成密度基本超过百万个晶体管以上,为使如此复杂的芯片变得易于人脑的理解,用一种高级语言来表达其功能而隐藏具体实现的细节是很必要的,这也就是在大系统程序编写中高级程序设计语言代替汇编语言的原因。
工程人员将不得不使用HDL进行设计,而把具体实现留给逻辑综合工具去完成。
电子领域的竞争越来越激烈。
提高逻辑设计的效率,降低设计成本,缩短设计周期将是电子企业所面临的主要课题。
有效的HDL语言和主计算机仿真系统可以在设计完成之前检测到设计中的可能错误,这样就能够将设计错误的数目减少到最低限度,并使第一次投片便能成功地实现芯片的功能成为可能。
探测各种设计方案将变成一件很容易、很便利的事情。
因为只需要对描述语言进行修改,这比更改电路原理图原型要容易实现得多。
3、HDL语言的主要特征
●HDL语言采用自顶向下的数字电路设计方法,主要包括三个领域五个抽象层次,如表2-1所示:
●HDL语言是并发的,即具有在同一时刻执行多任务的能力。
●HDL语言有时序的概念,因此HDL除了可以描述硬件电路的功能外,还可以描述其时序要求。
4、VerilogHDL与VHDL的比较
(1)、VerilogHDL拥有广泛的设计群体,成熟的资源比VHDL丰富,容易掌握,而VHDL设计技术比较困难。
(2)、VerilogHDL较适合算法级(Alogrithem)、寄存器传输级(RTL)、逻辑级(Logic)、门级(Gate)设计,而VHDL适合特大型的系统级(System)设计。
§2.2VerilogHDL设计流程及设计方法简介
1、设计流程(见图2-2-1)
图2-2-1VerilogHDL设计流程
注:
1、总体方案是芯片级的;
2、软件仿真用来检测程序上的逻辑错误;
3、硬件仿真要根据需要搭成硬件电路,检查逻辑和时序上的错误。
使用FPGA(现场可编程门阵列)速度比正常慢10倍以上,而且只能检查逻辑错误,不能检查时序错误。
2、设计方法
(1)、自下而上的设计方法
自下而上的设计是一种传统的设计方法,对设计进行逐次划分的过程是从存在的基本单元出发的,设计树最末枝上的单元要么是已经制造出的单元,要么是其他项目已开发好的单元或者是可外购得到的单元。
这种设计方法与只用硬件在模拟实验板上建立一个系统的步骤有密切联系。
优点:
●设计人员对于用这种方法进行设计比较熟悉;
●实现各个子块电路所需的时间短。
缺点:
●一般来讲,对系统的整体功能把握不足;
●实现整个系统的功能所需的时间长,因为必须先将各个小模块完成。
使用这种方法对设计人员之间相互进行协作有比较高的要求。
2、自上而下的设计方法
自上而下的设计是从系统级开始,把系统划分为基本单元,然后再把每个基本单元划分为下一层次的基本单元,一直这样做下去,直到可以直接用EDA元件库中的元件来实现为止。
优点:
●在设计周期伊始就做好了系统分析;
●由于设计的主要仿真和调试过程是在高层次完成的,所以能够早期发现结构设计上的错误,避免设计工作的浪费,同时也减少了逻辑仿真的工作量。
自顶向下的设计方法方便了从系统划分和管理整个项目,使得几十万门甚至几百万门规模的复杂数字电路的设计成为可能。
并可减少设计人员,避免不必要的重复设计,提高了设计的一次成功率。
缺点:
●得到的最小单元不标准;
●制造成本高。
3、综合设计方法
复杂数字逻辑电路和系统的设计过程通常是以上两种设计方法的结合。
设计时需要考虑多个目标的综合平衡。
在高层系统用自上而下的设计方法来实现,而在低层系统使用自下而上的方法从库元件或数据库中调用已有的单元设计。
这种方法兼有两种设计方法的优点,而且可以使用矢量测试库进行测试。
§2.3程序结构
1、程序结构
作为高级语言的一种,VerilogHDL语言以模块集合的形式来描述数字系统,其中每一个模块都有接口部分,用来描述与其它模块之间的连接。
一般来说,一个文件就是一个模块,这些模块是并行运行的,通过高层模块来定义和调用的。
VerilogHDL语言的模块结构如下:
module<模块名>(<端口列表>);
<定义>
<模块条目>
endmodule
其中,<模块名>是模块唯一性的标识符;<端口列表>是输入、输出和双向端口的列表,这些端口用来与其它模块进行连接;<定义>一段程序用来指定数据对象为寄存器型、存储器型、线型以及过程块,诸如函数块和任务块;而<模块条目>可以是initial结构、always结构、连续赋值或模块实例。
例1:
二输入与非门的行为型描述如下:
moduleNAND(in1,in2,out);
inputin1,in2;
outputout;
//连续赋值语句
assignout=~(in1&in2);
endmodule
in1、in2和out端口指定为线型的。
assign连续赋值语句不间断地监视等式右端变量,一旦其发生变化,右端表达式被重新赋值后结果传给等式左端进行输出。
连续赋值语句用来描述组合电路,一旦其输入发生变动,输出也随之而改变。
例2:
由两个与非门构成一个与门的结构型描述如下:
moduleAND(in1,in2,out);
inputin1,in2;
outputout;
wirew1;
NANDNAND1(in1,in2,w1);
NANDNAND2(w1,w2,out);
endmodule
这个模块含有两个NAND模块实例,分别是NAND1和NAND2,通过内部连线w1连接起来。
调用模块实例的一般形式为:
<模块名><参数列表><实例名>(<端口列表>);
在此,<参数列表>是传输到模块实例的参数值。
2、时延
信号在电路中传输会有传播延时,如线延时、器件延时等,时延就是对延时特性的HDL描述。
例如在每个文件头均添加有如下语句:
`timescale1ns/1ps
其中,timescale是VerilogHDL提供的预编译处理命令,1ns表示时间单位是1ns,1ps表示时间精度是1ps。
根据该命令,语句:
assign#2B=A;
表示B信号在2个时间单位,即2ns后得到A信号的值,如图2-2-2所示:
图2-2-2B信号在2个时间单位后得到A信号的值
3、三种建模方式
以上两个实例分别用到了VerilogHDL语言的行为型描述方式和结构型描述方式,此外,HDL的建模中还有数据流描述方式,分别说明如下:
●行为型描述
是一种使用高级语言的方法,和用软件编程语言描述相同,具有很强的通用性和有效性。
行为型描述通过行为实例来实现,关键词是always。
其含义是,一旦赋值给定,仿真器便等待变量的下一次变化,有无限循环之意。
例3:
一位全加器的结构如图2-2-3所示
图2-2-3一位全加器的结构
1):
一位全加器的行为描述方式
modulequanjia3(a,b,cin,cout,sum);
inputa,b,cin;
outputsum,cout;
regsum,cout;
regt1,t2,t3;
always@(aorborcin)
begin
sum=(a^b)^cin;
t1=a&b;
t2=a&cin;
t3=b&cin;
cout=(t1|t2)|t3;
end
endmodule
●结构型描述
结构型描述方式就是通过对电路结构的描述,即通过对实例(器件)的调用,并使用线网连接的方式,这里的器件包括包括用户的设计实例,也包括VerilogHDL的内置门,如与门and,异或门xor等。
2):
一位全加器的结构型描述方式
modulequanjiaqi(a,b,cin,cout,sum);
inputa;
inputb;
inputcin;
outputcout;
outputsum;
wires1,t1,t2,t3;
xorX1(s1,a,b);
xorX2(sum,s1,cin);
andA1(t1,a,b);
andA2(t2,a,cin);
andA3(t3,b,cin);
orO1(cout,t1,t2,t3);
endmodule
其中s1、t1、t2和t3是门与门之间的连线,代码显示了该结构的建模方式,其中xor、and、or是VerilogHDL内置的门器件。
以andA1(t1,a,b)为例,and表明调用一个内置的异或门,器件名称为and,代码实名化为A1。
括号内的A1,a,b表明该器件管脚的实际连接线(信号)的名称,其中a,b是输入,t1是输出。
●数据流描述方式
数据流描述方式就是通过对数据流在设计中的具体行为的描述来建模的,是一种描述组合功能的方法,用assign连续赋值语句实现。
3):
一位全加器的数据流描述方式
modulequanjia3(a,b,cin,cout,sum);
inputa,b,cin;
outputsum,cout;
wires1,t1,t2,t3;
assign#2s1=a^b;
assign#2sum=s1^cin;
assign#2t1=a&b;
assign#2t2=a&cin;
assign#2t3=b&cin;
assign#2cout=(t1|t2)|t3;
endmodule
第三章VerilogHDL的基本语法
§3.1VerilogHDL语言要素
VerilogHDL程序是由各种符号流构成的,这些符号包括空白符(Whitespace)、操作符(Operators)、数字(Numbers)、字符串(Strings)、注释(Comments)、标识符(Identifiers)和关键字(Keywords)等。
1、空白符(Whitespace)
在VerilogHDL代码中,空白符包括:
空格、tab、换行和换页。
空白符使代码错落有致,阅读起来更方便。
在综合时空白符被忽略。
2、注释(Comments)
在VerilogHDL程序中有两种形式的注释,一种是以“/*”符号开始,“*/”符号结束,在两个符号之间的语句都是注释语句,称为多行注释;另一种以“//”开始到本行结束,不允许续行,称为单行注释。
3、标识符(Identifiers)
标识符用于定义模块名、端口名、信号名等。
VerilogHDL中的标识符可以是任意一组字母、数字、$符号和_符号(下划线)的组合,但标识符的第一个字符必须是字母或下划线,且区分大小写。
此外,VeerilogHDL定义了一系列保留字,叫做关键字,小写的关键字是保留字,不能作为标识符使用。
例如以下几个是合法的标识符:
COUNT
Count
R56_56
FIVE$
而下面几个例子则是不正确的标识符:
30count
Out*
or
还有一类标识符称为转义标识符(Escapedidentifiers),转义标识符以符号“\”开头,以空白符结尾,可以包含任何字符。
比如:
\7400
\~*#@se^
反斜线和结束空白符并不是转义标识符的一部分。
如标识符“\Output”和标识符“Output”恒等。
4、书写规范建议
以下是一些书写规范的要求:
(1)用有意义的、有效的名字如sum、cpu_addr等;
(2)用下划线区分词;
(3)采用一些前缀或后缀,如时钟采用clk前缀:
clk_50;低电平采用_n后缀:
enable_n;
(4)统一一定的缩写,如全局复位信号用rst等;
(5)同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致;
(6)自定义的标识符不能与保留字同名;
(7)参数采用大写,如SIZE。
§3.2VerilogHDL的数字值集合
1、值集合
VerilogHDL中规定了四种基本的值类型:
0:
逻辑0或“假”;
1:
逻辑1或“真”;
X:
未知值;
Z:
高阻。
注意:
1)、在门的输入或一个表达式中为“z”的值通常解释成“x”;
2)、x值和z值都是不分大小写的。
2、常量
在程序运行过程中,值不能被改变的量称为常量(constants),VerilogHDL中的常量主要有如下3种类型:
●整型;
●实型;
●字符串型。
(1)、整型(integer)
整型数通常按如下方式书写:
+/-’
即:
+/-<位宽>’<进制><数字>
其中,进制主要有如下四种形式:
●二进制(b或B);
●十进制(d或D或默认);
●十六进制(h或H);
●八进制(o或O)。
注意:
1)、书写中,十六进制中的a~f与值x和z一样,不区分大小写。
如8’h0e和8’h0E一样,都表示位宽为八位的十六进制0e。
2)在较长的数之间可用下划线分开,如10’b11_0000_1100。
下划线符号“_”可以随意用在整数或实数中,它们本身没有意义,只是用来提高可读性。
但数字的第一个字符不能是下划线“_”,下划线也不可以用在位宽和进制处,只能用在具体的数字之间。
3)当没有说明位宽时,默认值为32位。
4)x(或z)代表的宽度取决于所用的进制。
如在二进制中代表1位x(或z),在八进制中代表3位x(或z),在十六进制中则代表4位x(或z)。
如8’h8x代表8’b1000xxxx。
5)如果没有定义一个整数型的长度,数的长度为相应值中定义的位数。
如’O789表示的是9位八进制数。
6)如果定义的长度比常量指定的长度长,通常在左边填0补位。
但是如果最左边一位为x或z,就相应地用x(或z)补位,如10’b10表示10位二进制数10’b0000000010,10’bx01表示10位二进制数10’bxxxxxxxx01;如果长度定义的比实际的位数小,那么左边的位被截掉。
如3’b1001_0011与3’b011相等。
7)在数字的表示中,字符“?
”和x(或z)是完全等价的,可互相替代。
8)整数可以带符号(正负号),并且正负号应写在最左边,负数通常表示为二进制补码的形式。
9)在位宽和“’”之间,以及进制和数值之间允许出现空格,但“’”和进制之间以及数值之间是不允许出现空格的。
(2)实型(real)
实数有两种表示方法:
1)十进制表示法
例如:
2.1
6.657
0.1//以上3例为合法的实数表示形式
2.//非法:
小数点两侧都必须有数字
2)科学计数法
例如:
436.1e2//其值为43610.0
4e-5//其值为0.00004
VerilogHDL语言定义了实数转换为整数的方法。
实数通过四舍五入转换为最相近的整数。
(3)字符串(Strings)
字符串是双引号内的字符序列。
字符串不能分成多行书写。
如:
“ThisismyfirstlessonforVerilogHDL”
字符串变量属于reg型变量,用8位ASCII值表示。
如:
reg[1:
8*12]Message
initial
begin
meassage=”Howareyou!
”
字符串中有一类特殊字符,必须用字符“\”说明,如表3.1所示:
特殊字符
说明
\n
换行
\t
TAB键
\\
符号\
\”
符号“
\ddd
八进制数ddd对应的ASCII字符
表3.1特殊字符
3、变量(Variable)
变量(Variable)必须放在过程语句(如initial、always)中,通过过程赋值语句赋值。
变量数据包括4种类型:
寄存器型变量reg、带符号整型变量integer、带符号实型变量real和无符号时间变量time。
其中time主要用于对模拟时间的存储与处理,real主要用于仿真。
(1)reg型
reg型变量是最常用的变量(Variable),其定义格式如下:
reg数据名1,数据名2,…,数据名n;
reg[n-1:
0]数据名1,数据名2,…,数据名n;
reg[n:
1]数据名1,数据名2,…,数据名n;
如下面的reg变量:
rega,b;//定义了两个1位的reg型变量。
reg[7:
0];//定义了一个8位位宽的reg型变量。
reg型变量并不意味着一定对应着硬件上的寄存器或触发器,在综合时,综合器会根据具体情况来确定将其映射成寄存器还是映射成连线。
(2)integer型
integer型变量多用于表示循环变量,比如用来表示循环次数等。
其定义格式为:
integer变量1,变量2,…,变量n;
integer[n-1:
0]变量1,变量2,…,变量n;
integer[n:
1]变量1,变量2,…,变量n;
如下面是integer型变量定义的例子:
integeri,j;
integer[31:
0]Q;
注意:
integer型变量不能作为位向量进行访问,例如Q[5]和Q[3:
0]都是错误的。
4、参数Parameter
在VerilogHDL语言中,也可以用参数parameter来定义符号常量,其格式为:
parameter参数名1=表达式1,参数名2=表达式2,…,参数名n=表达式n;
例如:
parametermsb=8,f=18;//定义了两个常数参数
parameteraverage_delay=(msb+f)/2;