Microsemi Libero SoC 教程2 (点亮LED闪烁)

前言

点亮LED灯就是软件中的hello world!任务:用libero集成开发环境建立一个示例工程,让一个LED以500ms的频率闪烁。

新建工程的主要步骤

  1. 新建工程,选择芯片的型号
  2. 新建设计,使用verilog编写点灯模块
  3. 仿真验证,对编写的点灯模块进行时序仿真,来验证是否满足设计需求
  4. 综合、管脚分配、布局、布线
  5. 生成程序文件,链接开发板,使用FlashPro下载器程序到芯片内,观察现象是否和设计的一致

1 新建工程

  1. 和大多数IDE一样,选择project -> New Project,新建一个工程
    在这里插入图片描述
  2. 输入工程名称LED_Blink,选择工程存放的路径,工程名称和路径不要有中文字符和空格,选择源文件的类型verilog或者VHDL

在这里插入图片描述
3. 选择芯片型号,选择适合的芯片即可。
在这里插入图片描述
4. 选择IO的电平标准,高低电平的电压范围是不同的,这里选择默认的LVTTL

在这里插入图片描述
5. 是否创建MSS模块,MSS里有PLL和ARM M3 的使用,以后用到PLL和ARM内核时再添加,然后一直finish下去

到这里工程就创建完了,然后会在存储路径下生成一个和工程名称一样的文件夹。
在这里插入图片描述

2 添加设计文件

支持HDL和原理图两种方式来执行

  1. 创建Verilog文件
    创建verilog文件有多种方式,可以直接双击左侧的菜单中的 create design -> create HDL

在这里插入图片描述
或者点击 File -> New -> HDL ,这两种方式都可以创建一个Verilog 设计文件,这里选择verilog文件

在这里插入图片描述
输入模块的名称: led_driver ,不用添加 v后缀名

led_driver.v:

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 个时钟周期

3 仿真验证

  1. 编写完成后,点击对号语法检查,如果没有错误就可以进行时序仿真了
  2. 新建Testbench文件,底部切换到 Design Hierarchy选项卡,在led模块上右键选择 create testbench 创建仿真文件,选择HDL格式

在这里插入图片描述

给创建的testbench文件 后缀加上_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个时钟周期之后拉高。

3.1 使用modelsim 进行时序仿真

仿真代码语法检查无误之后,可以进行modelSim自动仿真,在安装Libero时,已经默认安装了ModelSim软件,直接双击simulate,这里要注意选择verify pre-synthesized design

在这里插入图片描述
这时候我们就可以看到仿真输出信号了
在这里插入图片描述

参考:
https://blog.csdn.net/whik1194/article/details/101714930

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值