功能
通过 Libero(v9.1 SP4)设计流程,本教程涵盖以下主题,旨在在 IGLOO nano 评估板上创建各种 LED 输出模式,同时控制 LED 亮度和图案速度:
- Libero 设计流程工具基本概述
- Microsemi Libero 目录内核实例化(PLL、计数器、多路复用器、解码器和 Flash*Freeze 输入缓冲器)
- 自定义 VHDL 组件设计与实例化,包括计数器控制器、按钮去抖动器和脉宽调制信号发生器
- 使用 ModelSim AE 中的命令仿真自定义内核
- 在 Synplify Pro 中设置时序约束和属性
- 在 Smart Time 中管理时序约束和分析
- 在 I/O 属性编辑器中设置引脚分配
- 布局设置、创建程序文件以及使用 Flash Pro 对器件进行编程
简介
本教程将介绍 IGLOO nano FPGA 开发,并引入高级主题(如添加时序约束和属性)。假设读者对 Libero 设计流程有基本了解。我们将使用 Libero v9.1 IDE 实例化 Microsemi 内核、自定义 HDL 内核,并通过在 Libero Canvas 上缝合内核来创建顶层文件。最终成果将实现对连接到 IGLOO nano 评估板 LED 的 I/O 输出模式的控制,同时展示 IGLOO nano 的 Flash*Freeze 功能。教程将涵盖状态机设计和按钮去抖动电路的编码属性,并实例化另外两个自定义 VHDL 组件以及 Libero 目录中的内核。
背景
Microsemi IGLOO nano 入门套件可实现快速 FPGA 低功耗原型设计。IGLOO nano 利用专用的 FlashFreeze 引脚触发超低功耗 FlashFreeze 状态。此静态状态下,nano 仅消耗低至 5µW(典型值 24µW)的功率,同时保留系统内存和寄存器内容。
与同类 SRAM 器件相比,IGLOO FPGA 使用可重新编程的闪存技术,使其具有非易失性、高安全性和更低功耗的特点。IGLOO 系列采用时钟调节电路、集成锁相环、嵌入式 SRAM、嵌入式 NVM 和系统内编程能力。
教程所需硬件 / 软件:
- Microsemi IGLOO nano 评估套件
- 两根 USB 电缆(套件包含一根供电线和一根编程线)
- 低成本编程器(套件包含)
- 带有 Synplify Pro AE 和 ModelSim AE 的 Libero v9.1 SP4
- 可选万用表(用于测量 Flash*Freeze 模式下的 FPGA 核心电流)
应用
构建电路
开发的第一步是启动 Libero IDE 并使用新项目向导创建新项目:
- 选择 项目→新建项目,输入项目名称、位置,并选择 VHDL 作为首选 HDL 类型。
- 点击 下一步 打开器件选择窗口。
注意:确保选择正确的芯片,否则需从头开始项目才能更改。**
- 输入以下信息并点击 下一步 >:
- 系列:IGLOO
- 芯片:AGLN250V2
- 封装:100 VQFP
-
确保在 “选择集成工具” 菜单的 “综合” 选项中选中 Synplify Pro AE,点击 下一步。
-
在 “将文件添加到项目” 窗口中,选中 “用户文件” 下的 “HDL 源文件 (*.vhd; *.v; *.h)”,点击 添加文件…,导入本教程附带的 PWM.vhd、Debounce.VHD 和 UpDownCont.vhd 文件,点击 完成。
-
此时,Libero IDE 中将显示项目流程窗口,导入的.vhd 文件出现在 “层次结构” 窗口中(见图 1)。
Figure 1 Design Flow
- 点击 SmartDesign 按钮,确保 “选择类型” 下选中 “SmartDesign 组件”,为顶层组件命名(如 Top)。
- 在目录的 “内核” 选项卡下展开 “时钟和管理”,将 PLL - 静态内核 拖到 Canvas 上,按图 2 配置(输入 20 MHz,输出 50 MHz),生成内核并命名为 CLKGEN。双击模块可随时修改 PLL 设置。
Figure 2 PLL-Static Core Configuration
-
右键单击CLKGEN PLL的POWER输入端口,然后在弹出窗口中点击“上拉”。
-
接下来,右键单击CLKA端口,然后在弹出窗口中点击“提升到顶层”。
-
打开“内核”选项卡下的Actel宏标题,将AND2门拖放到Canvas上。
-
右键单击B端口并提升到顶层。
-
右键单击顶层输入端口B,然后从弹出菜单中选择“修改端口”。
-
将端口重命名为nSysReset。
-
按住键盘控制键,右键单击CLKGEN LOCK输出端口和AND2 A输入端口,然后从弹出菜单中选择“连接”,参见下面的图3。这将为我们提供一个依赖于PLL锁定输出的低电平有效复位。
图 3 端口连接
-
接下来,我们需要为Flash*Freeze引脚实例化输入缓冲器。在“内核”选项卡的Actel宏下,向下滚动到INBUF_FF并将其拖到画布上。这将自动将INBUF_FF连接到顶层。
-
右键单击顶层输入端口PAD,将其重命名为Flash_Freeze_N,然后右键单击输出端口Y并选择“标记为未使用”。这将启用Flash*Freeze模式。
-
打开目录窗口中“内核”选项卡下的“基本块”标题,将计数器内核拖到Canvas上。
-
按照下面图4所示的设置配置内核,点击生成按钮并将内核命名为counter1。
图 4 计数器 1 内核设置
- 右键单击Counter1输出端口Q0并选择“添加切片”选项。输入21:21,如Q21,以从总线单独运行位21,参见下面的图5。可以通过点击“+”按钮打开端口。重复此步骤以引出Q20、Q19和Q0。按照之前连接端口的方式,按住控制键,右键单击两个端口并从弹出菜单中选择“连接”,将counter1的时钟输入端口连接到CLKGEN的GLA输出。同时将Counter1的Aclr连接到AND2门的Y输出。
图 5 向 Q0 添加切片
-
右键单击Counter1的端口总线Q0并选择“标记为未使用”,总线上的剩余位稍后将通过多路复用器连接到3位计数器的时钟输入。
-
重复步骤19,将另一个计数器拖到Canvas上,并按图6所示进行设置。点击生成按钮并将内核命名为Counter2。该计数器将是一个3位的UpDown计数器。
图 6 计数器 2 内核设置
- 从“内核”选项卡下的“基本块”标题中拖出一个多路复用器到Canvas上,并按下面图7所示进行设置,点击生成并将内核命名为Mux1。
图 7 时钟多路复用器设置
-
右键单击Canvas的左边缘并选择“添加端口…”。输入DipSwitches0,确保选中输入单选按钮,然后点击确定。通过如上步骤21中所述添加8个切片来引入DipSwitches总线的所有8条线。这些输入端口稍后将分配给IGLOO评估板上的8位Dip开关组。
-
接下来,我们需要按下面图8所示连接所有端口。仔细研究图8,并在DipSwitches总线的位2和3与Mux1上的Sel0和Sel1之间建立连接。同时将Counter1的位21、20和19连接到Mux1上的Data0、Data1和Data2。结果将连接到Counter2的时钟。
图 8 教程中步骤 21 之前的连接
-
通过如上步骤21中所述添加切片,从Counter2的输出Q0总线上引出所有三位。
-
在“内核”选项卡的“基本块”下,将解码器拖到Canvas上,将输出宽度设置为8,解码使能设置为高电平有效,输出(Eq)设置为低电平有效,点击生成并将内核命名为Decoder,参见下面的图9。
图 9 解码器设置
-
将输入数据线路Data0、Data1和Data2分别连接到Counter2的输出位Q0、Q1和Q2。
-
我们需要另一个解码器来以第二种模式驱动LED。将另一个解码器内核拖到Canvas上,并按之前的方式进行设置,不同的是这次我们需要一个4位输出,参见下面的图10。
图 10 Dec_Mode2 设置
-
将Dec_Mode2输入端口的Data0和Data1分别连接到输出端口Q1和Q2。两个解码器的使能将由自定义VHDL PWM生成器的输出选通。这将允许我们改变LED的亮度。
-
通过向Eq0的输出添加4个切片并展开端口,从Dec_Mode2解码器引出所有4位。
-
通过从“内核”选项卡下的“基本块”标题中拖入第二个多路复用器来实例化多路复用器内核。按下面图11所示将内核配置为输出总线宽度为8和2个输入总线,点击生成并将多路复用器命名为Mux_Mode。
图 11 Mux_Mode 设置
-
该多路复用器将允许我们选择将哪个解码器输出运行到评估板的LED。将Result0输出端口提升到顶层,右键单击顶层端口并选择“修改端口”以将其重命名为LED。通过添加8个切片并展开端口,引出Data1的所有七个输入端口。
-
将Mux_Mode选择线Sel0连接到顶层输入端口DipSwitches0。
-
将Decoder Eq0的输出连接到Mux_Mode输入Data0_port0。
-
将Dec_Mode2的输出Eq0对称连接到输入Data1_port0。Eq0连接到Data1_port7和Data1_port0。Eq1连接到Data1_port1和Data1_port6。Eq2连接到Data1_port2和Data1_port5。Eq3连接到Data1_port3和Data1_port4。参见下面的图12。
图 12 Mux_Mode 连接
- 如果启用,我们需要驱动Counter2的UpDown输入。为此,我们需要实例化我们之前导入的.vhd文件之一。将UpDownCont.vhd组件拖到Canvas上。该文件可以在左侧“设计资源管理器”窗口的“层次结构”选项卡下找到。可以双击此组件模块以打开.vhd文件并研究其内容。UpDownCont.vhd模块控制Conter2的操作(向上或向下计数)。参见下面的图13以了解RTL图。
图 13 UpDownCont.vhd RTL 图
- 通过添加3个切片,引出UpDownCont输入端口cntr_in0的所有三位。将输入cntr_in2、cntr_in1、cntr_in0分别连接到Counter2的输出Q2、Q1和Q0,如下面图14所示。
图 14 UpDownCont.vhd 连接
-
接下来,我们必须实例化pwm_gen(在“层次结构”选项卡的“设计资源管理器”下找到的PWM.vhd组件)。为此,像之前对UpDownCont.vhd组件所做的那样,将PWM.vhd组件拖到Canvas上。该模块也可以打开以研究VHDL。
-
通过添加7个切片,引出pwm_gen的del_PWM0输入端口的所有输入位。
-
将ADD_or_Sub提升到顶层。
-
将del_PWM1、del_PWM2、del_PWM3、del_PWM4分别连接到DipSwitches4、DipSwitches5、Dipswitches6和DipSwitches7。
-
右键单击del_PWM0、del_PWM5、del_PWM6、del_PWM7并选择“下拉”。
-
右键单击del_PWM1、del_PWM2和del_PWM3,并从弹出菜单中选择“反相”。
-
将pwm_gen输出pwm_out连接到解码器和Dec_Mode2使能输入。
-
将pwm_gen输出pwm_out提升到顶层。
-
要实例化的最后一个VHDL组件是switch_debounce(在“层次结构”选项卡的“设计资源管理器”下找到的Debounce.vhd组件)。为此,将Debounce.vhd组件拖到Canvas上。该组件用于确保在需要单个变化时,按钮颤动不会输入占空比的多个变化。该组件有两个输出,一个单脉冲和一个39ms等待状态电平变化。ASM图见下面的图15。可以打开此组件模块以研究VHDL组件。
图 15 Debounce.vhd FSM 的 ASM 图
-
将switch_debounce和pwm_gen_0的输入clk信号连接到CLKGEN输出GLA。
-
将switch_debounce和pwm_gen_0的输入nreset信号连接到AND2输出Y。
-
将switch_debounce输出db_level连接到pwm_gen输入strDelPWM。
-
将switch_debounce输入sw提升到顶层输入,并将端口重命名为strDelPWM并反相输入。
-
右键单击db_level和db_pulse端口并将它们提升到顶层。
-
将UpDownCont_0输入en连接到顶层输入端口DipSwitches1。
-
最后,将Counter2_0的UpDown输入端口连接到UpDownCont_0的输出端口UpDown。最终的顶层原理图应如下图16所示。右键单击Canvas并选择“自动排列实例”和“自动排列连接”以整理原理图。
图 16 最终顶层原理图连接(注意端口上拉、下拉和取反)
-
在“设计资源管理器”的“层次结构”选项卡下,右键单击Top并选择“设置为根”。
-
在任务栏中,点击SmartDesign→检查设计规则。如果没有错误,请继续执行步骤58的仿真,否则需要检查连接和配置设置。
使用ModelSim AE进行综合前仿真 -
要隔离和仿真任何一个组件,右键单击“设计资源管理器”的“层次结构”选项卡中找到的组件,然后选择“设置为根”。将UpDownCont.vhd组件设置为根。
-
再次右键单击同一组件,然后选择“组织激励”。这将弹出一个菜单,允许关联测试平台.vhd文件。确保没有关联的测试平台.vhd文件,方法是在右侧的“关联文件:”下突出显示文件,然后单击“删除”,然后单击“确定”。对于此仿真,我们将使用UpDownCont.vhd文件底部的测试脚本,并将其粘贴到ModelSim仿真器中。
-
双击UpDownCont.vhd文件将其打开,通过突出显示注释脚本,右键单击并从弹出菜单中选择“复制”来复制注释脚本。
-
打开“项目流程”选项卡,然后单击“仿真”按钮,当询问“您现在要关联激励吗?”时,单击“否”。
-
将“对象”窗口中的3个信号en、cntr_in和updown_out拖放到“波形”窗口中。
-
将之前复制的脚本粘贴到“ transcript”窗口中,按回车键并观察波形。波形应类似于下面图17中所示的波形。

