【FPGA基础】基于 Pango Design Suite(PDS) 的FPGA开发流程

导读:本文旨在通过 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 相对应的管脚VCCIOFPGA 的 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中,这样不用担心掉电后程序丢失了。

    在我们的开发板上有一个 8Pin128MbitFLASH, 用于存储配置程序。我们不能直接把sbit 文件下载到这个 FLASH 中只能下载 sfc 文件到 flash 中。下面为大家介绍 FLASH 程序的固化的流程。

    STEP #1

    首先,需要 sbit 文件转换成能下载的 flash 的 sfc 文件。在完成上节下载和调试后,选择菜单"Operations"下"Convert File"进行文件转换。

    在这里插入图片描述

    然后弹出如下界面,这里要根据硬件的 flash 型号来选择 flash 的厂家和设备型号,开发板用到的是 WINBONDW25Q128QFlash 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 的门外汉了吧!

    声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
    觉得内容不错的朋友,别忘了一键三连哦!
    赞 7
    收藏 7
    关注 431
    成为作者 赚取收益
    全部留言
    0/200
    成为第一个和作者交流的人吧