点灯

本实例的过程

新建工程 -> 添加源代码文件 -> 添加时序、引脚约束 -> 综合 -> 烧录

在看这篇文档前,请再次确定自己看过Gowin云源软件用户指南,第5章 云源软件使用

本实验的源码地址:https://github.com/sipeed/Tang-Nano-examples/tree/master/example_led

Verilog 预备知识

这里只介绍接下来会用到的相关语法,更多的可以参考《Verilog 数字系统设计教程》

Verilog 的基本设计单元是模块,每个 Verilog 程序包括 4个 主要部分:端口定义、I/O说明、内部信号声明和功能定义

模块就像我们平时提到的黑匣子,当我们实现了模块后,就不需要去关心模块内部,只需要根据模块定义的输入输出格式,将模块实例化,给模块提供输入,就可以让模块自己工作了

一个模块长成这样

module block (input a, output b);
reg [width-1:0] R_1;

assign b = a;
always @(posedge clk or negedge reset_n)
begin
// do something
end

endmodule

模块整体结构由 module 和 endmodule 组成,module 后面跟着的是模块接口的定义,声明了端口的方向是输入还是输出

模块内部有时候会使用内部的信号,内部信号有 wire 和 reg 类型

功能的定义可以通过 assign 和 always块 完成。 assign 是描述组合逻辑最常用的方法之一; always 块机可用于描述组合逻辑,也可描述时序逻辑

引脚使用情况

板载的是一颗三色 RGB 灯,原理图如下

整个程序使用到的引脚分布如下

port I/O pin desc
sys_clk input 35 时钟输入脚
sys_rst_n input 15 系统复位脚
led[0] output 16 绿灯
led[1] output 17 蓝灯
led[2] output 18 红灯

程序设计

本系统时钟为 24Mhz,一个机器周期为 1/24M s,也就是说每过 12000000 个时钟周期为 0.5s

在程序中通过 counter 计算 12000000 个时钟周期,实现 0.5s 的等待,等时间到了之后将 counter 置 0,并改变 LED 的颜色

module led (
    input sys_clk,          // clk input
    input sys_rst_n,        // reset input
    output reg [2:0] led    // 110 G, 101 R, 011 B
);

reg [23:0] counter;

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        counter <= 24'd0;
    else if (counter < 24'd1200_0000)       // 0.5s delay
        counter <= counter + 1'b1;
    else
        counter <= 24'd0;
end

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        led <= 3'b110;
    else if (counter == 24'd1200_0000)       // 0.5s delay
        led[2:0] <= {led[1:0],led[2]};
    else
        led <= led;
end

endmodule

引脚约束

要想让 fpga 实现代码的功能,还必须将代码中涉及的引脚操作约束到 fpga 实际的引脚上

如下图,在左边的工作区点击 process,然后双击 FloorPlanner

在工程中第一次点击,可能会提示说创建文件,点击确定即可

在弹出窗口中,切换到 Package View ,将 Ports 下的端口拖到 fpga 对应的引脚上,保存即可,如下图

综合

在左侧的工作区中,右键 Synthesize 或 Place&Route 时,会有 run 的选项,点击即可

烧录到开发板

有两种选择,一种是烧录到 sram 中,一种是烧录到 flash 中

烧录到 sram 中比较快,但是掉电后 fpga 中就没有固件了;烧录到 flash 中可以在系统掉电后保存之前烧录的固件

烧录是通过 Programer 完成的

双击左侧工作区的 Program Device 就可以打开 Programer

不过在使用 Programer 前需要注意,要在 Synthesize 和 Place&Route 都完成后才能使用 Programer ,否则软件会报错 Bitstream file dose not exists

Linux 用户需要注意

Linux 安装包中的编程器适用于 Linux 版本 Red Hat 5.10,如需 Red Hat 6/7 版本的编程器,请到官网上下载安装后,将安装包替换为 Gowin 云源软件安装包中的文件夹“Programmer”。

更改烧录位置

要选择固件烧录的位置,可以在选中芯片的情况下,点击 Edit -> Configure Device

在弹出窗口中选择自己需要烧录到的位置,这里选择的是 flash ,默认烧录位置是 sram

烧录

在选择好烧录位置后,就可以烧录固件了,点击菜单栏的烧录即可