图 17 UpDownCont.vhd 计数器控制 ModelSim 仿真
- Debounce.vhd FSM可以按照与UpDownCont.vhd组件相同的方式进行仿真。Debounce.vhd FSM的仿真可以在下面的图18和19中看到。图19详细显示了脉冲输出。通过尝试用于仿真UpDownCont.vhd组件的命令,创建自己的命令来仿真Debounce.vhd组件。
图 18 Debounce.vhd FSM ModelSim 仿真
图 19 Debounce.vhd FSM 脉冲输出放大视图
-
综合前仿真后,通过右键单击“设计资源管理器”窗口的“层次结构”选项卡中的Top并选择“设置为根”,将Top设置为根。
-
通过点击Top选项卡生成顶层设计,点击SmartDesign→生成设计。
使用Synplify Pro AE进行综合 -
转到“项目流程”选项卡,然后点击“综合”按钮,这将启动Synplify Pro AE。
-
在Synplify Pro左侧面板的时序约束块中输入20 MHz,然后点击运行。应该没有错误。
-
在左侧面板中,确保选中“FSM编译器”。
-
在任务栏中,点击“新建作用域文件”按钮。可以在此处设置约束,点击确定接受默认值。
-
在“时钟”选项卡上,点击n:CLKGEN_0.GLA的“启用”复选框,并在“频率”块中输入20 MHz。参见下面的图20。
图 20 在 Synplify Pro AE 中输入时钟约束
- 接下来,点击“属性”选项卡,在“属性”块中输入syn_encoding,然后按回车键。从对象列中删除,将值列设置为格雷编码,并点击“启用”复选框。参见下面的图21。
图 21 为 Debounce.vhd 电路输入 FSM 属性
-
关闭本地Top_syn.sdc窗口,当询问是否保存文件时点击“是”。当弹出“另存为”窗口时点击“保存”。
-
再次点击运行并退出Synplify Pro,文件→退出。当询问“保存对项目Top_syn的更改”时点击“是”。此过程在我们进入Designer之前约束我们的设计。这将在稍后从Designer中的约束编辑器中显示。
使用Designer进行布局和布线 -
在Libero中转到“项目流程”选项卡,然后点击Designer。
-
在“为Designer组织约束”窗口中点击“确定”接受默认约束。注意Top.pdc和Top_sdc.sdc应该包含在右侧的“Designer的约束文件”下。
-
将启动Designer,点击“下一步”、“下一步”,然后点击“完成”接受默认设置。
-
点击“编译”按钮。
-
当“编译选项”窗口打开时,突出显示“全局管理”类别,选中“扇出大于的常规网络提升:”框,输入15。在“但不超过:”框中,输入3。点击“确定”。参见下面的图22。
图 22 输入编译选项以控制扇出
-
点击Designer中的“I/O属性编辑器”以将信号分配给引脚。
-
启动MultiView Navigator,并打开“I/O属性编辑器”窗口。研究下面的图23,并进行相同的引脚分配。Flash*Freeze引脚已经分配。
图 23 I/O 属性编辑器引脚分配
-
点击文件→提交并检查。点击文件→退出。
-
点击Designer中的“布局”按钮。点击“确定”接受默认设置。
-
布局完成后,布局按钮的右上角应出现一个勾号,表示时序已满足。
-
此时,可以使用“反向标注”按钮,并且可以使用Libero的“项目流程”选项卡中的“仿真”按钮完成布局后仿真。
-
点击Designer中的“时序分析器”按钮。在左侧的“摘要”窗口中,注意绿色勾号表示时序已满足。点击CLKGEN_0下的“寄存器到寄存器”元素。通过查看“最大延迟分析视图”窗口,注意时序已满足。“松弛”列应显示所有正值,左下角窗口显示以纳秒为单位的松弛分布。这些窗口共同向我们显示时序已满足。参见下面的图24。
图 24 SmartTime 最大延迟分析
-
也可以使用“工具→时序分析器→最小延迟分析视图”下的“最小延迟分析视图”来分析保持违规。
-
如果其中一条路径(源引脚到宿引脚)显示负松弛,可以通过双击路径的行来进一步分析时序。将弹出一个单独的窗口,显示扩展的路径。此窗口将显示数据的所需时间和数据到达时间以及松弛。所需时间和到达时间的每个组件都可以在“路径详细信息”下查看。如果从Designer打开ChipPlanner,可以通过右键单击逻辑电路并选择“交叉探测路径”来交叉探测路径。这允许在FPGA结构上分析逻辑路径。参见下一页的图25。
图 25 最大延迟扩展路径
-
时序满足后,可以在Designer中创建编程文件。
-
关闭Smart time文件→退出。
-
点击Designer中的“编程文件”按钮。点击“确定”接受默认值,然后点击“生成”。
-
创建编程数据文件(.pdb)后,关闭Designer。文件→退出。当询问时保存对Designer的更改。
使用Flash Pro对FPGA进行编程 -
确保通过CON2上的迷你USB电缆为板供电,并通过LC编程器(套件中包含)将第二根迷你USB电缆连接到IGLOO nano评估板的LCPS连接器。
-
如果系统提示,请安装USB驱动程序。有关连接开发板的更多帮助,请参考IGLOO nano评估套件的入门卡。
-
在Libero的“项目流程”选项卡中,点击“编程”按钮以启动FlashPro。
-
FlashPro启动并检测到LC编程器。它被检测为FlashPro3,这没问题。点击“编程”按钮对芯片进行编程。参见下面的图26。
图 26 FlashPro 对 IGLOO nano FPGA 进行编程
- 此时,芯片将被编程。Dip开关可用于控制速度、类型以及按下板上的SW1和SW3按钮时PWM占空比变化的快慢。SW3降低PWM占空比,有效调暗LED。按住SW1的同时按下SW3增加PWM占空比,有效调亮LED。参见下面的图27。
图 27 用于操控 LED 闪烁图案和亮度的开关
-
可以使用示波器(引脚76、77和78)查看去抖动、电平/脉冲输出和PWM输出,用于选通解码器上的使能信号。
-
通过将SW6滑动到ON位置,可以进入Flash*Freeze模式。
-
可以使用电流表通过将探头连接到JP10的引脚1和4并从引脚2和3上拔下跳线来测量核心电流。注意当FlashFreeze开关切换时核心电流消耗如何变化。参见图28、29和30以说明FlashFreeze功能。
图 28 测量内核电流时的电流探头连接
图 29 正常模式下 35mA 的内核电流消耗
图 30 Flash*Freeze 模式下 26.8μA 的内核电流消耗
功能、限制和修改
本教程使用Libero v9.1 Service Pack 4以及Synopsis(Synplify Pro AE)和Mentor Graphics(ModelSim AE)的支持软件进行开发。Libero可以作为独立的开发环境与替代的综合和仿真软件一起使用。
结论
本教程演示了使用Libero设计流程实例化Microsemi内核、自定义VHDL内核、在更大的设计中仿真单个组件、为FSM设计设置时序约束和属性、在SmartTime中管理时序约束和交叉探测数据路径、在I/O属性编辑器中设置引脚分配、控制编译和布局设置,以及最终在FlashPro中对IGLOO nano FPGA进行编程是多么容易。确保满足时序要求是任何FPGA设计流程中的重要方面,SmartTime使这一步变得容易。
附加信息
更多设计支持、产品教程、应用笔记、用户指南和其他文档可以在Microsemi cSOC小组的网站上找到,网址为FPGAs and PLDs | Microchip Technology
附录:文件下载




























