嵌入式开发中的Hello World,点灯是再也基础不过的实验了,通过点灯实验,可以了解芯片GPIO的控制和开发环境IDE新建工程的流程,对于FPGA来说,每个IO口几乎一样,所以本篇文章主要学习一下如何基于Microsemi Libero集成开发环境建立一个示例工程,让一个LED以500ms的频率闪烁,以Microsemi SmartFusion系列FPGA——A2F200M3F为例,Microsemi其他系列FPGA芯片过程类似。
准备工作
工欲利其事,必先利其器,充分的准备工作很有必要。
软件准备:
Microsemi Libero SoC集成开发环境,并已经成功注册,软件版本推荐V11.8或更高版本。
硬件准备:
Microsemi FPGA开发板,主控芯片A2F200M3F-PQ208,其他型号芯片类似。
Flash Pro 4或Flash Pro5下载器,用于给FPGA芯片下载程序和调试。
新建工程的主要步骤
新建工程,选择芯片型号等
新建设计,使用Verilog编写点灯模块。
仿真验证,对编写的点灯模块进行时序仿真,来验证是否满足设计需求。
综合、管脚分配、布局、布线。
生成程序文件,连接开发板,使用FlashPro下载程序到芯片内,观察现象是否和设计的一致。
1.新建工程
和大多数IDE一样,选择Project -> New Project,新建一个工程。
输入工程名称LED_Blink,选择工程存放的路径,工程名称和路径不要有中文字符和空格,选择源文件的类型Verilog或者VHDL。
选择芯片型号,这里选择Microsemi SmartFusion系列下的A2F200M3F芯片,PQ208封装,把鼠标放在所选芯片上,可以查看芯片的详细参数:封装、速度等级、温度范围,内核电压、Flash ROM大小、用户IO数目、RAM大小、Flash ROM大小,ARM Cortex-M3 SoC的外设配置等详细的参数。![图片[1] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[1] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648342b21ddac507cc5651a2.jpg)
选择IO的电平标准,不同的电平标准,高低电平的电压范围是不同的,这里选择默认的LVTTL。![图片[2] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[2] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648342d51ddac507cc568116.jpg)
是否创建MSS模块,MSS里有PLL和ARM Cortex-M3的使用,以后用到PLL和ARM核时再添加,这里先不选择,以后需要也可以再创建。![图片[3] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[3] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648343271ddac507cc56e5c6.jpg)
是否导入已经存在的HDL文件,如果已经有一些写好的模块,可以在这里直接导入。![图片[4] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[4] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/6483435a1ddac507cc571ef8.jpg)
是否导入已经存在的管脚约束文件,这里选择不添加,我们会在后面通过图形化工具来指定管脚。![图片[5] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[5] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/6483436c1ddac507cc573512.jpg)
到这里,工程就创建完成了,然后会在存储路径下生成一个和工程名称一样的文件夹,工程相关的所以文件都存放在这里。主要包括以下几个文件夹:![图片[6] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[6] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648343881ddac507cc575555.jpg)
具体每个文件夹存放的是什么文件,我们在以后的文章再详细介绍。以上的工程配置在创建完工程之后,也可以再次更改,可以通过Project->Project Setting查看或更改配置:![图片[7] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[7] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648343af1ddac507cc578e76.jpg)
或者通过点击如下图标来进入配置界面:![图片[8] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[8] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648343c51ddac507cc57a82f.jpg)
弹出如下窗口,和新建工程是一样的,可以更改FPGA的型号,但只限于同一个系列内。
2.添加设计文件
Microsemi Libero开发环境支持HDL方式和SmarDesign方式来创建设计,HDL方式支持VerilogHDL和VHDL两种硬件描述语言,而SmartDesign方式和Xilinx的Schematic原理图方式是一样的,是通过图形化的方式来对各个模块之间的连接方式进行编辑,两种方式都可以完成设计。由于本实验功能简单,所以以使用Verilog文件为例。
创建Verilog文件
创建Verilog文件有多种方式,可以直接双击左侧菜单中的Create Design->Create HDL![图片[9] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[9] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648343fa1ddac507cc57ec85.jpg)
或者点击File->New->HDL,这两种方式都可以创建一个Verilog设计文件,这里选择Verilog文件。![图片[10] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[10] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648344a91ddac507cc58d252.jpg)
输入模块名称:led_driver,不用添加.v后缀名,Libero软件会自动添加。
源代码:
module led_driver(
//input
input clk, //clk=2MHz
input rst_n, //0=reset
//output
output reg led
);
parameter T_500MS = 999999; //1M
reg [31:0] cnt;
always @ (posedge clk)
begin
if(!rst_n)
cnt <= 32'b0;
else if(cnt >= T_500MS)
cnt <= 32'b0;
else //cnt < T_500MS
cnt <= cnt + 32'b1;
end
always @ (posedge clk)
begin
if(!rst_n)
led <= 1'b1;
else if(cnt >= T_500MS)
led <= ~led;
end
endmodule可以看到,代码非常的简单,定义一个计数器,系统时钟为2MHz=500ns,500ms=1M个时钟周期,当计数到500ms时,LED翻转闪烁。
3.仿真验证
编写完成,之后,点击对号进行语法检查,如果没有语法错误就可以进行时序仿真了。
新建Testbench文件
底部切换到Design Hierarchy选项卡,在led模块上右键选择Create Testbechch创建仿真文件,选择HDL格式。![图片[11] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[11] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648345221ddac507cc5973eb.jpg)
给创建的testbench文件名一般为模块名后加_tb,这里为:led_driver_tb,因为我们的板子外部晶体为2M,所以这里系统时钟周期为500ns,这个也可以在文件中更改。![图片[12] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[12] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648345791ddac507cc59e242.jpg)
点击OK之后,可以看到,Libero软件已经为我们生成了一些基本代码,包括输入端口的定义,系统时钟的产生,输入信号的初始化等等。我们只需要再增加几行即可。
`timescale 1ns/100ps
module led_driver_tb;
parameter SYSCLK_PERIOD = 500;// 2MHZ
reg SYSCLK;
reg NSYSRESET;
wire led; //add output reg
initial
begin
SYSCLK = 1'b0;
NSYSRESET = 1'b0;
end
initial
begin
#(SYSCLK_PERIOD * 10 )
NSYSRESET = 1'b0; //add system reset
#(SYSCLK_PERIOD * 100 )
NSYSRESET = 1'b1; //add system set
end
always @(SYSCLK) //generate system clock
#(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;
led_driver led_driver_0 (
// Inputs
.clk(SYSCLK),
.rst_n(NSYSRESET),
// Outputs
.led(led ) //add port
// Inouts
);
endmodule仿真代码也非常简单,输入信号初始化,NSYSRESET在10个时钟周期之后拉低,100个时钟周期之后拉高。
使用ModelSim进行时序仿真
仿真代码语法检查无误后,可以进行ModelSim自动仿真,在安装Libero时,已经默认安装了ModelSim仿真软件,并和Libero进行了关联。直接双击Simulate,Libero会自动打开ModelSim。![图片[13] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[13] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648345bc1ddac507cc5a39f8.jpg)
可以看到输入输出信号,已经为我们添加好了:![图片[14] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[14] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648345ce1ddac507cc5a5348.jpg)
先点击复位按钮,复位系统,然后设置要运行的时间,由于设计的是500ms闪烁一次,这里我们先运行2s,即2000ms,在ModelSim中2秒已经算是很长的时间了,然后点击时间右边的运行按钮,耐心等待,停止之后就会看到led按500ms变化一次的波形了,如下图所示,可以再添加一个cnt信号到波形观察窗口,可以看到cnt周期性的变化。![图片[15] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[15] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648345f81ddac507cc5a8690.jpg)
使用2个光标的精确测量,可以看出,led每隔500ms翻转一次,说明程序功能是正确的。
4.管脚分配
与STM32等MCU不同,FPGA的引脚配置非常灵活,如STM32只有固定的几个引脚才能作为定时器PWM输出,而FPGA通过管脚分配可以设置任意一个IO口输出PWM,而且使用起来非常灵活,这也是FPGA和MCU的一个区别,当然其他的功能,如串口外设,SPI外设等等,都可以根据需要自己用HDL代码来实现,非常方便。
时序仿真正常之后,就可以进行管脚分配了,即把模块的输入输出端口,真正的分配到芯片实际的引脚上,毕竟我们的代码是要运行在真正的芯片上的。
打开引脚配置图形化界面
双击Create/Edit I/O Attributes,打开图形化配置界面,在打开之前,Libero会先进行综合(Synthesize)、编译(Complie),当都运行通过时,才会打开配置界面。![图片[16] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[16] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648346411ddac507cc5ae0dd.jpg)
分配管脚
管脚可视化配置工具使用起来非常简单:引脚号指定、IO的电平标准,内部上下拉等等,非常直观。把时钟、复位、LED这些管脚分配到开发板原理图中对应的引脚,在分配完成之后,可以点击左上角的commit and check进行检查。![图片[17] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[17] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648346a61ddac507cc5b54eb.jpg)
在分配完成之后,为了以后方便查看已经分配的引脚,可以导出一个pdc引脚约束文件,选择Designer窗口下的File->Export->Constraint File,会导出一个led_driver.pdc文件,保存在工程目录下的constraint文件夹。![图片[18] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客 图片[18] - Microsemi Libero SOC使用示例—建立点灯工程 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/648347611ddac507cc5c4f92.jpg)
一些特殊管脚的处理
SmartFusion系列的FPGA芯片,在分配个别引脚,如35-39、43-47这些引脚时,直接不能分配,这些引脚属于MSS_FIO特殊引脚,具体怎么配置为通用IO,可以查看下一篇文章。而新一代的SmartFusion 2系列的FPGA芯片则没有这种情况。
5.程序下载
管脚分配完成之后,连接FlashPro下载器和开发板的JTAG接口,关闭Designer窗口,选择Program Device,耐心等待几分钟,如果连接正常,会在右侧输出编程信息:擦除、验证、编程等操作,下载完成之后,就会看到板子上的LED闪烁起来了。
Microsemi FPGA的Flash结构
和Altera、Xilinx不同,Microsemi FPGA在下载程序时,并不是下载程序到SPI Flash,而是直接下载到FPGA内部的。目前,FPGA 市场占有率最高的两大公司Xilinx和Altera 生产的 FPGA 都是基于 SRAM 工艺的,需要在使用时外接一个片外存储器以保存程序。上电时,FPGA 将外部存储器中的数据读入片内 RAM,完成配置后,进入工作状态;掉电后 FPGA 恢复为白片,内部逻辑消失。这样 FPGA 不仅能反复使用,还无需专门的 FPGA编程器,只需通用的 EPROM、PROM 编程器即可。而Microsemi的SmartFusion、SmartFusion2、ProASICS3、ProASIC3E系列基于Flash结构,具备反复擦写和掉电后内容非易失性, 因此基于Flash结构的FPGA同时具备了SRAM结构的灵活性和反熔丝结构的可靠性,这种技术是最近几年发展起来的新型FPGA实现工艺,目前实现的成本还偏高,没有得到大规模的应用。
示例工程下载
基于Libero V11.8.2.4的工程下载: