基于FPGA CPLD的EDA技术实用教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

项目2 FPGA/CPLD基础开发

一、FPGA/CPLD开发的基本方法

(一)开发流程

FPGA/CPLD的开发流程(见图2.1)和基于处理器的软、硬件开发流程不同,最大特点是迭代性很强,并不是一个简单的顺序流程。在开发设计过程中,设计者在测试验证时一旦发现问题,往往需要回到前面的步骤重新审查、修改,然后重新综合、实现、仿真验证,直到设计符合要求。

图2.1 FPGA/CPLD开发流程

1.功能定义/器件选型

在FPGA/CPLD设计项目开始之前,必须进行系统功能的定义和模块的划分,还要根据任务要求,如系统的功能和复杂度,对工作速度和器件本身的资源、成本以及连线的可布性等进行权衡,选择合适的设计方案和合适的器件类型,建立与具体开发平台相对应的工程,比如当前开发平台是EPM240,则后续的工程开发也应该基于该芯片进行。

2.模块划分

一个项目在整体把握的基础上进行模块划分,不仅有利于分工,更有利于日后的代码升级、维护以及设计的综合优化。模块划分的基本原则是以功能为主,有时也按照数据流来做划分。

建立设计方案时,必须考虑QuartusⅡ软件提供的设计流程。在自顶向下的设计流程中,整个设计只有一个输出网络表,用户可以对整个设计计划进行跨设计边界和结构层次的优化处理,并且管理容易;在自底向上的设计流程中,每个设计模块具有单独的网格表,它允许用户单独编译每个模块,且单个模块的修改不会影响到其他模块的优化。基于块的设计流程使用EDA设计输入和综合工具分别设计和综合各个模块,然后将各模块整合到QuartusⅡ软件的最高层设计中。用户可根据实际情况灵活使用各种设计方法。

3.设计输入方式

创建好工程后,需要给工程添加设计输入文件。设计输入可以使用文本形式的文件(如AHDL、VHDL、Verilog HDL等)、存储器数据文件(如HEX、MIF等)、原理图输入以及第三方EDA工具产生的文件(如HDL、EDIF、VQM等)。同时还可以混合使用集中设计输入方式进行设计。

(1)Verilog HDL/VHDL硬件描述语言设计输入方式

硬件描述语言HDL设计法是大型模块化设计工程最常用的设计方法。目前较为流行的HDL语言有Verilog HDL、VHDL等,其共同的特点是易于使用自顶向下的设计方法,易于进行模块划分和复用,移植性强,通用性好,设计流程不因芯片工艺和结构的改变而变化,利于ASIC的移植。HDL采用纯文本文件格式,用任何编辑器都可以编辑。

(2)AHDL输入方式

AHDL是完全集成到QuartusⅡ软件系统中的一种高级模块化语言,可以用QuartusⅡ软件文本编辑器或者其他的文本编辑器产生AHDL文件。AHDL语言只能用于采用Altera器件的FPGA/CPLD设计,其代码不能移植到其他厂商器件(如Xilinx、Lattice等)上使用,通用性不强。

(3)模块/原理图输入方式

模块/原理图输入方式是FPGA/CPLD设计的基本方法之一,几乎所有的设计环境都集成有模块/原理图输入方式。这种设计方式直观、易用,支撑它的是一个功能强大、分门别类的器件库。由于器件库元件通用性差,因此其移植性差,如果更换芯片,整个原理图需要做很大修改,甚至是全部重新设计,所以这种设计方式主要是混合设计中的一种辅助设计方式。

(4)使用Mega Wizard Plug-In Maneger产生IP核/宏功能块

Mega Wizard Plug-In Maneger工具的使用基本可以分为以下几个过程:工程的创建和管理,查找适用的IP核/宏功能模块,参数设计与生成,IP核/宏功能模块的仿真与综合。

4.逻辑综合

逻辑综合是将较高层次的电路描述转化为较低层次的电路描述。具体地说,就是将设计代码翻译成最基本的与门、或门、非门及RAM、触发器等基本逻辑单元的连接关系(网表)。同时分析出逻辑设计中的I/O引脚,以便后续进行I/O引脚的分配。

5.布局布线

布局布线可理解为利用实现工具把逻辑映射到目标器件结构资源中,确定逻辑的最佳布局,选择连接逻辑单元与输入输出单元的布线通道进行连线,并产生相应文件(如配置文件与相关报告)。实现是将综合生成的逻辑网表配置到具体的FPGA/CPLD芯片上,布局布线是其中最重要的过程。布局将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上,并且往往需要在速度最优和面积最优之间作出选择。布线是根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。目前,FPGA/CPLD的结构非常复杂,特别是在有时序约束条件时,需要利用时序驱动的引擎进行布局布线。布线结束后,软件工具会自动生成报告,提供有关设计中各部分资源的使用情况。由于只有FPGA/CPLD芯片生产商对芯片结构最为了解,所以布局布线必须选择芯片开发商提供的工具。

6.仿真

仿真的目的就是在软件环境下,验证电路的行为和设想中的是否一致。一般在FPGA/CPLD中,仿真分为功能仿真和时序仿真。功能仿真在设计输入之后,在进行综合、布局布线之前实施的仿真,又称为行为仿真或前仿真,是在不考虑电路逻辑门的时间延迟,只考虑电路在理想环境下的行为和设计构想的一致性;时序仿真又称为后仿真,是在综合、布局布线后,即电路已经映射到特定的工艺环境后,在考虑器件延时的情况下对布局布线的网表文件进行的仿真。

7.编程与配置

设计的最后一步就是芯片编程与调试。芯片编程是指产生要使用的数据文件(位数据流文件),然后将编程数据下载到FPGA/CPLD芯片中进行验证或使用。芯片编程需要满足一定的条件,如编程电压、编程时序和编程算法等。

(二)原理图输入

QuartusⅡ软件原理图输入包括原理图编辑、文本编辑、混合编辑。原理图和图表模块编辑是自顶向下设计的主要方法。

1.原理图编辑

(1)内附逻辑函数

原理图编辑主要在符号的引入和线的连接。需要引入的逻辑函数存放在三个不同的目录,分为primitives(基本逻辑函数,包括基本逻辑单元、管脚、电源、接地端、缓冲逻辑单元等)、others(其他许多常用的逻辑函数,包括7400、7496等)、megafunctions(参数化宏模块)三类。

(2)编辑规则

①脚位名称。脚位命名可用英文字母的大写或是小写、阿拉伯数字,或者是一些特殊符号:“/”“-”“_”等。名称中英文大小写的意义相同,即abc和aBc代表相同的管脚名称。另外在同一个设计文件中不能有重复的脚位名称。

②节点名称。在QuartusⅡ中,只要器件连接线的节点名称相同,就会默认是连接的。节点(Node)的命名操作方法是:选中要添加节点的直线→单击鼠标右键→选中“properties”选项→在对话框中的“General”选项页中添加节点名称。

③总线名称。总线(bus)代表很多节点的组合。总线命名的方法与节点相同,但命名时,必须要在名称的后面加上“[a..b]”,表示一条总线内所含有的节点编号,其中a和b必须是整数。

④文件扩展名。文件扩展名为“.bdf”。

(3)原理图和图表模块编辑工具

原理图和图表模块编辑工具见图2.2。

图2.2 原理图和图表模块编辑工具

分离窗口:单击此按钮可以将当前窗口与QuartusⅡ主窗口分离。

选择:可以选取、移动、复制对象。

文字:文字编辑工具,通常在制定名称或批注时使用。

符号:用于添加工程所需要的各种原理图函数和符号。

图表模块:添加一个图标模块,用户可定义其输入和输出及一些相关参数,用于自顶向下的设计。

正交节点:可以画垂直或水平的连线,同时可以定义节点名称。

正交总线:可以画垂直或水平的总线。

