Altium Wiki

Information and resources for electronic product designers

Skip to end of metadata
Go to start of metadata

FPGA设计入门

概要 本章主要介绍如何使用Altium创新电子设计平台进行基本的FPGA设计,包括在Altium Designer中建立FPGA工程;针对Desktop NanoBoard子板上的FPGA器件编译设计;对设计进行分析和处理;完成对FPGA的下载。本章最后对层级设计和虚拟仪器的使用进行了简要的介绍。 Altium创新电子设计平台结合了Altium Designer软件平台和Desktop NanoBoard可重构硬件平台,可提供FPGA实时设计所需的所有工具和技术,包括输入、执行、检查和调试等。 Altium公司的创新电子设计平台完成了底层的细节操作,使设计者能够更关注于器件的智能化和功能的开发。这些开发是支撑产品差异的来源。在进入嵌入式软件智能模块和处理器的世界之前,需要牢固掌握在这个创新环境中进行设计的基本原则――实现最基本的设计并使其在Desktop NanoBoard子板上的FPGA器件中运行。 本章将完成一个简单的计数器设计。当该设计下载到目标子板上的FPGA芯片后,板上的LED持续地从左到右点亮,或者从右到左点亮。通过这个课程,用户将学会FPGA设计的基本知识: 在Altium Designer中建立FPGA工程,并完成原理图设计,包括查找、放置和连接元件。 使用自动配置功能对子板FPGA进行配置。 对设计进行处理,包括编译、综合和组建,以获得相应目标器件的可编程文件。 在FPGA工程中使用层级设计,包括简单定制逻辑(HDL)。 虚拟仪器的用法。 本章所给出的例子是一个简单的扭环计数器(见图一)。这是一个同步计数器,移位寄存器的输出信号通过反相器接到输入端。其原理图和相关文件在Altium Designer安装路径下的\Examples\Tutorials\Getting Started with FPGA Design文件夹中。用户可以在任何时候查阅这个例子以便获得更深层次的理解和迈向新的台阶。

  1. 一个简单的例子——扭环计数器
    Language

本电路中,送给逻辑器件的同步时钟信号由Desktop NanoBoard上的参考时钟信号提供。计数器的输出通过NanoBoard上的用户LED进行显示。考虑到NanoBoard板上其他的可用资源,我们可以在设计中添加额外的逻辑控制如下:

  • 方向控制――计数可以从左到右,也可以从右到左,取决于NanoBoard板上的相关按键的设置(DIP开关部分)。
  • 停止控制――计数可以停止也可以重启,取决于NanoBoard板上的相关按键的设置(DIP开关部分)。
  • 清除控制――通过NanoBoard板上的'DAUGHTER BD TEST/RESET'按钮对计数器清零,使所有的LED熄灭

关于Desktop NanoBoard的详细说明,请查阅文档:TR0143 Technical Reference Manual for Altium's Desktop NanoBoard NB2DSK01。 关于可用于Desktop NanoBoard板的子板型号的详细信息,以及各个器件的使用手册,请查阅下面网址:www.altium.com/nanoboard/resources

关于FPGA供应商软件的注意事项

在将设计下载到Desktop NanoBoard子板的FPGA器件之前,用户需要在电脑上安装相应的FPGA供应商软件,用于对FPGA布局布线。FPGA供应商软件并不由Altium Designer提供,需要独立安装。大部分子板都可用于Desktop NanoBoard。为了使用所选择的子板,用户需要安装相应的软件。 更多的关于供应商软件的信息可在相应的FPGA供应商网站上查找。 • Actel® Designer 或者r Libero® IDE:www.actel.com。该软件可以下载,但是需要序列号。可到该网站上申请一个序列号。 • Altera® Quartus® II:www.altera.com。Altera Quartus II软件的网络版本可免费下载且不需要序列号。 • Lattice® ispLever®www.latticesemi.com。ispLever Starter软件可以从网上下载,但是需要序列号。可到该网站上申请一个序列号。 • Xilinx® ISE™: www.xilinx.com。Xilinx ISE WebPACK可免费下载且不需要序列号。 在Altium的网站上的Vendor Resources栏目中可以查阅到各个供应商下载软件的链接。(www.altium.com/Community/VendorResources )。这个界面可以在Altium Designer中直接进行访问:Devices view (View » Devices View),选择Tools 菜单中的Vendor Tool Support选项。

设计输入

新建FPGA工程

每一个设计都是以工程的形式存在于Altium Designer中。对于FPGA设计,称之为FPGA工程(.PrjFpg)。工程的本质是ASCII文件,该文件用于存储工程的信息,包括工程属性、输出设置、编译设置、出错检测设置等。 创建一个FPGA工程的步骤如下: 1. 新建一个FPGA工程:File » New » Project » FPGA Project* 2. 保存工程:鼠标右键单击Projects面板中新建的工程名(FPGA_Project1.PrjFpg),选择Save Project命令。将工程重命名为Simple_Counter.PrjFpg,保存到名为Basic FPGA Design Tutorial的新建文件夹中。 注意:空格和横线 不能用于工程名中或者文件夹名,否则会导致综合错误。可以用下划线(_)代替,以增强可读性。

添加原理图文件

FPGA工程具有分层结构。工程中包括原理图、HDL (VHDL 或者 Verilog)文件、OpenBus文件等,这些子文件可用图纸符号表示。所有的工程都有一个共同点,那就是它们必须有一个单独的顶层示意图。顶层示意图不仅仅包括设计的接口(这些接口直接对应于目标器件的引脚),同时也推动FPGA设计综合为PCB电路板。 我们将在后面章节讲解分层设计,现在先介绍如何添加一个原理图(这里指顶层原理图)到新建的FPGA工程中。 1. 鼠标右键单击Projects 界面中的FPGA工程,选择Add New to Project » Schematic命令,在工程中添加一个新的原理图文件并在设计窗口中打开。

  1. 在新建FPGA工程中添加原理图

2. 将文档命名为Simple_Counter.SchDoc,与工程保存在同一个目录。 3. 鼠标右键单击工程名,选择Save Project,保存文件。

放置元件

接下来在空白图纸中添加元器件,包括实现设计功能所需的元件,以及Desktop NanoBoard NB2DSK01上所提供的接口资源。 表1给出了实现扭环电路所需要的元件。这些元件可在FPGA常用集成库中找到(FPGA Generic. IntLib),该库在安装文件夹下的\Library\Fpga文件夹中。 表1 实现扭环电路所需要的元器件

符号

器件名称

描述

所需数量

FJKC

异步J-K触发器

2

INV

反相器

6

J8B_8S

总线接口 - 8路总线输入,到8路单线输出

1

OR2N2S

2输入或门。低电平A或低电平B输入有效。

1

SR8CLED

8位串并转换双向移位寄存器。时钟上升沿有效,异步清零

1

表2给出了设计所需的端口。这些端口已经自动连接了Desktop NanoBoard板上的相关资源和子板FPGA的物理IO接口。这些端口元件可在FPGA NB2DSK01 Port-Plugin集成库中找到(FPGA NB2DSK01 Port-Plugin.IntLib),也可以在安装目录下的\Library\Fpga文件夹中找到。 表2 扭环计数器原理图中所需的端口器件

符号

器件名称

说明

CLOCK_REFERENCE

连接Desktop NanoBoard班上20MHz系统时钟信号。我们可以使用这个信号为触发器和移位寄存器提供同步时钟信号

DIPSWITCH

连接Desktop NanoBoard板上的DIP开关。我们可以使用其中的三个开关来控制计数方向和停止计数

LED

连接Desktop NanoBoard板上的用户LED。我们可以使用LED直观得观察计数器的输出

TEST_BUTTON

连接Desktop NanoBoard板上的'DAUGHTER BD TEST/RESET'按键(SW7)。我们可以使用这个反相信号作为移位寄存器的使能信号。当我们把寄存器的输入引脚D连到地时,按下该键可以是寄存器的数据输出端为'0'。

以上所用到的两个集成库是默认安装的,在Libraries面板上可见。对于本指南而言,不需要安装任何库,仅仅需要在Libraries面板中激活(打开)相应的库,就可以在列表中选择所需要的器件。点击面板右上方的Place按钮,或者直接点击该元件并将其拖到原理图中。 继续在原理图中放置如图7-3所示的所有器件。放置好后,给各个器件添加标号:Tools » Annotate Schematics Quietly

  1. 原理图中元器件的放置

放置导线

1. 使用Place » WirePlace » Bus命令(或分别使用 按钮)将器件连接在一起,如图7-4所示。

  1. 初步放置导线和总线

2. 在Wiring工具条中选择 GND端口图标。当端口图标悬浮于光标上时,按下Tab键,弹出Power Port对话框,将Style属性改成Bar。放置GND图标,使其与两个触发器的CLR引脚相连。 3. 放置另一个GND图标与移位寄存器的CLR引脚相连。 4. 在Wiring工具条中选择 GND总线图标。当端口图标悬浮于光标上时,按下Tab键,弹出Power Port对话框,将Style属性改成Bar。放置GND总线图标,使其与移位寄存器的CLR引脚相连。按下Spacebar键可旋转图标。

  1. 触发器CLR引脚接地 图7-6 移位寄存器CLR引脚接地

5. 点击Wiring工具条中的 按钮,添加两条总线入口,将单个的信号从移位寄存器的输出总线中引出到移位寄存器的SLI和SRI端口对应的反相器输入端。如图7-7所示。 6. 为使电路图简洁且将警告减少到最少,需要在总线接口元件(U4)中不使用的输出引脚处添加No ERC标记。点击Wiring工具条中的 按钮,将NO ERC标记分别添加到不使用的引脚O3~O7。如图7-8所示。

  1. 添加总线入口

  1. 为不使用的引脚添加 No ERC标记

7. 使用Place » Net Label命令或者点击Wiring工具条上的 按钮为电路图添加网络标号,如图7-9所示。网络标号必须是唯一的。 8. 保存原理图及整个工程(File » Save All)。

  1. 加入网络标号的原理图

