基于fpga的任意小数分频器Word文档格式.docx
《基于fpga的任意小数分频器Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于fpga的任意小数分频器Word文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
数字集成电路本身在不断地进行更新换代。
它由早期的管、、小中规模集成电路,发展到超大规模集成电路(C,几万门以上)以及许多具有特定功能的专用集成电路。
但是,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。
系统设计师们更愿意自己设计专用集成电路(),而且希望ASIC的设计周期尽可能短,最好是在实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用之中,因而出现了现场(FPLD),其中应用最广泛的当属(FPGA)和复杂可编程逻辑器件(CPLD)。
1.发展历史
早期的可编程逻辑器件只有可编程只读(PROM)、紫外线可擦除(EPROM)和电可擦除只读存储器(E2PROM)三种。
由于结构的限制,它们只能完成简单的数字逻辑功能。
其后出现了一类结构上稍复杂的可编程芯片,即可编程逻辑器件(PLD),它能够完成各种数字逻辑功能。
典型的PLD由一个“与”门和一个“或”门阵列组成,而任意一个组合逻辑都可以用“与—或”表达式来描述,所以PLD能以乘积和的形式完成大量的组合逻辑功能。
这一阶段的产品主要有PAL(可编程阵列逻辑)和GAL(通用阵列逻辑)。
PAL由一个可编程的“与”平面和一个固定的“或”平面构成,或门的输出可以通过有选择地被置为寄存状态。
PAL器件是现场可编程的,它的实现工艺有反熔丝技术、EPROM技术和E2PROM技术。
还有一类结构更为灵活的逻辑器件是可编程逻辑阵列(PLA),它也由一个“与”平面和一个“或”平面构成,但是这两个平面的连接关系是可编程的。
PLA器件既有现场可编程的,也有掩膜可编程的。
在PAL的基础上又发展了一种通用阵列逻辑(GAL,GenericLogic),如、等。
它采用了E'PROM工艺,实现了电可擦除、电可改写,其输出结构是可编程的逻辑宏单元,因而它的设计具有很强的灵活性,至今仍有许多人使用。
这些早期的PLD器件的一个共同特点是可以实现速度特性较好的逻辑功能,但其过于简单的结构也使它们只能实现规模较小的电路。
为了弥补这一缺陷,20世纪80年代中期,和分别推出了类似于PAL结构的扩展型CPLD(ComplexProgrammableLogicDvice)和与标准门阵列类似的FPGA(FieldProgrammableGateArray),它们都具有体系结构和逻辑单元灵活、集成度高以及适用范围宽等特点。
这两种器件兼容了PLD和通用门阵列的优点,可实现较大规模的电路,编程也很灵活。
与门阵列等其他ASIC(ApplicationSpecificIC)相比,它们又具有设计开发周期短、设计制造成本低、先进、标准产品不需测试、质量稳定以及可实时在线检验等优点,因此被广泛应用于产品的原型设计和产品生产(一般在10000件以下)之中。
几乎所有应用门阵列、PLD和中小规模通用数字集成电路的场合均可应用FPGA和CPLD器件。
FPGA是英文FieldProgrammableGateArry的缩写,即现场可编程门阵列,它是在PAL、GAL、EPLD等可件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
2.FPGA的基本特点
FPGA采用了逻辑单元阵列(L,LogicCellArry)这样一个新概念,内部包括可配置逻辑模块(CLB,ConfigurableLogicBlock)、输入(IOB,InputBlock)和内部连线(Interconnect)三个部分。
FPGA的基本特点主要有:
(1)采用FPGA设计ASIC电路,用户不需要投片生产就能得到合用的芯片;
(2)FPGA可做其他全定制或半定制ASIC电路的试样片:
(3)FPGA内部有丰富的触发器和I/O引脚;
(4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一;
(5)FPGA采用高速CH工艺,功耗低,可以与CMOS、TTL电平兼容。
可以说,FPGA芯片是小批量系统提高系统集成度和可靠性的最佳选择之一。
目前FPGA的品种很多,有的xc系列、TI公司的TPC系列、公司的FIEX系列等。
FPGA是由存放在片内RAM中的程序来设置其工作状态的。
因此,工作时需要对片内的RAM进行编程。
用户可以根据不同的配置模式采用不同的编程方式。
加电时,FPGA芯片将EPROM中的数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。
掉电后,FPGA恢复成白片,内部逻辑关系消失。
因此,FPGA能够反复使用。
FPGA的编程不需专用的FPGA编程器,只需用通用的EPROM、PROM编程器即可。
当需要修改FPGA功能时,只需换一片EPROM即可。
这样,同一片FPGA、不同的编程数据,可以产生不同的电路功能。
因此,FPGA的使用非常灵活。
FPGA有下面4种配置模式:
(1)并行主模式为一片FPGA加一片EPROM的方式;
(2)主从模式可以支持一片PROM编程多片FPGA:
(3)串行模式可以采用串行PROM编程FPGA;
(4)外设模式可以将FPGA作为的外设,由微对其编程。
3.FPGA的优点
FPGA芯片都是特殊的ASIC芯片,除了具有ASIC的特点之外,还具有以下3个优点。
①随着超大规模集成电路(V,VeryLargeScaleIC)工艺的不断提高,单一芯片内部可以容纳上百万个晶体管,FPGA/CPLD芯片的规模也越来越大,其单片逻辑门数已达到上百万门,它所能实现的功能也越来越强,同时也可以实现系统集成。
②FPGA/CPLD芯片在出厂之前都做过百分之百的测试,不需要设计人员承担投片风险和费用,设计人员只需在自己的实验室里就可以通过相关的软硬件环境来完成芯片的最终功能设计。
所以,FPGA/CPLD的资金投入小,节省了许多潜在的花费。
③用户可以反复地编程、擦除、使用或者在外围电路不动的情况下用不同的软件实现不同的功能。
所以,用FPGAiCPLD试制样片,能以最快的速度占领市场。
FPGA/CPLD软件包中有各种输入工具和仿真工具及版图设计工具和编程器等全线产品,电路设计人员在很短的时间内就可完成电路的输入、编译、优化、仿真,直至最后芯片的制作。
当电路有少量改动时,更能显示出FPGA/CPLD的优势。
电路设计人员使用FPGA/CPLD进行电路设计时,不需要具备专门的IC(集成电路)深层次的知识,FPGA/CPLD软件易学易用,可以使设计人员更能集中精力进行电路设计,快速将产品推向市场。
4、FPGA与CPLD的区别
尽管FPGA和CPLD都是可编程ASIC器件,有很多共同特点,但由于CPLD和FPGA结构上的差异,具有各自的特点:
①CPLD更适合完成各种算法和组合逻辑,FPGA更适合于完成时序逻辑。
换句话说,FPGA更适合于触发器丰富的结构,而CPLD更适合于触发器有限而乘积项丰富的结构。
②CPLD的连续式布线结构决定了它的时序延迟是均匀的和可预测的,而FPGA的分段式布线结构决定了其延迟的不可预测性。
③在编程上FPGA比CPLD具有更大的灵活性。
CPLD通过修改具有固定内连电路的逻辑功能来编程,FPGA主要通过改变内部连线的布线来编程;
FPGA可在逻辑门下编程,而CPLD是在逻辑块下编程。
④FPGA的集成度比CPLD高,具有更复杂的布线结构和逻辑实现。
⑤CPLD比FPGA使用起来更方便。
CPLD的编程采用E2PROM或FASTFLASH技术,无需外部存储器芯片,使用简单。
而FPGA的编程信息需存放在外部存储器上,使用方法复杂。
⑥CPLD的速度比FPGA快,并且具有较大的时间可预测性。
这是由于FPGA是门级编程,并且CLB之间采用分布式互联,而CPLD是逻辑块级编程,并且其逻辑块之间的互联是集总式的。
⑦在编程方式上,CPLD主要是基于E2PROM或FLASH存储器编程,编程次数可达1万次,优点是系统断电时编程信息也不丢失。
CPLD又可分为在编程器上编程和在系统编程两类。
FPGA大部分是基于SRAM编程,编程信息在系统断电时丢失,每次上电时,需从器件外部将编程数据重新写入SRAM中。
其优点是可以编程任意次,可在工作中快速编程,从而实现板级和系统级的动态配置。
⑧CPLD保密性好,FPGA保密性差。
⑨一般情况下,CPLD的功耗要比FPGA大,且集成度越高越明显。
随著复杂可编程逻辑器件(CPLD)密度的提高,数字器件设计人员在进行大型设计时,既灵活又容易,而且产品可以很快进入市常许多设计人员已经感受到CPLD容易使用。
时序可预测和速度高等优点,然而,在过去由于受到CPLD密度的限制,他们只好转向FPGA和ASIC。
现在,设计人员可以体会到密度高达数十万门的CPLD所带来的好处。
二、VerilogHDL的基础语言知识
1、HDL指南
1.1模块
模块是Verilog的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。
一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述;
设计的数据流行为使用连续赋值语句进行描述;
时序行为使用过程结构描述。
一个模块可以在另一个模块中使用。
在模块中,可用下述方式描述一个设计:
1)数据流方式;
2)行为方式;
3)结构方式;
4)上述描述方式的混合。
1.2时延
VerilogHDL模型中的所有时延都根据时间单位定义。
下面是带时延的连续赋值语句实例。
assign#2Sum=A^B;
#2指2个时间单位。
1.3数据流描述方式
用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值语句。
在连续赋值语句中,某个值被指派给线网变量。
连续赋值语句的语法为:
assign[delay]LHS_net=RHS_expression;
右边表达式使用的操作数无论何时发生变化,右边表达式都重新计算,并且在指定的时延后变化值被赋予左边表达式的线网变量。
时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。
如果没有定义时延值,缺省时延为0。
请注意连续赋值语句是如何对电路的数据流行为建模的;
这种建模方式是隐式而非显式的建模方式。
此外,连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出现的顺序无关。
1.4行为描述方式
设计的行为功能使用下述过程语句结构描述:
1)initial语句:
此语句只执行一次。
2)always语句:
此语句总是循环执行,或者说此语句重复执行。
只有寄存器类型数据能够在这两种语句中被赋值。
寄存器类型数据在被赋新值前保持原有值不变。
所有的初始化语句和always语句在0时刻并发执行。
在顺序过程中出现的语句是过程赋值模块化的实例。
模块化过程赋值在下一条语句执行前完成执行。
过程赋值可以有一个可选的时延。
时延可以细分为两种类型:
1)语句间时延:
这是时延语句执行的时延。
2)语句内时延:
这是右边表达式数值计算与左边表达式赋值间的时延。
1.5结构化描述形式
在VerilogHDL中可使用如下方式描述结构:
1)内置门原语(在门级);
2)开关级原语(在晶体管级);
3)用户定义的原语(在门级);
4)模块实例(创建层次结构)。
1.6混合设计描述方式
在模块中,结构的和行为的结构可以自由混合。
也就是说,模块描述中可以包含实例化的门、模块实例化语句、连续赋值语句以及always语句和initial语句的混合。
它们之间可以相互包含。
来自always语句和initial语句(切记只有寄存器类型数据可以在这两种语句中赋值)的值能够驱动门或开关,而来自于门或连续赋值语句(只能驱动线网)的值能够反过来用于触发always语句和initial语句。
2、语言
2.1标识符
Verilog
HDL中的标识符(identifier)可以是任意一组字母、数字、$符号和_(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线。
另外,标识符是区分大小写的。
转义标识符(escapedidentifier)可以在一条标识符中包含任何可打印字符。
转义标识符以\
(反斜线)符号开头,以空白结尾(空白可以是一个空格、一个制表字符或换行符)。
VerilogHDL定义了一系列保留字,叫做关键词,它仅用于某些上下文中另外,转义标识符与关键词并不完全相同。
标识符\initial与标识符initial(这是个关键词)不同。
注意这一约定与那些转义标识符不同。
2.2注释
在VerilogHDL中有两种形式的注释。
/*第一种形式:
可以扩展至
多行*/
//第二种形式:
在本行结束。
2.3格式
VerilogHDL区分大小写。
也就是说大小写不同的标识符是不同的。
此外,Verilog
HDL是自由格式的,即结构可以跨越多行编写,也可以在一行内编写。
白空(新行、制表符和空格)没有特殊意义
2.4系统任务和函数
以$字符开始的标识符表示系统任务或系统函数。
任务提供了一种封装行为的机制。
这种机制可在设计的不同部分被调用。
任务可以返回0个或多个值。
函数除只能返回一个值以外与任务相同。
此外,函数在0时刻执行,即不允许延迟,而任务可以带有延迟。
$display("
Hi,youhavereachedLTtoday"
);
/*$display系统任务在新的一行中显示。
*/
$time
//该系统任务返回当前的模拟时间。
2.5编译指令
以`(反引号)开始的某些标识符是编译器指令。
在Verilog
语言编译时,特定的编译器指令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其它的不同编译程序指令。
完整的标准编译器指令如下:
*`define,`undef
*`ifdef,`else,`endif
*`default_nettype
*`include
*`resetall
*`timescale
*`unconnected_drive,`nounconnected_drive
*`celldefine,`endcelldefine
2.6值集合
VerilogHDL有下列四种基本的值:
1)0:
逻辑0或“假”
2)1:
逻辑1或“真”
3)x:
未知
4)z:
高阻
注意这四种值的解释都内置于语言中。
如一个为z的值总是意味着高阻抗,一个为0的值通常是指逻辑0。
在门的输入或一个表达式中的为“z”的值通常解释成“x”。
此外,x值和z值都是不分大小写的,也就是说,值0x1z与值0X1Z相同。
Verilog
HDL中的常量是由以上这四类基本值组成的。
VerilogHDL中有三类常量:
1)整型
2)实数型
3)字符串型
下划线符号(_)可以随意用在整数或实数中,它们就数量本身没有意义。
它们能用来提高易读性;
唯一的限制是下划线符号不能用作为首字符。
2.6.1整型数
整型数可以按如下两种方式书写:
1)简单的十进制数格式
2)基数格式
1).简单的十进制格式
这种形式的整数定义为带有一个可选的“+”(一元)或“-”(一元)操作符的数字序列。
下面是这种简易十进制形式整数的例子。
32十进制数32
-15十进制数-15
这种形式的整数值代表一个有符号的数。
负数可使用两种补码形式表示。
因此32在5位的二进制形式中为10000,在6位二进制形式中为110001;
-15在5位二进制形式中为10001,在6位二进制形式中为110001。
2).基数表示法
这种形式的整数格式为:
[size]'
basevalue
size
定义以位计的常量的位长;
base为o或O(表示八进制),b或B(表示二进制),d或D(表示十进制),h或H(表示十六进制)之一;
value是基于base的值的数字序列。
值x和z以及十六进制中的a到f不区分大小写。
2.6.2实数
实数可以用下列两种形式定义:
1)十进制计数法;
例如
2.0
5.678
11572.12
0.1
2.//非法:
小数点两侧必须有1位数字
2)科学计数法;
这种形式的实数举例如下:
23_5.1e2其值为23510.0;
忽略下划线
3.6E2360.0(e与E相同)
5E-40.0005
Verilog语言定义了实数如何隐式地转换为整数。
实数通过四舍五入被转换为最相近的整数。
2.6.3字符串
字符串是双引号内的字符序列。
字符串不能分成多行书写。
例如:
"
INTERNALERROR"
REACHED->
HERE"
反斜线(\)用于对确定的特殊字符转义。
\n换行符
\t制表符
\\字符\本身
\"
字符"
\206八进制数206对应的字符
2.7数据类型
VerilogHDL有两大类数据类型。
1)线网类型。
nettype
表示Verilog结构化元件间的物理连线。
它的值由驱动元件的值决定,例如连续赋值或门的输出。
如果没有驱动元件连接到线网,网线的缺省值为z。
2)寄存器类型。
register
type表示一个抽象的数据存储单元,它只能在always语句和initial语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。
寄存器类型的变量具有x
的缺省值。
2.7.1线网类型
线网数据类型包含下述不同种类的线网子类型。
*wire
*tri
*wor
*trior
*wand
*triand
*trireg
*tri1
*tri0
*supply0
2.7.2向量和标量线网
在定义向量线网时可选用关键词scalared或vectored。
如果一个线网定义时使用了关键词vectored,
那么就不允许位选择和部分选择该