正交管道:用于模块之间的连接和映射。

橡皮筋:选中此项,移动图形元件时脚位与连线不断开。

部分线选择:选中此项后,可以选择局部连线。

放大/缩小:用于放大或缩小原理图,选中此项后单击鼠标左键为放大,单击鼠标右键为缩小。

全屏:单击此按钮后,原理图编辑器窗口为全屏显示。

查找:用于查找节点、总线、元件等。

元件翻转:包括水平翻转、垂直翻转和90度逆时针翻转。

画图:分为画矩形、圆形、直线和弧线工具。

2.原理图编辑流程

(1)创建新的工程文件

①指定工程名称。选择菜单“Flie”→“New Project Wizard”命令。新建工程向导对话框,如图2.3所示。

图2.3 指定工程名称

建立项目工程要完成的工作包括制定项目目录、名称和项目实体,指定项目设计文件,指定设计的Altera器件系列,指定其他用于该项目的EDA工具,建立项目信息报告。

任何一项设计都是一项工程,必须首先为工程建立一个放置所有与此工程相关的文件的文件夹,同一个项目的所有文件都必须放到同一个文件夹中,一般来说,不同的设计项目最好放在不同的文件夹中。

单击“Next”按钮,进入图2.4所示对话框,在图中从上到下的各个文本框分别输入新工程的文件夹名称、当前工程和顶层实体的名称(注意:工程名要和顶层实体名称一致),在此例中工程名为“add”。

图2.4 设置工程名

②选择需要加入的文件和库。在图2.4中单击“Next”按钮(若文件夹不存在,系统会自动提示用户是否创建该文件夹,选择“Next”后会自动建立),弹出图2.5所示对话框。如果此设计中包括其他设计文件,可以在“File name”栏框选择文件,或者单击“Add All”按钮,加入该目录下的所有文件。如果需要用户自定义库,则单击“User Libraries”按钮来选择。如果没有需要添加的文件和库,可以不选,直接单击“Next”按钮即可。

图2.5 选择文件和库

③选择目标器件。单击“Next”按钮,出现目标器件窗口,见图2.6,在“Target device”选项下选择“Auto device selected by the Filter”选项,系统会自动给所设计的文件分配一个器件。如果选择“Specific device selected in ‘Available device’ list”选项,用户需指定目标器件。在右侧的选择项下可以选择器件的封装类型(Package)、引脚数量(Pin count)和速度等级(Speed grade),快速查找用户需要指定的器件。本例中选择ACEX1K系列下的EP1K30TC144-1。

图2.6 选择元器件

④选择第三方EDA工具。单击“Next”按钮→进入第三方工具选择对话框,没有第三方工具可以不选,见图2.7。

图2.7 选择第三方工具

⑤结束设置。单击“Next”按钮,可以看出工程文件配置的信息报告,见图2.8。单击“Finish”按钮,即完成了当前工程的创建。

图2.8 结束设置

(2)建立文件

选择菜单命令“File”→“New”,弹出图2.9所示“New”对话框,在“Device Design Files”标签下选择源文件的类型,这里选择“Block Diagram/Schematic File”类型,单击“OK”按钮,即出现图2.10所示的输入元件对话框。

图2.9 “New”对话框

图2.10 输入元件对话框

(3)放置元件符号

在图2.10所示窗口的空白处双击左键,出现图2.11所示的图形编辑窗口,在左侧“Libraries”栏中依次选择“primitives”→“logic”,调入“与”门(and2)、“异或”门(xor)、输入端口(input)、输出端口(output)等元件,可在“Name”文本框中直接输入元件的名字,也可在元件库中直接寻找,调入元件,见图2.12。

图2.11 图形编辑窗口

图2.12 调入元件

(4)连接各元件并命名

选中工具栏中的正交节点按钮,光标自动变成十字形连线的状态,移动光标到门电路的输入端,连接点出现蓝色的小方块,单击鼠标左键,即可看到连线生成。输入信号的名称,将这些元件进行连接,构成半加器,如图2.13所示。