检查原理图设计

编译的过程为工程生成一个完整的网络表。在编译和下载设计前,需要检查原理图一致性。编译器根据Error ReportingConnection Matrix表格中定义的规则进行电气检查和绘图检查,如图7-10所示。相应错误勘测表格见Options for FPGA Project 对话框(Project » Project Options)。(注意:本指南并没有对任意错误勘测表的属性进行修改。保持默认设置即可。)

  1. 在Options for FPGA Project对话框中Error Reporting和Connection Matrix tabs标签页对编译器进行设置

编译步骤如下: 1. 在原理图主菜单上选择Project » Compile FPGA Project Simple_Counter.PrjFpg,编译开始。 2. 如果编译过程中出现了一般错误或者重大错误,Messages面板将自动弹出。如果仅仅存在警告,需要手动弹出Messages面板:点击主设计窗口下的System按钮,在弹出的面板中选择Messages。双击任何一个消息条目,会在Compile Errors面板中给出相应错误的详细信息。错误部分将在原理图中放大并高亮显示。 3. 如果原理图中的导线连接正确,在Messages面板中可能会出现一些关于加载信号的警告,如图7-11所示。这是因为我们从总线SQ[7..0]中引出的引脚只是SQ0和SQ7而不包括SQ1~SQ6。这些警告是可以忽略的。如果存在其他错误消息,用户需要解决它们并重新编译整个工程。对于编译错误的详细说明(包括错误产生的原因和解决方法),请参照文档TR0142 Project Compiler Error Reference。

  1. 如果设计正确,在编译后仅仅出现警告
  2. 4. 保存原理图和整个工程。

配置物理FPGA元件

现在,我们完成了设计的输入,下面需要确定FPGA器件的型号。本节将对3端口连接器子板上所携带的FPGA芯片进行配置。所谓配置,指约束文件名列表。通过配置来生成针对目标器件的约束文件以实现对设计的映射和约束。约束文件包括一些指定的细节,如目标器件的型号,端口与引脚的映射关系,标准IO口等等。综合一个设计所需要的最基本信息来源于芯片的器件手册。 针对Desktop NanoBoard NB2DSK01的约束系统包含以下约束文件:

  • 将资源和引脚映射到NB2DSK01母版、外设板和子板上的约束
  • 将附属板(外设板和子板)连接到NB2DSK01母板上的约束

Altium Designer环境下,可以手动地添加配置文件,也可通过使用自动配置功能而使设计过程简化。使用该功能,将自动生成一个针对FPGA工程的配置文件。电路板级约束文件和映射约束文件将自动确定并添加到配置文件中。板级约束文件取决于于设计所用到的硬件(母板,子板以及外设板);映射约束文件取决于附属板与母板的连接。

Altium Designer识别用户当前所用器件的能力是自动配置一个FPGA工程的关键。Altium Designer通过单线程存储芯片来完成对对NB2DSK01母板、所有的3端口连接线器子板和外设板的识别。

注意:以前的2端口连接口器Altium子板可以用于Desktop NanoBoard NB2DSK01,但是它不可以采用自动配置的方法来支配相应的存储芯片。 更多关于配置和约束的概念以及他们在设计移植中的作用请参阅文章AR0124 Design Portability, Configurations and Constraints。 更多关于Desktop NanoBoard NB2DSK01约束系统的细节,包括自动配置等内容,请参阅文章AP0154 Understanding the Desktop NanoBoard NB2DSK01 Constraint System. 下面开始FPGA工程的配置。 1. 在使用自动配置功能之前,请确定以下事项:

  • NB2DSK01母板插有携带目标FPGA芯片的3端口连接器子板。
  • 本实例不需要用到外设板,故这些外设板可留在母板上,也可以去掉。
  • NB2DSK01通过USB接口(或者并口)与PC机相连。已经上电。

2. 打开Devices View(View » Devices View),使能Live选项,并确定Connected指示灯亮。 3. 自动配置功能可以通过两种方法启动: 方法一:在NanoBoard chain of the view 选项中右键Desktop NanoBoard图标,从弹出的菜单中选择Configure Fpga Project » Simple_Counter.PrjFpg,如图7-12所示。

  1. 从Devices view直接进行自动配置。

方法二:双击Desktop NanoBoard图标,弹出Instrument Rack - NanoBoard Controllers面板。单击Board View按钮,进入NanoBoard Configuration对话框。单击Auto Configure FPGA Project下拉按钮,选择Simple_Counter.PrjFpg,如图7-13所示。通过该对话框,用户可以看到关于Desktop NanoBoard NB2DSK01系统的一个可视化的动态介绍,包括相应的外设板和子板。

  1. 通过visually-based NanoBoard Configuration对话框进行自动配置。

