侧边栏壁纸
    • 累计撰写 302 篇文章
    • 累计收到 527 条评论
    Microsemi Libero SOC使用示例—建立点灯工程
    我的学记|刘航宇的博客

    Microsemi Libero SOC使用示例—建立点灯工程

    刘航宇
    2023-06-09 / 0 评论 / 803 阅读 / 正在检测是否收录...

    嵌入式开发中的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,新建一个工程。
    image.png
    输入工程名称LED_Blink,选择工程存放的路径,工程名称和路径不要有中文字符和空格,选择源文件的类型Verilog或者VHDL。
    image.png
    选择芯片型号,这里选择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的工程下载:

    2
    Microsemi Libero SOC常见问题-FPGA全局网络的设置
    « 上一篇 2023-06-20
    Windows安装Jupyter Notebook及机器学习的库
    下一篇 » 2023-05-29

    评论 (0)

    取消