图2.13 半加器

(5)保存文件

单击保存文件按钮,将设计好的半加器原理图存于已建立好的工作目录中。

(6)编译

选择菜单“Processing”→“Start Compilation”,或者单击工具栏按钮,即启动了完全编译,编译完成后,系统会将有关的编译信息显示在窗口中,见图2.14,其中包括警告和出错信息。若有错误,则根据提示再做相应的修改,并重新编译,直到没有错误提示为止。

(7)建立矢量波形文件

图2.14 编译信息

选择菜单命令“File”→“New”,在“New”窗口中选择“Other Files”标签中的“Vector Waveform File”选项,如图2.15所示。单击“OK”按钮完成建立。

图2.15 建立矢量波形文件

(8)添加引脚与节点

在图2.16所示的窗口中选择“Insert Node or Bus…”,会出现如图2.17的窗口,选择“Node Finder…”,弹出图2.18所示的窗口。

图2.16 添加引脚与节点

图2.17 插入的引脚与节点参数

图2.18 引脚与节点选择

在图2.18中单击按钮“List”,然后单击按钮“≫”,再单击“OK”按钮,就可以把节点加入到波形编辑器中,结果见图2.19。

图2.19 添加引脚与节点结果

(9)仿真

在通常设计中,应先做功能仿真来验证逻辑的正确性,后做时序仿真来验证时序是否符合要求。

①功能仿真。如图2.19所示,选择菜单命令“Assignments”→“Settings”,会弹出“Settings”对话框,在“Settings”对话框中单击左侧栏中的“Simulator Settings”选项,在“Simulation mode”下拉菜单中选择“Functional”选项,单击“OK”按钮完成设置。

设置完成后,需要生成功能仿真网络表,选择菜单命令“Processing”→“Generate Functional Netlist”,自动创建功能仿真网络表。最后单击“OK”按钮进行功能仿真。

②时序仿真。Quartus Ⅱ中默认的仿真为时序仿真。

选择菜单命令“Edit”→“End Time”,出现图2.20所示的窗口。可以在“Time”对话框中设置仿真时间。

图2.20 设置仿真时间

选择菜单命令“Edit”→“Grid Size”,出现图2.21所示的窗口。选中“Time Project”选项,设置仿真时每格的时间。

图2.21 设置仿真每格时间

仿真结果如图2.22所示。

图2.22 仿真结果

(10)引脚分配和下载

引脚分配是为了能对所设计的工程进行硬件测试,将I/O信号锁定在器件确定的引脚上。选择菜单命令“Assignments”→“Pin Planner”,出现图2.23所示的窗口,双击表格里面的标签“Location”,可以选择目标引脚的位置,最后完成引脚分配。

图2.23 引脚分配与下载

(11)下载验证

下载验证是将本次设计所生成的文件通过计算机下载到实验箱里,来验证此次设计是否符合要求。

①编译。分配完管脚后,必须再次编译,才能存储这些引脚锁定的信息。单击编译按钮后,若编译器件由于引脚的多重功能出现问题,需要在“Assignments”菜单下选择“Device”选项,在弹出的对话框里单击“Device and Pin Options…”按钮,出现对话框,在“Dual-Purpose Pins”选项下进行设置。

②配置下载电缆。选择菜单命令“Tools”→“Programmer”,在弹出窗口中单击“Hardware Setup…”按钮,弹出“配置下载电缆”对话框,见图2.24,单击“Add Hardware…”按钮,在“Hardware type”栏中选择“USB-blaster”“ByteBlaster MV or ByteBlasterⅡ”,最后单击“OK”按钮,设置完成。

图2.24 配置下载电缆

③JTAG模式下载。JTAG模式是软件的默认下载模式,相应的下载文件为“.sof”格式。单击“Add File…”按钮,浏览添加相应的“.sof”文件,在相应的“Program/Configure”项上打勾,单击“Start”按钮下载程序,见图2.25。