在自动配置过程包括以下几个部分:

  • 创建配置文件并将其添加到Simple_Counter工程中。配置文件的命名取决于Desktop NanoBoard的版本和所使用的子板。其命名格式为motherboard code_revision_daughter board code_revision。例如,母板为Desktop NanoBoard NB2DSK01 (修正版8),子板为Xilinx Spartan-3的DB30 (修正板6), 配置文件的命名为:NB2DSK01_08_DB30_06。
  • 将系统所用到的母板、子板和外设板所对应的约束文件添加到配置中。这类约束文件来源于安装路径下的\Library\Fpga\NB2 Constraint Files文件夹。在不同的情况下,约束文件取决于所用电路板的型号和版本。例如,如果采用Xilinx Spartan-3的子板DB30(修正版6),约束文件命名为DB30.06.Constraint。
  • 将规定子板、外设板与母板连接的映射约束文件添加到配置中。文件名与配置名相同,添加后缀'_BoardMapping'(例如:NB2DSK01_08_DB30_06_BoardMapping.Constraint)。将其保存到工程文件目录下。
  1. 配置中所包含的约束文件可在Configuration Manager对话框中查看。如图7-14所示。

  1. 工程的配置和约束文件列表

单击OK按钮。一个名为Settings的子文件夹将添加到工程中。约束文件列于该子文件夹中的Constraint Files文件夹内如图7-15所示。 5. 保存工程文件。

  1. 在配置中添加约束文件

编译和综合

当我们完成了基于FPGA的设计输入后,需要对源文件进行编译、综合等处理,以便获得用于指导布局布线的网络表。布局布线软件可确保本设计所需资源与在所选器件资源的大小相符,并创建一个FPGA下载文件。 编译、综合工艺流程在Devices View视图中运行: 1. 在Altium Designer中激活Devices View选项(View » Devices View)。 2. 使能Live选项,并且电路板上的Connected指示灯是亮着的。 现在我们感兴趣的是在Device视图中使用硬件设备链对所用FPGA器件进行联合控制。如图7-15所示。

  1. 针对物理FPGA器件的处理过程的相关操作

只有满足下面的条件,编译综合流程才可以继续进行:

  • 必须安装与子板FPGA芯片相对应的供应商软件,且工程已经创建了目标芯片的配置,并在芯片图标下的下拉菜单中出现一对对应的Project / Configuration的名称。例如: Simple_Counter / NB2DSK01_08_DB30_06 。如图7-16所示。

    值得注意的是,设计的处理流程本身包括4个步骤:编译、综合、组建、下载。一个步骤的结果是下一个步骤开始的基础。尽管可以通过单击Program FPGA按钮 来一次运行完流程的所有步骤,但是分步进行是很有意义的。

    3. 单击Compile按钮,编译FPGA工程源文件。如果工程中包括处理器内核,则需要采用相关软件对植入的内核进行编译。对于本例设计,仅仅需要用编译工具来完成电气检查和绘图错误检查。因为之前已经对设计进行了编译,所以这一步可以省略。 返回到Messages面板。可以看到每当一个步骤成功完成后,相应的指示灯将变亮。 4. 单击Synthesize按键,综合FPGA工程。在综合过程中,源文件将转换成相应的VHDL文件,然后综合成为顶层EDIF网络表,与布局布线相对应。综合成功完成后,会生成一个名为Generated [ConfigurationName]的文件夹。该文件夹包括EDIF 文件(Simple_Counter.edf)、VHDL文件 (Simple_Counter.vhd)、以及综合记录文件 (Simple_Counter_Synth.logGenerated [ConfigurationName]Simple_Counter.edfSimple_Counter.vhdSimple_Counter_Synth.log) 。如图7-17所示。 返回到Messages面板。
  1. 综合阶段创建的文件。

5. 单击Build按键。Altium Designer根据综合的结果顺序执行以下五个步骤: (如图7-18所示)

  1. 在Build下拉菜单总查找Place and Route选项
  • 转换设计:用顶层EDIF网络表和相关的综合模型文件创建Native Generic Database (NGD)文件。
  • 映射:将设计映射到FPGA器件中。
  • 布局布线:根据映射后得到底层描述文件分配FPGA内部的物理位置并进行布线。
  • 时序分析:根据时序约束文件对设计进行时序分析。如果约束采用默认的设置,则设计没有任何时序约束。
  • 创建Bit文件:创建向芯片下载所需的Bit文件。

返回到Messages控制面板。更多供应商详细资料可以从Output面板中获得(在主设计窗口下点击System按钮即可看到Output面板)。 一旦这个步骤成功完成,会出现一个Results Summary对话框。如图7-19所示。这个对话框给出了目标器件中资源的使用情况,时序分析等信息。关闭这个对话框。

  1. 访问构建过程的信息,获得构建的最终报告文件。

6. 单击Program FPGA按钮。将可编程文件通过PC机的JTAG口下载到Desktop NanoBoard相应的FPGA器件中。Altium Designer的Status Bar会显示下载状态。下载完毕后,Devices vie面板中器件图标下的文字将从Reset转换成Programmed。在硬件电路上,子板上的'Program'指示灯将点亮,表明设计已经下载到FPGA芯片中。如图7-20所示。

  1. 开始对器件下载程序

