❝「导读」:本文旨在通过 LED 的 Demo,实现快速上手基于PGL22G的FPGA开发。
❞
@
一、创建工程
「STEP #1」
启动 Pango Design Suite 2020.3 开发环境(在开始菜单中选择 pango->Pango DesignSuite 2020.3>Pango Design Suite 。Pango Design Suite(简称 PDS)或者双击桌面的Pango Design Suite 2020.3 的图标直接打开软件。
在这里插入图片描述
「STEP #2」
在 PDS 开发环境里双击 Create Project 或 File->New Project...这两种方式都可,如下图:
在这里插入图片描述
「STEP #3」
弹出一个 PDS 的工程向导,点击 Next 按钮。
在这里插入图片描述
「STEP #4」
在弹出的对话框中输入工程名和工程存放的目录,这里取一个 led_test 的工程名,点击 Next;
在这里插入图片描述
「STEP #5」
在下面的对话框中默认选择 RTL Project, 因为我们这里使用 verilog 行为描述语言来编程,单击 Next
在这里插入图片描述
「STEP #6」
进入 Add Design Source Files 界面,这里先不添加任何设计文件。点击 Next;
在这里插入图片描述
「STEP #7」
这里问是否添加已有的 IP,保持默认不添加,单击 Next;
在这里插入图片描述
「STEP #8」
提示是否添加已有的约束文件,这里约束文件我们也没有设计好,也不添加。
在这里插入图片描述
「STEP #9」
在接下来的对话框选择所用的 FPGA 器件,以及进行一些配置。开发板首先在 Family 栏里选择 Logos
,Device 中选择 PGL22G
,在 Package 栏选择 BG324
, Speed grade 栏选择-6
;综合工具选择 ADS
;单击 NEXT 进入下一界面:
在这里插入图片描述
「STEP #10」
再次确认一下板子型号有没有选对, 没有问题再点击“Finish”完成工程创建。
在这里插入图片描述
「STEP #11」
工程创建后如下图所示:
二、编写流水灯的 verilog 代码
「STEP #1」
双击 Sources 下的 Designs 图标;
「STEP #2」
在 Add Design Source Files 界面中进行如下设置,点击 OK;
「STEP #3」
可以看到已经新建的 led_test.v 文件,点击 OK 按钮。
在这里插入图片描述
向导会提示您定义 I/O 的端口,这里我们可以不定义,后面「自己在程序中编写」就可以,单击 OK 完成
这时在 Navigator 界面下的 Designs 里已经有了一个 led_test.v 文件, 并且自动成为项目的「顶层」(Top)模块了。
「STEP #4」
接下去我们来编写 led_test.v
的程序,这里我们定义了一个 32 位的寄存器 timer
,用于循环计数 0~199_999_999(4 秒钟)。
- 当计数到 49_999_999(1 秒)的时候,熄灭第一个 LED 灯;
- 当计数到 99_999_999(2 秒)的时候,熄灭第二个 LED 灯;
- 当计数到 149_999_999(3 秒)的时候,熄灭第三个 LED 灯;
- 当计数到 199_999_999(4 秒)的时候,熄灭第四个 LED 灯,计数器再重新计数。
`timescale 1ns/1nsmodule led_test( sys_clk, // system clock 50Mhz on board rst_n, // reset ,low active led // LED,use for control the LED signal on board); input sys_clk;input rst_n;output [3:0] led;//define the time counterreg [31:0] timer; reg [3:0] led;always @(posedge sys_clk or negedge rst_n) begin if (~rst_n) timer <= 32'd0; // when the reset signal valid,time counter clearing else if (timer == 32'd199_999_999) //4 seconds count(50M*4-1=199999999) timer <= 32'd0; //count done,clearing the time counter else timer <= timer + 1'b1; //timer counter = timer counter + 1endalways @(posedge sys_clk or negedge rst_n) begin if (~rst_n) led <= 4'b0000; //when the reset signal active else if (timer == 32'd49_999_999) //time counter count to 1st sec,LED1 Extinguish led <= 4'b0001; else if (timer == 32'd99_999_999) begin //time counter count to 2nd sec,LED2 Extinguish led <= 4'b0010; end else if (timer == 32'd149_999_999) //time counter count to 3nd sec,LED3 Extinguish led <= 4'b0100; else if (timer == 32'd199_999_999) //time counter count to 4nd sec,LED4 Extinguish led <= 4'b1000; end endmodule
顶层模块编写几个注意事项:
- ①、在定义寄存器时,如果「寄存器在 always 块里使用必须定义为 reg 类型」;
- ②、如果「仅是用于连线或是直接赋值需定义为 wire 类型」;
- ③、wire 类型只能在 assign 中「连续赋值」,即:assign 语句中的赋值目标变量(位于左侧),「必须是 wire 型的」。
- ③、「输入信号的类型不能定义为 reg 型」
三、添加 UCE 约束
❝PDS开发中的约束文件默认是
❞.fdc
格式
User Constraint Editor
(Timing and Logic
)简称 UCE,主要是完成「管脚的约束,时钟的约束,以及组的约束」。这里我们需要对 led_test.v
程序中的「输入输出端口分配到 FPGA 的真实管脚」上。
「STEP #1」
点击菜单栏“Tools”下的"User Constraint Editor";
在这里插入图片描述
「STEP #2」
在弹出的界面中单击 Device;
在这里插入图片描述
「STEP #3」
在 Device 中单击 I/O,可看到工程中用到的 IO 端口;
「STEP #4」
按如下方式分配管脚,LOC
就是「与硬件中 FPGA 相对应的管脚」,VCCIO
是 「FPGA 的 IO 的电压标准」,与硬件对应,其它在这里保持默认即可;
在这里插入图片描述
「STEP #5」
单击保存后会弹对话框,在这里选择默认;
在这里插入图片描述
四、 生成位流文件
「双击」 Generate Bitstream
,然后软件会按照 Synthesize-> Device Map-> Place & Route-> Generate Bitstream
来产生位流文件。
在这里插入图片描述
如果工程在生成位流文件过程中没有错误,则会出现下图中每一步都正确的“√
”,否则就会在 Messages 栏中显示 errors 的错误。
在这里插入图片描述
位流文件生成完成后,我们可以在 Report Summary
页面的到了 FPGA
「资源」的使用情况。
在这里插入图片描述
此外还可以通过下图操作查看 RTL
视图;
在这里插入图片描述
在这里插入图片描述
五、下载和调试
❝直接下载到FPGA的程序文件格式为:
❞.sbit
,该种方式掉电「会丢失」! 间接下载到FLASH的程序文件格式为:.sfc
,该种方式掉电「不会丢失」!
在上面生成了位流文件(.sbit
)后,我们可以把 sbit 文件下载到 FPGA 芯片中,看一下 LED实际运行的效果。下载和调试之前先连接硬件,把 JTAG 下载器和开发板连接,然后开发板上电(下图为开发板的硬件连接图)。
在这里插入图片描述
「STEP #1」
单击界面中的“Configuration
”按钮,作用一是下载程序到 FPGA
中运行;二是固化程序到 flash
中。
在这里插入图片描述
「STEP #2」
在弹出的界面中的「单击」“Boundary Scan
”,然后「在右侧空白区单击右键选择」“Scan Device
”;
在这里插入图片描述
「STEP #3」
在扫描到 JTAG 设备后会弹出如下对话框,并按如下加载.sbit
文件即可;
「STEP #4」
然后可以看到「左侧显示了要加载的文件」,「选中右侧绿色的方块」,「右击会弹出下拉菜单」并选择"Program...
",下载完成后在板上可以在开发板上看到 LED 流水灯的效果。注意:「这种方式程序是在 FPGA 运行,掉电后会消失」。
在这里插入图片描述
六、FLASH 程序固化
可能已经有朋友发现下载.sbit 文件到 FPGA 后,开发板重新上电后配置程序已经丢失,还需要 JTAG 下载。这岂不麻烦!好吧,这一节我们来介绍「如何把配置程序固化到开发板上的 FLASH中」,这样不用担心掉电后程序丢失了。
在我们的开发板上有一个 8Pin
的 128Mbit
的 FLASH
, 用于存储配置程序
。我们「不能直接把sbit
文件下载到这个 FLASH 中」,「只能下载 sfc
文件到 flash 中」。下面为大家介绍 FLASH 程序的固化的流程。
「STEP #1」
首先,需要 sbit
文件转换成能下载的 flash 的 sfc
文件。在完成上节下载和调试后,「选择菜单」"Operations
"下"Convert File
"进行文件转换。
在这里插入图片描述
然后弹出如下界面,这里要根据硬件的 flash
型号来选择 flash
的厂家和设备型号,开发板用到的是 WINBOND
的 W25Q128Q
。Flash Read Mode
选择 SPI X4
然后选择要转换的 sbit
文件,点击 OK 即可转换;
在这里插入图片描述
转换完成后显示如下界面,单击 OK;
在这里插入图片描述
「STEP #2」
选中右侧绿色的方块,右击会弹出下拉菜单并选择"Scan outer Flash
"。
选择已生成的 sfc
文件,单击 Open;
在这里插入图片描述
可以看到界面中有了 flash
器件,选中“Outer Flash
”绿色方块并「右击选择菜单」中“Program...
”
弹出正在编程的进度界面,flash 编程完成后进度界面自动消失。
至此,SPI FLASH 烧写完毕,led_test 程序已经固化到 SPI FLASH 中了。我们来验证一下,关电重新启动开发板,等待一会儿你就可以看到开发板上的 LED 灯已经在做跑马运动了。
七、仿真验证
接下来我们不妨小试牛刀,让仿真工具 modelsim
来输出波形验证流水灯程序设计结果和我们的预想是否一致。具体步骤如下:
「STEP #1」 添加激励测试文件,点击 Project 下的 Add Source;
在这里插入图片描述
「STEP #2」
点击 Add or create simulation sources 并"Next";
在这里插入图片描述
「STEP #3」
在弹出的对话框中输入激励文件的名字,这里我们输入名为 vtf_led_test,其它按下图设置;
「STEP #4」
点击 OK 按钮返回。
「STEP #5」
这里我们先不添加 IO Ports,点击 OK。
在这里插入图片描述
「STEP #6」
在 Simulation 目录下多了一个刚才添加的 vtf_led_test 文件。双击打开这个文件,可以看到里面只有 module 名的定义,其它都没有。
在这里插入图片描述
「STEP #7」
接下去我们需要编写这个 vtf_led_test.v 文件的内容。首先定义输入和输出信号,然后需要实例化 led_test 模块,让 led_test 程序作为本测试程序的一部分。再添加复位和时钟的激励。完成后的 vtf_led_test.v 文件如下:
`timescale 1ns / 1ns//////////////////////////////////////////////////////////////////////////////////// Module Name: vtf_led_test//////////////////////////////////////////////////////////////////////////////////module vtf_led_test;// Inputsreg sys_clk;reg rst_n;// Outputswire [3:0] led;// Instantiate the Unit Under Test (UUT)led_test uut ( .sys_clk(sys_clk), .rst_n(rst_n), .led(led));initial begin // Initialize Inputs sys_clk = 0; rst_n = 0; // Wait 100 ns for global reset to finish #1000; rst_n = 1; // Add stimulus here #20000; // $stop; endalways #10 sys_clk = ~ sys_clk; //20ns endmodule
仿真模块编写流程:
- ①、首先定义输入和输出信号;
- ②、然后实例化模块;
- ③、最后添加复位和时钟的激励。
仿真模块编写几个注意事项:
- ①、模块中的
input
信号在仿真代码中定义为reg
类型; - ②、模块中的
output
信号在仿真代码中定义为wire
类型!
「STEP #8」
编写好后保存,vtf_led_test.v
「自动成了这个仿真的顶层」了,它下面是设计文件 led_test.v
;
在这里插入图片描述
「STEP #9」
接下来设置 PDS 的仿真配置,在软件菜单 Project->Project Setting
,然后在弹出的界面中进行如下设置,注意仿真库的路径在《00.Pango Design Suite 2020.3 安装》教程中已介绍。设置好后单击 OK。
在这里插入图片描述
「STEP #10」
右击仿真文件并在下拉菜单中选择 Run Behavioral Simulation
。这里我们做一下「行为级的仿真」就可以了。
如果没有错误,PDS 会调用 Modelsim 仿真软件开始工作了
「STEP #11」
在弹出仿真界面后如下图,界面是仿真软件自动运行到仿真设置的 50ms
的波形。
由于 LED[3:0]在程序中设计的状态变化时间长,而仿真又比较耗时,在这里观测 timer[31:0]计数器变化。把它放到 Wave 中观察(「点击界面中的 uut, 再右击右侧 timer, 在弹出的下拉菜单里选择 Add Wave」)。
在这里插入图片描述
添加后 timer 显示在 Wave 的波形界面上,如下图所示。
点击 Restart 按钮复位一下,再点击 Run All 按钮。(需要耐心!!!),可以看到仿真波形与设计相符。
在这里插入图片描述
我们可以看到 led 的信号会逐一变 1,说明 LED1~LED4 灯逐个熄灭。
❝补充:「仿真自带例程」几点注意:
❞
- ①、路径名称「不能含有中文或空格」
- ②、「需要重新编译仿真库」,具体操作如下:
- 打开
Tools -> Compile Simulation Libraries
,分别:
- 设置 Compiled Library Location 为:
D:/modeltech64_10.1c/pango_sim_libraries
;- 设置 Simulator Executable Path 为:
D:/modeltech64_10.1c/win64
,然后点击Compile(大概需要2min)
这里为止,我们的第一个项目就圆满完成了,相信您也掌握了 PDS 的 FPGA 开发的整个流程,再也不是那个 FPGA 的门外汉了吧!