嵌入式开发中的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的外设配置等详细的参数。
选择IO的电平标准,不同的电平标准,高低电平的电压范围是不同的,这里选择默认的LVTTL。
是否创建MSS模块,MSS里有PLL和ARM Cortex-M3的使用,以后用到PLL和ARM核时再添加,这里先不选择,以后需要也可以再创建。
是否导入已经存在的HDL文件,如果已经有一些写好的模块,可以在这里直接导入。
是否导入已经存在的管脚约束文件,这里选择不添加,我们会在后面通过图形化工具来指定管脚。
到这里,工程就创建完成了,然后会在存储路径下生成一个和工程名称一样的文件夹,工程相关的所以文件都存放在这里。主要包括以下几个文件夹:
具体每个文件夹存放的是什么文件,我们在以后的文章再详细介绍。以上的工程配置在创建完工程之后,也可以再次更改,可以通过Project->Project Setting查看或更改配置:
或者通过点击如下图标来进入配置界面:
弹出如下窗口,和新建工程是一样的,可以更改FPGA的型号,但只限于同一个系列内。
2.添加设计文件
Microsemi Libero开发环境支持HDL方式和SmarDesign方式来创建设计,HDL方式支持VerilogHDL和VHDL两种硬件描述语言,而SmartDesign方式和Xilinx的Schematic原理图方式是一样的,是通过图形化的方式来对各个模块之间的连接方式进行编辑,两种方式都可以完成设计。由于本实验功能简单,所以以使用Verilog文件为例。
创建Verilog文件
创建Verilog文件有多种方式,可以直接双击左侧菜单中的Create Design->Create HDL
或者点击File->New->HDL,这两种方式都可以创建一个Verilog设计文件,这里选择Verilog文件。
输入模块名称: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格式。
给创建的testbench文件名一般为模块名后加_tb,这里为:led_driver_tb,因为我们的板子外部晶体为2M,所以这里系统时钟周期为500ns,这个也可以在文件中更改。
点击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。
可以看到输入输出信号,已经为我们添加好了:
先点击复位按钮,复位系统,然后设置要运行的时间,由于设计的是500ms闪烁一次,这里我们先运行2s,即2000ms,在ModelSim中2秒已经算是很长的时间了,然后点击时间右边的运行按钮,耐心等待,停止之后就会看到led按500ms变化一次的波形了,如下图所示,可以再添加一个cnt信号到波形观察窗口,可以看到cnt周期性的变化。
使用2个光标的精确测量,可以看出,led每隔500ms翻转一次,说明程序功能是正确的。
4.管脚分配
与STM32等MCU不同,FPGA的引脚配置非常灵活,如STM32只有固定的几个引脚才能作为定时器PWM输出,而FPGA通过管脚分配可以设置任意一个IO口输出PWM,而且使用起来非常灵活,这也是FPGA和MCU的一个区别,当然其他的功能,如串口外设,SPI外设等等,都可以根据需要自己用HDL代码来实现,非常方便。
时序仿真正常之后,就可以进行管脚分配了,即把模块的输入输出端口,真正的分配到芯片实际的引脚上,毕竟我们的代码是要运行在真正的芯片上的。
打开引脚配置图形化界面
双击Create/Edit I/O Attributes,打开图形化配置界面,在打开之前,Libero会先进行综合(Synthesize)、编译(Complie),当都运行通过时,才会打开配置界面。
分配管脚
管脚可视化配置工具使用起来非常简单:引脚号指定、IO的电平标准,内部上下拉等等,非常直观。把时钟、复位、LED这些管脚分配到开发板原理图中对应的引脚,在分配完成之后,可以点击左上角的commit and check进行检查。
在分配完成之后,为了以后方便查看已经分配的引脚,可以导出一个pdc引脚约束文件,选择Designer窗口下的File->Export->Constraint File,会导出一个led_driver.pdc文件,保存在工程目录下的constraint文件夹。
一些特殊管脚的处理
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的工程下载:
评论 (0)