更多关于工艺流程和查看Devices的信息,请查阅文档AP0103 Processing the Captured FPGA Design. 7. NanoBoard's板上DIP开关使用情况如下:

    1. - Switch 8: 按下该键开始计数,LED从左边开始移动。
    2. - Switch 7: 按下该键开始计数,LED从右边开始移动。
    3. - Switch 6: 按下该键停止计数,如果开关7和开关8关闭,则停止计数。

8. 按下NanoBoard 板上'DAUGHTER BD TEST/RESET'按键,清零LED。 9. 保存工程。 注意,在这个过程中,Desktop NanoBoard上的LED是一直亮着的,体现不出计数功能。这是因为Desktop NanoBoard的参考时钟频率为20MHz,LED闪烁太快。下一个节将介绍如何在原理图中添加一个分频器使频率降低,以及在FPGA设计中进行层次设计。

分层设计

FGPA工程文件夹(*PrjFpg)将多个源文件链接到一个工程中,文件间的关系以及网络间的关联都在这些文件中进行定义。在一个层次设计中,系统被分割成几个逻辑块,每个逻辑块在顶层原理图上用一个图纸符号表示。图纸符号可以通过一下方式创建:

  • 原理图
  • OpenBus系统文件
  • VHDL文件
  • Verilog文件

在原理图子文件中也可以包括底层文件的图纸符号。利用这种方法可以创建任意深度和复杂度的层次设计。 层次间网络和总线的连接必须遵守工程内部层次连接的标准。子文件的端口与父原理图端口的名称必须相一致。原理图子文件、VHDL子文件的连接图如图7-21所示。

  1. 底层文件的端口名称与图纸符号的端口名称相一致。

在上一节计数器实例中,由于Desktop NanoBoard板上的参考时钟频率过快,需要添加分频电路。我们采用添加子文件的方法来说明如何进行层次设计。首先介绍创建原理图子图的方法,然后介绍创建VHDL文件的方法。

用原理图子图实现时钟分频器

  1. 1. 打开原理图文件Simple_Counter.SchDoc。

2. 在图纸空白处放置图纸符号(Place » Sheet Symbol)。该图纸符号将代表时钟分频器。如图7-22所示。

  1. 时钟分频器的图纸符号
  2. 3. 双击图纸符号,在出现的Sheet SymboSymbol对话框中进行如下设置:
    1. - Designator: U_Clock_Divider
    2. - Filename: Clock_Divider.SchDoc.
  3. 4. 在图纸符号的左右两边添加输入/输出端口 (Place » Add Sheet Entry) 。进行如下设置:
  4. - 左边端口: Name: CLK_REF, I/O Type: Input
  5. - 右边端口: Name: CLK_OUT, I/O Type: Output
  6. 5. 用导线将图纸符号的端口与主电路图中的CLK_REF端口相连。如图7-23所示。

  1. 用原理图子图实现时钟分频器

现在我们已经添加了原理图符号,需要生成实际的子文件。

注意:步骤6-9将从零开始指导用户设计图纸符号子文件。以下操作可以跳过这四个步骤:在Projects面板中右键Simple_Counter.PrjFpg选项,选择Add Existing to Project »Choose Documents to Add to Project,在弹出的对话框中将鼠标定位于Clock_Divider.SchDoc,添加安装路径下的\Examples\Tutorials\Getting Started with FPGA Design文件,保存工程和顶层原理图。添加完子文件后,可直接跳到步骤10。

6. 右键单击图纸符号,选择Sheet Symbol Actions » Create Sheet From Symbol,自动创建一个名为Clock_Divider.SchDoc的原理图文件。一开始,这个文档中就包括两个端口:CLK_REF和CLK_OUT,分别对应于父图纸符号中的输入输出端口。 7. 进入Libraries面板,从FPGA集成库(FPGA Generic.IntLib)中查找分频器CDIV10DC50。在两个端口间放置六个分频器(设置为10分频,占空比为50%),并将所有的元件串联在一起,如图7-24所示。

  1. 时钟分频电路

8. 自动为元件标号:Tools » Annotate Schematics Quietly。 9. 保存原理图和工程:File » Save All。保存Clock_Divider.SchDoc时选择默认路径,即保存在与顶层原理图相同的文件夹中。 10. 编译工程。如果报错,则改正错误并重新编译。 11. 编译完成后,在Projects面板中查看工程原理图的层次。由图7-25可以看到,Clock_Divider.SchDoc是Simple_Counter原理图的子文件。至此,我们成功在原理图中添加了分频电路。

  1. 原理图子图的层次结构

12. 打开Devices视图,确定Live选项是激活的,并且Connection指示灯仍然点亮。 13. 现在,工艺流程的指示灯一直亮着,表示所有的编译过程都成功完成。可是,如何确定我们对源文件进行了修正呢?去掉Ignore FPGA source复选框中默认的钩即可。此时,所有工艺流程的指示灯都变成黄色,表明文件已经修改,需要重新执行各项操作。

  1. 图7-26. 取消Ignore FPGA source选项,实时更新编译过程。

14. 重新对子板FPGA器件进行编程。最简单的方法是直接点击Program FPGA图标。各个步骤将自动有序地运行。综合完成后,将为图纸符号所代表的原理图子图创建一个VHDL文件。如图7-27所示。

  1. 在综合阶段创建子图的VHDL文件

编程完成后,运行计数器(将switch 7或者switch 8拨到ON),我们可以清楚地看到NanoBoard板上LED的输出变慢了。使用DIP开关可以控制LED亮灭的方向。

用HDL子文件实现时钟分频器

在层次设计中,可以采用原理图和HDL代码相结合的方式实现设计的扩展。引用VHDL或者Verilog子文件的方式和引用原理图子图的方式相似,即子文件的文件名和相应的图纸符号的名字一致即可。 当引用一个VHDL子文件时,需要保证VHDL文件的实体声明和图纸符号具有一致性。如果引用的实体名与VHDL文件名不同,则需要更改图纸符号的HDLEntity参数,使其值与VHDL文件的声明相一致。 当引用一个Verilog子文件时,需要保证图纸符号和Verilog文件的实体声明具有一致性。如果引用的实体名与Verilog文件名不同,则需要更改图纸符号的VerilogModule参数,使其值与Verilog文件的声明相一致。 下面我们将采用VHDL子文件的方式创建一个1/100,000时钟分频器。 首先,创建一个VHDL源文件。

注意:以下步骤1-3告诉用户如何从零开始定义一个VHDL子文件。以下操作可以跳过这三个步骤:右键Projects面板上的Simple_Counter.PrjFpg条目,选择Add Existing to Project。在弹出的Choose Documents to Add to Project对话框中点击Clock_Divider.vhd文件。该文件存在于安装目录下的\Examples\Tutorials\Getting Started with FPGA Design文件夹中。保存整个工程后,直接跳到步骤4。

1. 右键单击Projects面板中的Simple_Counter.PrjFpg,选择Add New to Project » VHDL Document。创建一个新的VHDL文件并在主设计窗口中打开。将文件命名为Clock_Divider.vhd,保存到与工程文件相同的路径下。 2. 在文档中输入以下VHDL代码: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity Clock_Divider is port ( CLK_REF : in std_logic; CLK_OUT : out std_logic ); end entity; architecture RTL of Clock_Divider is begin process(CLK_REF) variable i : integer range 0 to 999999; begin if rising_edge(CLK_REF) then if i = 0 then CLK_OUT <= '1'; i := 999999; else CLK_OUT <= '0'; i := i - 1; end if; end if; end process; end architecture; 3. 保存文档。 4. 现在我们已经创建了VHDL源文件,我们可以通过该文件直接生成一个相应的图纸符号。在此之前,先删掉顶层原理图中已经存在的图纸符号及其相应的原理图子图。在Projects面板右键单击Clock_Divider.SchDoc,选择Remove from Project命令。即可将该原理图子图从FPGA工程中删除。 5. 打开Simple_Counter.SchDoc文件,点击已经存在的图纸符号,按下Delete键。 6. 在主菜单中选择Design » Create Sheet Symbol From Sheet Or HDL,弹出一个Choose Document to Place对话框,选择Clock_Divider.vhd选项并单击OK按钮。 7. 在电路中放置新的图纸符号并连接相应的导线,如图7-28所示。注意到DesignatorFilename分别自动设置为U_clock_divider 和 Clock_Divider。在VHDLENTITY中的参数也添加了相应的设置:value = clock_divider(VHDL子文件的实体名)。

  1. 用HDL子文件实现时钟分频器

8. 保存原理图和工程。 9. 编译工程。如果报错,改正错误并重新编译。 10. 编译完成后,在Projects面板中查看工程原理图的层次。可以看到Clock_Divider.vhd是Simple_Counter原理图的子文件。 如图7-29所示。

  1. VHDL子文件的层次

11. 打开Devices视图,确定Live选项是激活的,并且Connection指示灯仍然点亮。 12. 编程完毕后,把switch 7和switch 8拨到ON状态,启动计数器。可以清楚地看到NanoBoard上的计数器指示灯缓慢地亮灭变化。

现场交互监视器件引脚状态

高密度的器件封装使器件引脚检测变得很困难,使用Altium Designer中的JTAG Viewer功能可以促进物理设计的调试和虚拟化。从虚拟仪器面板中访问所用FPGA芯片相应的JTAG Viewer视图,令其工作在实时更新模式,采用目标FPGA器件相应的JTAG通信标准查询引脚的状态。由于设计中采用了时钟分频器使计数器慢下来,我们可以更清楚地观察到器件引脚状态的变化。 1. 当程序在FPGA中运行时,打开Devices视图,左键双击硬件设备链中相应的FPGA器件的图标,弹出Instrument Rack - Hard Devices面板,如图7-30所示。

  1. 对应于物理FPGA器件的虚拟仪器面板。

2. 左键单击JTAG Viewer Panel按钮进入JTAG Device Viewer面板。在Live UpdateHide Unassigned I/O Pin前的复选框中打钩,如图7-31所示。

  1. 实时交互监视器件的引脚

