1、文件归类
在验证开发环境之前我得先给大家介绍一下文件体系,在项目设计前,首先建立清晰的文件体系,将不同类型的设计文件分类存放。这种做法能为项目的后期管理提供便利。如果不进行分类,而是将所有文件混合存放,会导致文件查找、管理和移植时变得非常困难。因此,养成良好的文件体系习惯对于项目的开发至关重要。
doc:该文件夹主要放置一些文档资料,如数据手册,画的波形图等都可以存放到这个文件夹里面。
pro:该文件夹主要放置的是工程文件,将 FPGA 软件工程都放在里面,命名则能够突出该项目的功能或者是结果来命名。
sim:该文件夹主要放置的是仿真工程文件,modelsim 仿真结果图等都可以放入这里面。
rtl:该文件夹主要放置可综合的代码,就是最后可以生成硬件电路的代码,因为这部分代码主要是寄存器描述的寄存器传输级的代码所以文件夹取名为 rtl(register transport level)。
接下来我们在 桌面(大家根据自己的实际情况创建一个文件夹来存放我们的 逻辑派 的项目工程,这是我的路径:Desktop\Gowin\led_text) 再里面创建一个本章任务的一个文件夹,如下图所示:
注:由于高云 Gowin 软件的问题,不支持直接在以存在的文件夹里面添加工程,故只能在创建工程的时候在添加。
2、工程创建
前面我们导入 License 文件,接下来打开 Gowin 软件,然后新建一个工程,我们可以通过创建工程向导的方式来创建工程;工程建立完成后,我们需要新建一个 Verilog 文件,然后我们将设计的代码写入到新建的 Verilog 顶层文件中,并对工程进行配置,编译等,步骤如下:
打开高云的软件,点击新建工程,后会弹出下示对话框,点击 OK 按钮:如下图所示:
接下来就会出现一个工程向导,如下图所示:
注: Name 为工程名字。
Create in 为工程路径(工程路径不能包含中文、空格或者其它一些特殊的符号,尽量使用英文、数字和下划线,否则工程会创建失败,在Windows系统路径长度限制为260个字符)
创建完毕之后就可以点击 Next 按钮进行下一步,接下来是芯片类型的选择,如下图所示:
名称的含义:
Series: | 芯片系列,我们这里选择 GW2A |
Package: | 芯片的封装类型,我们这里选择 PBGA256 |
Device: | 器件类型,我们这里选择 GW2A-18 |
Speed: | 芯片速度等级,我们这里选择 C8/I7 |
Device Version: | 器件版本,我们这里选择 C |
Part Number: | 芯片型号,该栏会显示所选择器件的详细资源信息 |
我们在 Filter 中选择的系列、封装、器件、速度等级和版本,都会在下面匹配出唯一的型号,点击选择你手中开发板的型号,选择信息如下图所示:
然后进行下一步,在 Summary 中软件会将我们新建的 FPGA 工程信息做有一个汇总,方便我们查看有没有点错的地方,如下图所示:
我们直接点击 Finish 按钮完成工程的创建,工程创建完成后,就进入了高云的工程主界,如下图所示:
Gowin 工程的子窗口说明:
1、菜单栏:提供一些工具,包括File、Edit、Project、Tools、Window和Help选项。
2、工具栏:提供一下常用功能,如新建工程、打开工程、保存工程等。
3,工程管理区(Design):提供工程及其相关文件的管理和显示功能,显示或编辑工程所用器件信息、用户设计文件、用户设计约束文件以及配置文件等。
4、过程管理区(Process) :提供用户 FPGA 设计流程,包括综合(Synthesize)、布局布线(Place& Route)以及编程器件(Programer),同时可双击启动时序约束和物理约束工具进行约束文件编辑。
5、设计层级显示区(Hierarchy):加载设计文件后,软件会先对设计文件进行解析,Hierarchy 窗口会显示当前工程的设计层级关系。通过 Hierarchy 窗口可以定位某个 module 的 定义以及实例化在设计文件中的位置,还可以将某个 module 设为 top module。在 Hierarchy 窗口中,Unit 列显示设计文件的 module 层级结构,Files 列显示 module 定义所在的文件。目前 Hierarchy 已支持对 Verilog 语言、VHDL 语言以及 System Verilog 语言的解析。
6、工程信息显示区:提供工程路径信息显示和所选择的器件信息的显示功能。
7、信息输出区:显示软件在运行过程中的处理信息, 配合下面2个的可手动切换标签页查看不同类型的输出信息。
8、Tcl 命令编辑区:在窗口中输入 Tcl 命令后通过回车键来执行相关命令。
9、全部输出信息显示区(Console 选项):包括 Tcl 命令窗口、 警告信息、 错误信息等。
10、输出信息分类汇总区(Message 选项):包括 Note 信息、 警告信息、 错误信息。
注:详细请查看官网的Gowin文档(链接:https://cdn.gowinsemi.com.cn/SUG100-4.1_Gowin云源软件用户指南.pdf)
接下来我们该进行工程文件的添加了在 工程管理区 空白处 右击选择 New File... 如下图所示:
会弹出新建文件的的对话框,如下图所示:
选择创建 Verilog File 文件,选择 OK 按钮,接下来该对这个新建的 Verilog 文件进行命名,命名完毕后选择 OK 按钮,如下图所示:
注:Name 为工程名字,这里我们命名为 led ,其后面名是 .v 这个是默认的不用管。
Create in 为Verilog文件路径,保持默认。
点击 OK 按钮后软件自动我我们打开 led.v 的 Verilog 文件的编写窗口了,接下来大家跟着我在 led.v 里面写我们的闪烁例程,程序如下所示:
由于本篇教大家走一遍流程,及 verilog 语法暂不在本篇讲解。
module led(
input sys_clk, // 全局系统时钟
input sys_rst_n, // 全局系统复位,低电平有效
output reg led // LED 灯输出
);
reg [25:0] count; // 计数器,用于计时
parameter Scends = 50_000_000; // 1 秒所需的脉冲数(假设系统时钟为 50MHz)
// 定时 1 秒
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
count <= 26'd0; // 如果复位信号有效,计数器清零
else if (count < Scends - 26'd1)
count <= count + 26'd1; // 如果计数器未到达 1 秒,继续计数
else
count <= 26'd0; // 达到 1 秒后,计数器清零
end
always @(*) begin
if (!sys_rst_n)
led <= 1'b1; // 如果复位信号有效,LED 关闭
else if (count < Scends / 2)
led <= 1'b0; // 计数器在前半秒,LED 点亮
else
led <= 1'b1; // 计数器在后半秒,LED 熄灭
end
endmodule
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
led_light 模块详解:
第 1 行和第 30 行是 Verilog 语言中模块定义的标准语句,分别表示模块的开始和结束。第 1 行 module 后的 led() 是模块名称,它应与 Verilog 工程的命名保持一致。
第 2 行:clk 表示本模块的时钟信号。如果前缀为 sys 则表示这是全局时钟,即整个工程的时钟由此信号提供。时钟信号如同数字电路的心脏,提供脉动以控制信号的变化,确保各个模块的同步和协调运行
第 3 行:rst 的全称是 Reset ,在 RAM 、FAPG 中 Reset 代表重置信号,用于将系统或电路恢复到初始状态。如果前面加上 sys 则表示全局复位,也就是整个工程的复位都由它靠它。在 Verilog 代码中,加 _n 表示低电平有效,即当 sys_rst_n 为低电平(0)时,系统会被复位。
第 5 行:定义一个 1 位宽的输出端口 led。
第 8 行:定义了一个 26 位的寄存器 count,用于计数系统时钟的脉冲数量(即计数器的值),从而实现定时功能。count 用于计数,从而精确控制 LED 的闪烁频率,确保其按照预定节奏进行闪烁。
第 9 行:定义一个常量参数,你可以在设计中使用一个名称来引用一个值,并且只需要在一个地方修改它的定义即可更新整个设计中使用到这个值的所有地方。这种方法提高了代码的可维护性和可读性。
第 12 ~ 19 行:在 sys_clk 的上升沿或 sys_rst_n 的下降沿触发时,计数器 count 会在达到预设值后自动清零,并重新开始计数。如果 sys_rst_n 为低电平(表示复位状态),则 count 会立即清零并重新启动计数过程。
第 21 ~ 28 行:* 为通配符,表示只要 if 或 else 括号中的条件,则立即执行下面的代码。在任何时刻 count 小于 (Scends / 2) - 26'd1 ,led0 被点亮;否则,led1 被点亮。这样,LED 将以 1 秒为周期闪烁,亮起 0.5 秒,熄灭 0.5 秒。
写完 led 交替闪烁代码,是不是觉得 Gowin 的代码框里面的字符调小了,我这就来教各位怎么调字符大小,先点击菜单栏 Tools > Options 进入设置界面如下图所示:
这个界面我们就可以修改字体和字体大小,字体大小默认是 10,我们修改为 14 ,点击 OK 按钮保存设置,如下图所示:
接下来我们回到 led.v 的编辑窗口,此时需要点击工具栏中的保存按钮(左边的是仅保存当前文件,右边的是保存所有文件)或者按下键盘的 Ctrl+S ,来保存编辑后的代码,如下图所示:
保存成功后保存按钮会变灰色, led.v 文件的 * 也会消失。
接下来我们就要验证代码是否正确,我们可以在过程管理窗口 Process -> Synthesize 右击 -> Run 来验证语法是否正确,接下来我们对工程进行语法检查,右击过程管理窗口窗口中的 Synthesize -> Run ,如下图所示:
工程在编译文件过程中没有错误,则 Synthesize 前会有一个 √ ,否则就会在 Messages 栏中显示 errors 的错误。如图所示,包括各种 Warning 和 Error 。 其中 Error 是重点关注对象。如下图所示:
可以看出,我们点亮 LED 的代码并没有产生错误和警告提示。
3、I/O 绑定
接下来就该是分配 FPGA 的 LED 的 I/O 引脚,一共有3种方法,第一种点击菜单栏Tools -> FloorPlanner 如下图所示:
方法二:过程管理窗口 Process -> User Constratints > FloorPlanner > 右击选择 Run 如下图所示:
方法三:工具栏找到可以找到 FloorPlanner 图标,如下图所示:
点击 FloorPlanner 后会转跳到如下图所示界面。如果没有创建 CST 文件,会提示创建,这里选择 OK 按钮:
接下来跳转到 FloorPlanner 选项卡。如下图所示:
在该窗口选择 I/O Constraints ,开始分配 I/O 口,如下图所示:
首先来介绍这个 I/O 分配的选项:
Port 列: 用于描述 port 的名字
Direction 列: 显示 I/O 类型 input、output、inout
Different Pair 列: 差分对
Location 列: 约束的管脚
BANK 列: 该管脚所在的 bank
Exclusive 列: 专属引脚
IO Type 列: 设置电平标准
Drive 列: 设置驱动电压
Pull Mode 列: 设置上拉模式
PCI Clamp 列: 设置 PCI 协议开关
Hysteresis 列: 设置迟滞量
Open Drain 列: 设置开漏电路的开关
Vref 列: 设置外部参考电压
Single Resistor 列: 设置单端电阻的开关
Diff Resistorl 列: 设置差分电阻开关
Bank Vccio 列: 设置 Bank 电压
注:详细请查看官网的Gowin文档(链接:https://cdn.gowinsemi.com.cn/SUG935-1.4.3_Gowin设计物理约束用户指南.pdf)
想了解电平标准的通讯可以去,番外篇找找。
接下来安装下表将引脚对应绑定,如下表所示:
信号 | 方向 | 引脚 | 端口作用 | 电平标准 |
---|---|---|---|---|
sys_clk | input | T7 | 时钟 | LVCMOS33 |
sys_rst_n | input | F10 | 复位 | LVCMOS33 |
led | output | R9 | LED0 | LVCMOS33 |
接下来我们可以根据上面表格进行管脚约束。约束完毕如下图所示:
引脚约束完成后,我们进行保存设置,保持完毕之后我们,回到 Gowin 工程软件窗口,会发现在 Design 子窗口中会生成一个后缀为 .cst 的文件,这就是我们的管脚约束文件。如下图所示:
接下来在过程管理窗口 Process > Place & Route > Run,来对代码布局布线进行综合,如下图所示:
综合完毕之后 ,会在则 Place & Route 前会有一个 √ 如下图所示:
注:细心的朋友会发现这里出现了一个警告,这个警告就是告诉我们,要添加时钟约束文件,这里我们可以忽略。
综合完毕之后会生成的四种报告文件,包括布局布线报告(Place & RouteReport)、 时序分析报告(Timing Analysis Report)、 端口属性报告(Ports & Pins Report) 及功耗分析报告(Power AnalysisReport)。
我们接下来看看我们的LED程序生成的电路图,点击菜单栏 Tools > Schematic Viewer > RTLDesignViewer 如下图所示:
接下来我们就可以看到代码综合后生成的电路图,你们可以自行放大查看,如下图所示:
4、程序下载
在下载程序之前,需要使用开发板和下载器。首先,将下载器的一端连接到电脑,另一端连接到开发板上的接口(8P接口用于FPGA的程序下载,6P接口用于GD32的程序下载)。如果需要将程序下载到FPGA,请确保点亮对应的指示灯。如果不是,请按下下载器上的相应按钮进行切换。如下图所示:
前面布局布线完成后已经生成了码流文件文件,接下来点击工程管理区 Design 中的 右击 Programmer -> 选择 Run,如下图所示:
点击 Run 按钮之后,会弹出下载界面,如下图所示:
点击保存后,进入下载界面,点击下载按钮,如下图所示:
点击下载按钮后报 Cable open failed 错误无法下载成功的话请按照以下方式检查:
1、是否使用我们提供的下载器,若不是查看是否支持高云FPGA的芯片。
2、查看开发板电源指示灯是否亮起,供电是否正常。
3、设备管理器是否,整个识别该设备,若使用我们的提供的下载器,查看是否将下载模式切换至 FPGA 下载端口。
如以上都没有问题,则切换下载端口,点击 USB Cable Setting,如下图所示:
由于下载器默认是端口 0 ,但有部分电脑会识别成端口 1 ,这里我们要将切换至端口 1,如下图所示:
再重新点击保存后,进入下载界面,点击下载按钮,等待下载完成后,就可以看到开发板的 RGB 灯已经在闪烁了。