原创 【技术笔记】高云FPGA学习笔记3——FPGA点灯工程创建、下载和固化

2022-9-28 22:42 5352 20 6 分类: FPGA/CPLD 文集: 开发板评测

本文是高云FPGA学习笔记系列的第3篇文章,首发于面包板社区

介绍完高云FPGA开发板,高云FPGA开发环境搭建之后,接下来才是真正的高云FPGA实战开发,如果你有国外FPGA芯片的使用经验,那么对于高云FPGA的使用,也可以很快的上手。

本文介绍基于高云FPGA开发环境——云源软件的使用,介绍如何创建FPGA点灯工程、管脚分配、时钟约束、综合、布局布线、比特流文件生成、下载和固化。

1. 工程目录创建

为了规范的进行开发,建议按照如下文件结构对FPGA工程进行管理,先创建一个文件夹:gw1nsr_4c_fpga_demo,在这个文件夹下再创建以下文件夹:

  • rtl:用于存放Verilog设计文件
  • tb:用于存放仿真文件
  • modelsim:由于云源软件不支持仿真,需要借助第三方仿真工具进行仿真,此文件夹用于存放modelsim工程文件
  • mcu:用于存放MCU工程
  • sct:用于存放约束文件,如管脚约束,时钟约束等
2. 新建工程

打开高云云源软件教育版,点击新建工程,或者直接按下Ctrl+N快捷键,打开工程创建向导。

输入工程名称:project,保存路径选择之前创建的gw1nsr_4c_fpga_demo,创建工程的同时,会创建一个和工程名称相同的project文件夹。

以后就可以直接打开project目录下的gprj后缀的工程文件。

选择芯片型号:GW1NSR-4C

在工程上右键,选择New File,新建设计文件,在弹出的窗口,输入模块名top_hdl,文件类型根据需要选择,保存路径为之前创建的rtl文件夹。

勾选添加到当前工程

3. 设计输入

在云源软件编辑器中输入功能描述,本文以LED点灯为例,结合按键来控制闪烁频率。

实现的功能为:

  • 对外部27MHz时钟信号进行计数,控制LED周期性闪烁。
  • TangNano 4K板载的两路按键,一路作为复位,一路作为用户按键。
  • 用户按键未按下时,LED每500ms翻转一次状态。
  • 用户按键被按下后,LED每100ms翻转一次状态。

Verilog源文件

/***************************************************************
 * Copyright(C), 2010-2022, WeChat:MCU149
 * ModuleName : top_hdl.v 
 * Date       : 2022年9月27日
 * Time       : 20:19:39
 * Author     : WeChat:MCU149
 * Function   : gw1nsr-4c led driver demo
 * Version    : v1.0
 *      Version | Modify
 *      ----------------------------------
 *       v1.0    first version
 ***************************************************************/

module top_hdl(
    //Inputs
    input gclk,      // 27MHz
    input gresetn,    
    input key,

    //Outputs
    output reg led
);

//1.parameter

//2.localparam
localparam KEY_PRESS   = 1'b0; 
localparam KEY_RELEASE = !KEY_PRESS;
localparam LED_ON      = 1'b1;
localparam LED_OFF     = !LED_ON;

localparam LED_PERIOD1 = 27_000_000 / 2 ;      //500ms=27_000_000/2
localparam LED_PERIOD2 = 27_000_000 / 10;      //100ms=27_000_000/10
//localparam LED_PERIOD1 = 100;      //simulation
//localparam LED_PERIOD2 = 200;      //simulation

//3.reg
reg [31:0] cnt;

//4.wire 
wire [31:0] CNT_MAX = (key == KEY_PRESS) ? LED_PERIOD2 : LED_PERIOD1;

//5.assign

//6.always
always @ (posedge gclk) begin
    if(!gresetn) begin
        cnt <= 'd0;
    end
    else begin
        if(cnt >= CNT_MAX)
            cnt <= 'd0;
        else 
            cnt <= cnt + 'd1;
    end
end

always @ (posedge gclk) begin
    if(!gresetn) 
        led <= LED_OFF;
    else if(cnt == CNT_MAX)
        led <= !led;
        // led <= (led == LED_OFF) ? LED_ON : LED_OFF;
end

//7.instance

endmodule   //top_hdl end

Testbench仿真文件:

`timescale 1ns/1ps

module top_hdl_tb;

localparam PERIOD = 10;      //ns

reg clk;
reg rst_n;
reg key;

always #(PERIOD/2) clk <= !clk;

initial begin
    $display("testbench: %s", top_hdl_tb);

    rst_n = 0;
    clk = 0;
    key = 0;

    #(PERIOD*100)
    rst_n = 1;
    #(PERIOD*1000)
    key = 1;
    #(PERIOD*1000)
    key = 0;
    #(PERIOD*1000)
    $stop(0);
end

top_hdl top_hdl_ut0(
    //Inputs
    .gclk(clk),      // 27MHz
    .gresetn(rst_n),    
    .key(key),

    //Outputs
    .led()
);

endmodule   //top_hdl_tb end

源文件截图:

激励文件截图:

4. 设计仿真

由于云源软件暂时不支持仿真功能,我们还需要借助第三方工具来完成功能仿真,这里我选择的是Modelsim,仿真的波形如下:

和我们的预期设计是一致的,为了缩短仿真时间,我把LED闪烁周期值减小了。

localparam LED_PERIOD1 = 27_000_000 / 2 ;      //500ms=27_000_000/2
localparam LED_PERIOD2 = 27_000_000 / 10;      //100ms=27_000_000/10
//localparam LED_PERIOD1 = 100;      //simulation
//localparam LED_PERIOD2 = 200;      //simulation
5. 综合

在进行管脚分配前,需要先进行综合,综合工具为高云自研GowinSynthesis工具,如果有多个设计文件,还需要指定顶层模块的名称,在综合选项右键点击Configuration

指定工程的顶层模块名称为:top_hdl

6. 管脚分配

新建物理(管脚)约束文件,命名为top_sct,并保存到sct文件夹下。

输入管脚约束文件名。

点击Floor Planner,打开图形化管脚分配工具。

分配管脚,和开发板上的管脚保持一致

或者直接输入约束语句:

IO_LOC "led" 10;
IO_PORT "led" PULL_MODE=NONE DRIVE=8;
IO_LOC "key" 15;
IO_PORT "key" PULL_MODE=UP;
IO_LOC "gresetn" 14;
IO_PORT "gresetn" PULL_MODE=UP;
IO_LOC "gclk" 45;
IO_PORT "gclk" PULL_MODE=UP;
7. 时钟约束

时序约束不是必须要做,可以省略。

新建时序约束文件,命名为top_sdc,也保存到sct文件夹中。

点击时序约束Timing Constraints Editor,打开时钟约束工具。

这里只对外部时钟进行约束,右键点击Ports->gclk,Add Clock,输入时钟频率为27MHz。

或者直接输入以下语句:

create_clock -name gclk -period 37.037 -waveform {0 18.518} [get_ports {gclk}]
8. 比特流文件生成

点击Place and Route,生成比特流文件,速度很快,几秒钟,比国外的EDA环境快很多!

查看时序报告,可以看到满足设计要求,最大频率可以到128MHz。

查看逻辑资源占用情况

9. 程序下载

点击Program Device,打开编程工具,执行编程。

配置为SRAM模式,选择project/impl/pnr下的fs格式的比特流文件。这个模式是下载到内部RAM中,掉电程序会丢失。

右键执行编程,下载速度很快。

10. 程序固化

选择Embedded Flash Mode会把程序固化到内部Flash中,掉电程序不丢失,上电程序瞬时启动,同样是选择fs文件。

fs程序文件的保存路径

fs文件的内容格式

11. 总结

相比于国外FPGA厂商EDA开发环境,几个G到几十个G的大小,高云云源软件安装包也很小巧,界面也很简洁,综合速度非常快,是我没想到的,好像在使用单片机一样,点一下就编译完成了,以本文简单的LED示例工程为例,比特流文件几乎在几秒钟内生成;无论是下载比特流文件到RAM还是Flash中,速度都很快,而且只有一种fs程序文件格式,不用再进行bit/mcs转换;云源软件自带的编辑器也很好用,和Notepad++界面差不多,而且快捷键很方便,具有基本的自动补全功能。

12. 工程下载

以下链接是本次笔记中建立的高云FPGA工程,开发环境是Gowin V1.9.8.07 Education

  • https://wcc-blog.oss-accelerate.aliyuncs.com/img/220928/gw1nsr_4c_fpga_demo.rar

作者: whik, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3887760.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论3条评论)

登录后参与讨论

托尼杰克马 2022-10-29 14:45

看看

哈哈大哥哥 2022-10-28 14:45

一如既往的详细。

乖乖兔爸爸 2022-10-10 09:30

楼主,你有点误导了吧!
“生成比特流文件速度快,下载也快,比国外EDA环境快很多”,原因是片上资源才4608,点灯总资源才60,简直是玩具一样。
你非要说自己的发条小车,0.5秒就起步发动了,比法拉利赛车要快,我也没办法,的确是事实。但能说明什么?
你的发条小车比法拉利赛车牛么?能hold住上万公里的赛程么?
相关推荐阅读
whik 2022-10-08 23:26
【技术笔记】高云FPGA学习笔记6——ARM点灯工程设计
【技术笔记】高云FPGA学习笔记6——ARM点灯工程设计本文是高云FPGA学习笔记系列的第6篇文章,首发于面包板社区:【技术笔记】高云FPGA学习笔记1——TangNano 4K开发板简介【技术笔记】...
whik 2022-10-06 20:42
【技术笔记】高云FPGA学习笔记5——片上逻辑分析仪GAO的使用
本文是高云FPGA学习笔记系列的第5篇文章,首发于面包板社区:【技术笔记】高云FPGA学习笔记1——TangNano 4K开发板简介【技术笔记】高云FPGA学习笔记2——FPGA和ARM开发环境搭建【...
whik 2022-10-02 22:44
【技术笔记】高云FPGA学习笔记4——基本IP原语使用和仿真
本文是高云FPGA学习笔记系列的第4篇文章,首发于面包板社区:【技术笔记】高云FPGA学习笔记1——TangNano 4K开发板简介【技术笔记】高云FPGA学习笔记2——FPGA和ARM开发环境搭建【...
whik 2022-09-26 23:05
【技术笔记】高云FPGA学习笔记2——FPGA和ARM开发环境搭建
上一篇文章分享了基于高云FPGA的开发板——TangNano 4K,介绍了开发板的硬件资源以及高云FPGA的特性,文末提到高云的FPGA还不支持SerDes高速串行接口,今天(09-26)高云半导体官...
whik 2022-09-25 23:01
【技术笔记】高云FPGA学习笔记1——TangNano 4K开发板简介
标题1:不足百元的国产FPGA开发板,集成ARM Cortex-M3硬核!标题2:国产FPGA开发板上手体验:6x6mm的FPGA芯片还带ARM硬核!之前参与了面包板社区组织的国产替代话题活动,我发表...
我要评论
3
20
关闭 站长推荐上一条 /2 下一条