3. 当电路工作时,可以从JTAG Device Viewer面板中看到FPGA器件的引脚状态。注意观察LEDS()旁的LED图标是如何随着扭环计数器的工作而亮灭的。当引脚工作的时候,相应引脚分别在元件符号和封装上高亮显示。 4. 当NanoBoard板上的DIP开关改变计数器的计数方向时,JTAG Device Viewer面板中的元件符号和封装上的引脚状态会发生相应的变化。

在混合原理图中添加虚拟仪器

为了测试设计内部各个网络节点的工作状态,可以在电路中连接虚拟仪器。设计者从\Library\Fpga\ FPGA Instruments.IntLib集成库中查找所需的设备,将其"硬件部分"像其他器件一样放置到原理图中并用导线连接,然后综合到FPGA器件中。同时可在Devices视图中访问每一个虚拟仪器。 我们将在设计中添加以下虚拟仪器:

  • 一个频率计数器(FRQCNT2) – 用于显示时钟分频器的频率输出值。
  • 一个数字IO模型 – 用于显示计数器的输出和对应于NanoBoard板上的三个DIP开关的状态。

关于这些虚拟仪器的更多信息请参阅文档CR0101 FRQCNT2 Frequency Counter and CR0179 DIGITAL_IO Configurable Digital IO Module。 现在,我们的当前工程是由底层VHDL子文件形式创建的时钟分频器。本节直接在这个子文件中添加虚拟仪器,而不需要返回到时钟分频器的原理图中。当然,读者也可以选择在原理图中进行设计。

添加频率计

1. 打开原理图Simple_Counter.SchDoc 2. 进入Libraries界面并从FPGA集成库(FPGA Instruments.IntLib)中查找FRQCNT2,将其放置到VHDL子文件所对应的图纸符号的右下角。 3. 自动标号:Tools » Annotate Schematics Quietly 4. 为虚拟仪器放置导线。我们要监视的信号是时钟分频器(CLK_OUT)的输出,需要将其输出连接到FREQA的输入端。TIMEBASE信号与NanoBoard板上的原始时钟信号(CLK_REF)相连接,如图7-32所示。因为我们没有使用FREQB引脚,所以在上面连接GND电源端口。

  1. 在原理图中添加频率计数器

添加数字IO模型。

1. 放置元件:进入Libraries面板,选择DIGITAL_IO元件,将其放置在主电路的正上方。 2. 自动标号:Tools » Annotate Schematics Quietly。 3. 配置器件:在我们放置导线之前,需要对所需监视的信号进行配置。右键单击虚拟仪器图标,从菜单中选择Configure U13 (DIGITAL_IO)进入Digital I/O Configuration对话框,如图7-33所示。注意,虚拟仪器默认配置为8位总线输入(AIN[7..0])和8位总线输出 (AOUT[7..0])。

  1. 进入数字IO虚拟仪器的配置控制界面

4. 因为我们的设计没有任何输出,所以可以删除默认的输出条目:鼠标左键单击选择AOUT[7..0]信号,点击该部分相对应的Remove按钮。 5. 其默认输入的宽度恰好与本设计的输入数据宽度相符,所以只需要将其修改为比较直观的名字即可:Count_Output[7..0]。保持Style的设置为默认值LEDs,但是将LED的颜色设置改为Green(仅仅是为了与NanoBoard板上的LED的颜色相一致)。 6. 为了监视相应DIP开关的输出,我们需要添加三个输入信号到配置中。定义如下:

  • Signal 1 - Name: Shift_Left, Style: LEDs, Color: Green.
  • Signal 2 - Name: Shift_Right, Style: LEDs, Color: Green.
  • Signal 3 - Name: STOP, Style: LEDs, Color: Red.

在弹出的Digital I/O Configuration对话框中,输入信号部分的设置如图7-34所示。

  1. 配置完成后的Digital IO虚拟仪器

7. 为虚拟仪器放置导线,如图7-35所示。注意,为了避免凌乱的连线,本设计采用了网络标号从总线中引出SO04, SO3, SO2三个信号,便于整体的复制和粘贴。由于相应的DIP开关是低电平有效的,为了使开关置于ON时灯亮而不是当开关置于OFF时灯亮,设计将需监视的信号都经过相应的反相器输出。

  1. 在原理图中添加数字IO虚拟仪器

使能软件JTAG链(Soft Devices JTAG Chain)

Altium Designer软核环境与嵌入式处理器、FPGA设计中的虚拟仪器间的通信,是通过JTAG通信协议进行连接的。这涉及到Desktop NanoBoard上的软件JTAG链(或节点链)。 软件JTAG链信号(NEXUS_TMS, NEXUS_TCK, NEXUS_TDI 和 NEXUS_TDO)从Desktop NanoBoard's NanoTalk Controller (Xilinx Spartan-3)中引出。作为通信链的一部分,这些信号与FPGA子板上的4个引脚相连。为了配置这些引脚,需要在设计中添加NEXUS_JTAG_CONNECTOR连接器,如图7-36所示。该连接器可以从FPGA NB2DSK01 Port-Plugin集成库中找到。

  1. Nexus JTAG连接器