图2.25 JTAG模式下载

④Active Serial Programming模式下载。Active Serial Programming模式的下载文件为“.pof”格式。在图2.26中的“Mode”下拉列表里,选择“Active Serial Programming”,然后浏览添加相应的“.pof”文件,在相应的“Program/Configure”项和“Verify”项上打勾,单击“Start”按钮下载程序。

图2.26 选择Active Serial Programming模式下载

(三)使用分析工具分析

1.使用RTL Viewer分析综合结果

在综合结束后,设计者经常会希望看到综合后的原理图,以分析综合结果是否与所设想的设计一致,这样就会用到RTL Viewer和Technology Map Viewer这两个工具。

(1)打开方法

执行菜单命令:“Tools”→“Netlist”→“RTL Viewer”。

注意:在这之前必须已经执行过综合或全编译。

(2)列表项含义

[Instances],即实例,是指设计中能扩展为低层次的模块或实例。

[Primitives],即原语,是指不能被扩展为低层次的底层节点。用Quartus Ⅱ自带综合器综合时,它包含的是寄存器和逻辑门;而用第三方综合工具综合时,它包含的是逻辑单元。

[Pin],即引脚,是当前层次的I/O端口。

[Nets],即网线,是连接节点(包括实例、源语和引脚)的网线。

(3)放大与缩小视图

[Fit in Window]:视图适应当前窗口大小,在空白处单击右键,选择“Zoom”→“Fit in Window”命令,快捷键:ctrl+W。

[Fit Selection in Window]:放大当前选择到适应窗口,空白处单击右键,选择“Zoom”→“Fit Selection in Window”命令。快捷键:ctrl+shift+W。

(4)过滤原理图

选中任意一节点,单击右键,选择“Filter”命令。参数选项如下。

[Sources],即源,指过滤出所选节点或端口的源端逻辑。

[Destinations],即目标。

[Sources&Destinations],即源和目标。

[Selected Nodes&Nets],所选结点和网线,过滤出已经选择的节点和网线。

[Between Selected Nodes]所选节点之间的逻辑。

注意:在过滤后可以通过单击工程区左侧工具栏按钮回到过滤前的原理图,或者单击左侧列表项,查看其他层次的原理图。

(5)打开不同层次的模板

双击所选模块可以进入下一层次(或空白处单击右键,选择“Hierarchy Down”),单击工程区左侧工具栏按钮回到上一层次(或空白处单击右键,选择“Hierarchy Up”)。

(6)定位到其他工具

空白处单击右键,选择“Locate”,在子菜单中分别有定位与各种工具的选项,当前所选项会定位到所选工具中。

(7)查找节点或网线

空白处单击右键,选择“Find”,查找节点或网线。

(8)设置原理图分页

选择菜单命令“Tools”→“Options”,然后选择“Category”中的“Rtl/Technology Map Viewer”。参数选项如下:

[Nodes per page]:设置每面多少个节点;

[Ports per page]:设置每面多少个端口或引脚数。

如果“RTL/Technology Map Viewer”超过了所设定的值,就会自动分成一个新的页面。可以单击原理图空白区,选择“go to”命令,填入页数,到达自己需要的页面。

2.创建原理图

选择菜单命令“File”→“Creat/Update”→“Creat Symbol Files for Current File”,生成“.bsf”格式的图元文件,见图2.27。

图2.27 新建图元

如出现图2.28的提示,即表示创建成功。可以在“Project”栏里看到出现已经生成的文件。这样在以后的原理图设计中就可以将其作为一个模块直接调用。

图2.28 创建成功

3.使用Tcl文件分配管脚

①打开Tcl文件,在用户区修改所要使用的管脚,见图2.29。

图2.29 修改管脚

②选择菜单命令“Tools”→“Tcl Scripts”,单击“Run”按钮。见图2.30。

图2.30 使用Tcl文件分配管脚

③单击编译按钮,即可批量实现管脚分配。