为缓解我国电子信息产业快速发展与核心技术人才紧缺的矛盾,中电网(ChinaECNet)在信息产业部的支持下,联合国际著名集成电路设计厂商和清华大学等国内顶级高校,隆重推出电子工程与集成电路技术培训项目。所开课程包括FPGA/PLD、数字处理器、嵌入式
SoC 以及模拟和射频技术等。其中,FPGA培训是与Altera公司和清华大学共同推出的,并最先开课。本刊将陆续整理培训的精华内容与读者分享。更多详情敬请登录http://training.chinaecnet.com/。
FPGA器件的选型
FPGA器件的选择通常要根据系统需求来决定,涉及器件的生产厂家和类型。同时,还要根据设计项目的需求,考虑成本、功耗、计算能力等指标。此外,还要对性能进行评估,如软件的仿真与性能的初步比较,然后对系统设计进行FPGA调试。
FPGA器件的参数和指标大致包括:逻辑单元的数量、等效逻辑门数量、可用I/O数量以及片内存储资源的多少。附加资源包括:时钟管理、锁相环和延时锁定环、高速I/O接口、嵌入式硬件乘法器或DSP单元、处理器硬IP核、其他硬IP核以及各种软IP核。其他指标涉及器件的速度等级、功耗、成本、设计安全性,还有温度范围、抗干扰能力、体积、封装、工艺等。
鉴于FPGA型号的选择涉及的因素较多,通常需要参考厂家的数据表,了解各项参数和性能指标。为保证较好的可扩展性和可升级性,在选型时应留出一定的资源空间,进行系统硬件资源需求的评估。
在尺寸受限的器件中,可采用Stratix II FPGA实施高密度逻辑设计,得到更高的性能和更好的信号完整性。无论设计是在单个器件中进行ASIC原型开发,还是面向批量生产,都能从使用Stratix
II FPGA中获益,需要时可以移植为HardCopy II结构化ASIC。Stratix II关键特性包括:
一种创新的逻辑结构
丰富的特性,如高性能DSP模块和片内存储器
高速I/O引脚和外部存储器接口
Altera 的Cyclone II FPGA低成本产品线能根据客户要求提供多种功能,为价格敏感的应用提供大批量产品解决方案。
Cyclone II器件采用TSMC 90nm低k绝缘工艺,在300mm圆晶片上生产,具有很高的性能和极低的功耗,而价格和ASIC相当。
MAX II器件基于新的突破性CPLD体系结构,在所有CPLD系列中,其每I/O引脚成本最低,功耗也最低。与前代MAX器件相比,MAX
II器件成本减半,功耗是其十分之一,而密度是其4倍,性能提高了一倍。该瞬时启动、非易失器件系列面向通用控制逻辑应用,不仅可以实现传统CPLD设计的低成本,还有助于改善更高密度器件的成本和功耗,能使用MAX
II器件来替代高成本、高功耗的ASSP和标准逻辑器件。
Altera HardCopy系列是业界引人注目的结构化ASIC方案,其独特的FPGA前端设计流程能在最终投片之前,使用Altera
Stratix系列高密度、高性能FPGA来开发、验证和完成系统设计。HardCopy系列具有产品开发灵活性和及时面市的优势。
在选择好FPGA器件后,就要根据其特性,为其选择合适的电源芯片、片外存储器芯片并配置信息存储器。在系统设计和开发阶段,应尽量选择升级空间大、管脚兼容、FPGA芯片手册上推荐的器件。在产品开发的后期,可以根据情况考虑将这些外围器件替换为其他兼容器件以降低成本。所以,在设计上应尽量先选择门数多、可编程的器件。
利用FPGA进行系统设计
利用FPGA进行系统设计可分为设计输入阶段、系统功能仿真、设计处理、时序仿真和器件编程测试等几大步骤,见图1。
图1 FPGA设计流程图(略)
第一步:设计输入阶段。系统或设计电路要按开发系统的要求表示出来,并送入计算机。设计输入通常有以下几种方式:
(1)原理图输入:直观,符合思维习惯,要求设计者具有丰富的硬件知识,但效率低,通用性差。
(2)硬件描述语言输入:效率高、通用性强、不必对底层硬件非常熟悉。
(3)波形输入:辅助的输入方式。
第二步:系统功能仿真。在设计输入阶段,要用硬件描述语言对设计系统功能进行仿真。设计的电路必须在编译之前进行逻辑功能验证,此时的仿真没有延时信息,对于初步功能的检测非常方便。功能仿真要先利用波形编辑器和硬件描述语言等建立波形文件和测试向量,仿真的结果将生成报告文件和输出信号波形,从中可查看各个节点的信号变化。如果发现错误,则需要返回设计输入阶段,修改逻辑设计。功能仿真是对设计输入功能的结果做一个逻辑仿真,检查在功能上是否合理。
第三步:设计处理。设计处理是FPGA设计的核心环节,包括对系统进行优化、综合、适配、分割、布局、布线等。在设计处理过程中,编译的软件对设计输入文件进行逻辑简化、综合优化和适配,最后产生用于编程的编程文件。根据FPGA结构,把总的电路图分配到各个逻辑单元,分割完毕,进行布线把各种单元连接起来,最后得到一个带延迟性的设计。
第四步:时序仿真。由于不同器件内部的延时不同,布局布线方案对延时造成不同的影响。设计实现后,对系统各个模块进行时序仿真,分析延时、评估设计性能并检查和消除竞争与冒险。这个过程就是时序仿真,只有带延时的延时参数才能进行时序仿真。
第五步:器件编程与测试。时序仿真完成后,软件产生供器件编程使用的数据文件。器件的编程就是将编程数据下载到相应的FPGA器件中。器件编程需要满足一定的条件,如编程电压、编程时序、编程算法等。一次性编程的FPGA需要专用的编程器EPROM或其他的存储器进行配置。在线可编程的FPGA器件不需要专门的编程器,只需要一根编程下载电缆就可以对器件进行编程。器件编程完毕后,可以用编译时产生的文件对器件进行校验和加密。对于支持JTAG技术、具有边界扫描能力和在线编程能力的器件来说,测试更加方便。
按照FPGA器件配置电路的角色不同,有以下三种方式将配置数据下载到FPGA中:
(1)FPGA主动模式:由目标FPGA主动输出控制和时钟信号,读取配置芯片中的配置数据。主动模式FPGA会产生一个时钟信号,输出到存在配置编程数据的配置芯片,然后读取配置数据并进行校验,决定配置是否正确。
(2)FPGA被动方式:由其他设备驱动控制信号和时钟信号,发起配置信息的下载过程,FPGA只输出一些状态信号来配合配置过程。
(3)JTAG方式: 利用IEEE 1149.1边界扫描测试标准接口对FPGA进行配置。可使用下载电缆或处理器驱动JTAG接口信号。
在器件复杂度和电路板集成度日益增高、电路性能日趋重要的条件下,工业标准IEEE 1149.1边界扫描诞生了。边界扫描测试BST是一种可测试结构技术,在芯片I/O端增加移位寄存器并连接起来,加上时钟复位、测试方式选择以及扫描输入和输出端口,形成边界扫描通道。每个I/O口的寄存器可以连接起来形成移位寄存器。每个IEEE
1149.1兼容的器件,都包括一个4线或5线的测试端口(TAP)、一个状态机(TAP控制器)和由边界扫描单元构成的边界扫描移位寄存器,其中TAP控制器用于控制边界扫描测试的执行。边界扫描描述语言BSDL是VHDL语言的子集,测试软件开发系统使用BSDL文件进行测试生成、分析、故障诊断和在系统编程。
使用JTAG可以进行芯片级、电路板级、系统级测试;允许其他器件收集被测元件的响应信号;具有JTAG性能的芯片可以接连起来,前一级的TDO可以送到下一级的TDA,形成测试链,对芯片及电路板综合系统进行测试。还可以测试芯片内部逻辑、元件之间的互联是否正确。FPGA中的JTAG接口,除支持边界扫描测试外,还具有在系统编程(ISP)和逻辑分析功能。ISC(在系统配置)或ISP是IEEE
1149.1重要的新应用。目前绝大多数FPGA/CPLD器件具有在线编程功能,可用在线测试设备(ICT)或下载电缆,通过JTAG接口在板级对可编程器件进行在线测试和编程,简化制造流程,统一规范。
Altera的IP方案组合包括数百个易于使用的IP内核。IP内核也称作宏功能,是高质量的“构建模块”,可以将其置入到系统设计中,而不必自己编写来生成完整的设计。
Altera IP MegaCore功能是易于使用、经过预先验证、可配置的现成IP内核。这些宏功能针对最新的Altera器件进行优化,由Quartus
II设计软件提供全部支持。此外,做为Altera宏功能合作伙伴计划(AMPPSM)成员的第三方IP主要供应商为Altera器件开发、优化其IP产品,并直接许可给Altera客户。许多AMPP合作伙伴可提供定制集成芯片编程系统(SOPC)解决方案。Altera还与主要的软件供应商建立了合作关系,提供基于处理器的SOPC软件解决方案。
Nios II处理器系列包括三种内核 快速(Nios II /f)、标准(Nios II /s)和经济型(Nios II /e),每一种都针对特定的价格和性能范围进行了优化。这三种内核共享一组通用32位指令集体系结构,百分之百二进制代码兼容。使用Altera
Quartus II设计软件中提供的SOPC Builder工具,可以很容易的将Nios II处理器集成到系统中。
硬件描述语言VHDL
VHDL的两个层次
VHDL包括硬件层次和软件层次,见表1。硬件层次的主要单元是实体(entity),用来定义硬件外部接口;还有一个次级单元结构体(architecture)来实现主要的设计。软件层次由软件包和软件包体组成,软件包对应硬件层次的实体,软件包体对应硬件层次的结构体。
表1:VHDL主要部件(略)
VHDL对移位全加器的描述
移位全加器由半加器组成,半加器也有一个实体(entity)描述,见图2,名称为Half Adder,有port引出口清单,有两个输入位口X、Y,两个输出位口Sum、Carry。半加器的VHDL描述为结构体,有architecture引出的一段程序,有begin和end。硬件系统在条件满足时,各种进程是并发的,进程是描述数字系统并发性的一种方式,由process引出。如果X、Y输入信号到达,XY异或送到半加器的Sum端,XY相与送到半加器的Carry端。这两个输出是Sum信号异或的结果和进位信号Carry相与的结果。
图2 半加器VHDL描述:实体(略)
移位全加器有一个实体提供口清单,它有A、B、carry_in三个输入量,有sum和carry_out两个输出量,见图3。设置变量I,当I=0,如果A=1,进位是1,那么结果是I+1。如果B=1,那么I也加1,如果进位等于1,I也加1。然后确定和信号,决定进位输出信号。这就是移位全加器行为的描述。
图3 全加器外部接口(略)
移位全加器还有一种数据流描述,temp_sum等于A异或B,temp_sum和carry_in异或得到SUM,然后A跟B与,再把temp_sum和temp_carry_in与送到进位输出,见图4。
图4 全加器内部结构(略)
结构方式也可以描述移位全加器,把半加器看成一个元件,通过映射的方式描述结构。结构用到两个元件:一个元件是半加器half adder,另外一个元件是或门
nor gate,把这两个元件按照它的实体方式列出来,结构体开始时分别引用这三个元件V0、V1、V2。V0、V1对应半加器,V2对应或门。然后把相应的信号进行映射,把第一个半加器的X对应全加器的输入信号A,第一个半加器的Y对应全加器的输入信号B。第一个半加器和信号的输出是移位全加器内部信号temp_sum。第一个半加器carry的输出是信号1,用第二个半加器V1把第一个半加器和输出temp_sum输入到第二个半加器的X输入端,把外部的进位输入送到第二个半加器的Y输入端。第二个半加器的输出和SUM就是全加器的信号,第二个半加器的进位输出是temp_carry_2,把temp_carry_1送到或门的I1输入端,把temp_carry_2送到I2输入端,得到的输出就是移位全加器所要的进位输出Carry_out。
在利用when-else语句设计一个二选一多路转换器时,除实体和结构体外,还要用到IEEE标准库以及IEEE 1164的数据类型。作为2选1的选择器,port口引出的口清单有S输入,1164采用的数据类型是Std_logic。有两个输入信号Zero和One,Zero和One的输入模式都是in,数据类型都8位。STD_LOGIC_VECTOR从高位到低位的排列是7到0。口清单有三个输入信号S、Zero、one和一个输出的信号Y,给出二选一黑匣子的外部接口。结构体用begin语句,当X=1的时候,输入信号one输出到Y端。当X=0的时候,输入信号zero送到输出端Y。程序里Library语句用来参考定义的VHDL设计单元,其他的实体或者成组的过程和函数,称为软件包。
移位全加器是Bit类型,只支持两种数值:0和1,对于建立数学模型和进行综合以及仿真,0、1两个数值明显不够。IEEE库包含std_logic_1164,依次说明列举类型std_ulogic,
std_ulogic有9种数字类型U、X、0、1、Z、W、L、H和-。U是没有初始,X是强迫未知,0、1是强0强1,Z是高阻三态,W是弱未知,L
H是弱0弱1,-表示不管。弱0弱1表示上拉和下拉电阻后,电平不是电源电压D。Z代表高阻三态。因此,IEEE 1164软件包的数据类型比0、1两种类型多。
std_logic和std_logic_vector常在VHDL仿真中利用,允许用户保持关于仿真模型本身和描述设计的信息。数字U、X、W和-称为准逻辑metalogic数值,代表一个模型的状态,而不是一个设计的逻辑。在仿真中经常用到U没有初始化、X强迫未知、W弱未知等准逻辑数字。只有0、1、Z和-是综合支持的逻辑值,Z和-为三态逻辑和不定义的值。
实体用来描述定义的模型外部接口,有实体才会引出Port清单。Port清单定义外部信号,包括名称、模式和类型组成。信号模型可为输入in、输出out和双向inout或buffer。在实际应用中,信号类型通常是单位std_logic和总线形式的std_logic_vector。std_logic_vector类型的数组给出信号宽度。实体里的口清单,包括了信号的名称、模式和类型,模式有in和out、inout和buffer四种。如果模式规定为0UT,信号只能输出,不能在结构体内部使用。如果想用这个信号,可设置成Buffer,Buffer信号既可缓冲输出又可在实体内进一步使用。但一般的软件里没有buffer选项,如果把一个信号内部使用,要设置一个内部信号,在结构体内进行描述。out类型的输出信号只能用于输出,不能在结构体里进一步使用。inout双向口必须有控制端决定输入输出。
在利用布尔算符设计二选一多路转换器时,也要用IEEE库,用use IEEE.std_logic_1164.all里软件包的所有过程和函数。结构体设置了8位内部信号temp,不存在输入输出问题,类型STD_LOGIC_VECTOR(7
downto 0)是一个8位的总线信号。结构体的begin和end用输入信号S对8位temp信号进行复制,把temp信号的8位总线信号和8位输入信号one
和1与,再把temp信号取反和zero信号与,两个结果的或送到输入端Y。当X=1,temp为1。和1与时把8位全与出来,送到Y端。如果X=0,temp和1与,全位0。这时temp取反,全位1,和zero与把zero的信号全送出去,同样起到二选一多路开关的作用。
|