这个连接器将软件JTAG链引入到设计中。为了将所有相关的Nexus-enabled元件(指本设计中的两个虚拟仪器)连接到JTAG链中,设计者需要放置NEXUS_JTAG_PORT元件,如图7-37所示,然后将其直接连接到NEXUS_JTAG_CONNECTOR上。该接口器件可以从FPGA 通用集成库中找到(\Library\Fpga\FPGA Generic.IntLib)。

  1. Nexus JTAG接口

参数NEXUS_JTAG_DEVICE设置为True的所有器件通过NEXUS_JTAG_PORT端口连接到软件JTAG链中。 对原理图进行如下操作: 1. 在原理图中放置NEXUS_JATAG_CONNECTOR元件和NEXUS_JTAG_PORT元件,并将两者相应端口连接在一起。

  1. 将JTAG器件连到软核JTAG链中。

2. 放置VCC电源接口,使其与NEXUS_JTAG_PORT元件的TRST引脚相连。 包含两个虚拟仪器的设计就完成了。如图7-39所示。

  1. 包括两个虚拟仪器的最终设计

3. 保存原理图和父工程。 4. 重新编译工程。此时用户将发现在Messages面板中没有任何警告消息。这是由于所有的SQ输出都用于数字IO虚拟仪器,即所有的引脚都加载到了物理器件中。 更多关于JTAG的信息请参阅文档AR0130 PC to NanoBoard Communications

访问虚拟仪器控制器

上一小节介绍了向软件JTAG链中添加虚拟仪器的过程。本节将介绍如何在Altium Designer中访问这些虚拟仪器。 IEEE 1149.1 (JTAG)标准是主机和嵌有内部虚拟仪器的FPGA芯片间的接口协议。Nexus 5001标准是所有基于该协议进行调试的器件与主机间的通信协议。这些器件包括数字IO、频率计,以及其他适用于Nexus协议的器件,如支持调试的处理器、信号发生器、逻辑分析仪、交叉开关等。所有这些器件通过软件JTAG链相连。软件JTAG链不是一个物理链,不存在外部连接。当设计在目标FPGA芯片中执行时,支持Nexus协议的器件将自动在FPGA内部连接从而确定软件链。在Devices视图中可查看该软件链的构成。 1. 打开Devices视图,对FPGA子板进行编程。 2. 编程完毕后,在视图中自动弹出软件链,该软件链中包括了我们所添加的两种虚拟仪器的图标:频率计数器和数字IO模型。如图7-40所示。

  1. FPGA编程完毕后在软器件链中显示虚拟仪器

3. 拨动NanoBoard板上DIP开关switch 7或者switch 8,启动计数器。 4. 左键双击两个虚拟仪器的图标,打开相应虚拟仪器的控制面板Instrument Rack - Soft Devices panel,如图7-41所示。这些面板提供了与实际仪器相同的必要控制功能和显示界面。

  1. 频率计数器和数字IO模型相对应的控制面板

仪器面板上出现了两个奇怪的现象。首先,频率计数器上显示的频率是50Hz,而我们从NanoBoard板上获得的参考时钟频率是20MHz,时钟分频器的分频参数是1/100,000,正确的结果应该是20Hz!其次,在数字IO面板上对应于计数器输出状态的LED的显示相当闪烁,与NanoBoard板上的平稳输出不相符。 为了修正这两个错误,我们需要在虚拟仪器面板中对每个仪器进行相应的配置。 5. 在频率计数器面板中,单击Counter Options按钮,在弹出的Counter Module - Options对话框中,将Counter Time Base选项中默认的50.000MHz改成20.000MHz(使之与连到TIMEBASE输入端口的信号频率相一致),如图7-42所示。关闭对话框,可以看到仪表面板中显示的频率是20Hz。

  1. 改变频率计数器的参考时钟频率,使之与连到TIMEBASE输入端口的信号频率相一致

6. 单击数字IO模型面板上的Options按钮,在弹出来的Digital I/O Module - Options对话框中,将Update Display From Core Every选项中的默认的250ms改到最小值100ms。关闭对话框。由于提高了刷新速度,可以看到LED的显示更加平稳。

  1. 提高数字IO模型刷新速度。

7. 运行程序,执行切换计数方向及停止运行等操作,可以观察到数字IO模型面板上将实时显示电路板上相应的改变。 更多关于FPGA设计和Altium创新平台的知识,请参阅文件GU0123 An Introduction to Embedded Intelligence. 更多关于Altium工具和功能的详细说明,请参阅以下文档: TU0122 Getting Started with Embedded Software TU0123 Creating a Core Component TU0126 Checking Signal Integrity on an FPGA Design TU0128 Implementing a 32-bit Processor-based Design in an FPGA TU0129 Converting an Existing FPGA Design to the OpenBus System TU0130 Getting Started with the C-to-Hardware Compiler TU0131 Capturing Video the Easy Way TU0133 Designing Custom FPGA Logic using C TU0135 Adding Custom Instrumentation to an FPGA Design----

Labels
  • None