高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

时间:2022-10-30 08:58:34


文章目录

  • ​​@[toc]​​
  • ​​1. 工程目录创建​​
  • ​​2. 新建工程​​
  • ​​3. 设计输入​​
  • ​​4. 设计仿真​​
  • ​​5. 综合​​
  • ​​6. 管脚分配​​
  • ​​7. 时钟约束​​
  • ​​8. 比特流文件生成​​
  • ​​9. 程序下载​​
  • ​​10. 程序固化​​
  • ​​11. 总结​​
  • ​​12. 工程下载​​

本文是​​高云FPGA系列教程​​的​​第2篇文章​​。

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

1. 工程目录创建

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

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

(后续实际操作发现,此种文件管理方式不利于工程文件夹的复制和修改)

2. 新建工程

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

选择芯片型号:​​GW1NSR-4C​

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

勾选​​添加到当前工程​

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

源文件截图:

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

激励文件截图:

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

4. 设计仿真

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

和我们的预期设计是一致的,为了缩短仿真时间,我把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​

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

6. 管脚分配

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

输入管脚约束文件名。

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

或者直接输入约束语句:

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文件夹中。

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

或者直接输入以下语句:

create_clock -name gclk -period 37.037 -waveform {0 18.518} [get_ports {gclk}]

8. 比特流文件生成

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

查看逻辑资源占用情况

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

9. 程序下载

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

10. 程序固化

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

fs程序文件的保存路径

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

fs文件的内容格式

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

11. 总结

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

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

12. 工程下载

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

  • ​​gw1nsr_4c_fpga_demo.rar​​

本文是​​高云FPGA系列教程​​的​​第2篇文章​​。