【ZYNQ学习之FPGA开发】一、点亮PL端LED,熟悉PL端开发流程


一、PL端开发流程简介

在这里插入图片描述

  • 设计输入:使用Verilog进行设计
  • 分析:检查语法错误 ;综合:转换为门级电路网表
  • 约束输入:低速设计主要指IO约束(管脚绑定);高速设计指IO约束和时钟约束
  • 设计实现:布局布线

需要注意的是:上面的<分析与综合>和约束输入是可以调换的!

1.1、创建LED工程

打开位于桌面的vivado 2017.4快捷方式

在这里插入图片描述

选择Create Project创建工程
在这里插入图片描述

当然也可以使用File->New Project创建工程
在这里插入图片描述

出现下图所示界面,直接Next即可

在这里插入图片描述

选择工程名字和位置,注意勾选创建子文件夹。

在这里插入图片描述

然后选择工程类型,选择RTL Project

在这里插入图片描述

这里是引用
当然这里也可以直接勾选“Do not specify sources at this time”,这样就可以省略接下来的两步!

接着设置目标语言Verilog,仿真语言选择Mixed

在这里插入图片描述

接着要设置约束,这里我们直接Next即可在这里插入图片描述

最后选择芯片型号

在这里插入图片描述

设置完毕后,出现设置预览,确认无误后点击Finish即可。

在这里插入图片描述

1.2、创建设计源文件

点击Sources里面的+号,进行源文件的创建
在这里插入图片描述

当然我们也可以在左边点击Add Sources进行源文件的创建
在这里插入图片描述

源文件分为好多种,这里我们要创建的是设计源文件。

在这里插入图片描述

接着点击Create File

在这里插入图片描述

设置文件名称

在这里插入图片描述
然后点击Finsh
在这里插入图片描述

接着弹出模块定义,这里我们将模块名字依旧设置为led
在这里插入图片描述

选择Yes
在这里插入图片描述

接着我们便可以看到我们创建的led设计源文件啦

在这里插入图片描述

在led.v中,添加如下源代码,实现LED灯的一秒反转。

FPGA基础可参考下节,<传送门>

module led(
    input sys_clk,
    input rst_n,
    output reg [3:0] led
    );
reg[31:0] timer_cnt;
always@(posedge sys_clk or negedge rst_n)
begin
    if (!rst_n)
    begin
        led <= 4'd0 ;
        timer_cnt <= 32'd0 ;
    end
    else if(timer_cnt >= 32'd49_999_999)
    begin
        led <= ~led;
        timer_cnt <= 32'd0;
    end
    else
    begin
        led <= led;
        timer_cnt <= timer_cnt + 32'd1;
    end
    
end

endmodule

这里稍微解释以下49_999_999含义,我们PL端的时钟频率是50M即20ns,我们想要定时1s的话,需要计50_000_000个数,但是计数又是从0开始的,所以要减一了。

一点小提示:
1、在编辑led.v源文件时,右上角有语法错误指示,如果语法没有错误,会持续绿灯,如果有语法错误则会显示红灯。
在这里插入图片描述
2、默认编辑器里面的字体较小,如果想要更改,方法如下:
在这里插入图片描述
这里我字体大小改成15(20有点太大了)
在这里插入图片描述

1.3、RTL分析,进行引脚绑定

点击左侧RTL ANALYSIS下的Open Elaborated Design
在这里插入图片描述
接着选择OK
在这里插入图片描述

点开Open Elaborated Design,可看到下面的Schematic(将Verilog翻译成了原理图)
在这里插入图片描述
在这里插入图片描述
接着vivado的下方打印的地方会有I/O ports窗口出现,如下图

在这里插入图片描述

当然,如果没有自动出现的话也不要紧,可以使用如下方法让其出现
方法一:在windows菜单栏下拉列表中选择
在这里插入图片描述
方法二:直接在工具栏搜索框搜索
在这里插入图片描述
方法三:选择vivado右上角的I/O Planning
在这里插入图片描述
方法四:在Layout下拉菜单中选择I/O planning
在这里插入图片描述

接着,我们进行引脚绑定,绑定时可查看原理图进行引脚确定。

以PL端4个LED为例,可通过原理图知道分别对应:M14/M15/K16/J16

在这里插入图片描述
将其填充到,I/O Ports对应的Package Pin一栏(复位和时钟的引脚确定方法同上),填充好之后如下图所示

在这里插入图片描述

上面外设一个个查阅引脚未免过于麻烦,也可以在开发板对应的用户手册中,快速进行引脚查阅!
在这里插入图片描述

除了进行引脚绑定之外,还需要设置引脚电平(根据原理图设置),通过查阅可知4个LED以及复位和时钟均是3.3V,故设置为LVCMOS33即可【其实PL部分的电平均是3.3V的】,如下图所示。

在这里插入图片描述

至此,RTL分析便进行完毕。但是别忘了文件还没有保存呢,保存文件也有两种方法:

方法一:vivado左上角点击保存按钮。
在这里插入图片描述

方法二:直接ctrl+s即可

点击保存按钮或者ctrl+s操作后跳出如下所示窗口,这里我们需要设置保存的约束文件名。

在这里插入图片描述

接着便可以在约束中查看多出了一个led.xdc文件!
在这里插入图片描述

注意:
上面进行了RTL分析和约束,按照流程我们接下来应该综合,然后实现,最后生成比特流文件。
但是,我们也可以直接点击生成比特流,他会自动进行综合和实现,最后再生成比特流。
当然,这个知识点知道就行了,还是要跟着教程继续往下走咯,先通一遍流程!

1.4、synthesis - 综合

点击vivado左侧SYNTHESIS下面的Run Synthesis

在这里插入图片描述
设置综合处理器个数,这里选择4。(选的越多,在综合时电脑会越卡,当然综合的速度也会越快!)
在这里插入图片描述
接着在vivado的右上角可以看到正在运行综合设计。

在这里插入图片描述

综合完成后,会自动弹出如下窗口。

第一个表示运行布局布线,第二个表示打开综合后的设计,第三个表示查看report。
这里选择cancel,因为我们下一步要进行一个时序约束,FPGA很重要的一个环节!

在这里插入图片描述

1.5、时序约束

点开vivado左侧SYNTHESIS下的Open Synthesis Design,然后点击其中的Constraints Wizard。

在这里插入图片描述
弹出如下窗口,直接Next即可。

在这里插入图片描述

接着进入下图所示界面,在这里我们只进行一个时钟约束,在频率一栏填入50(表示50MHz)即可。然后直接点击“Skip to Finish”

在这里插入图片描述

接着弹出summary界面,点击Finish即可

在这里插入图片描述

时序约束完毕后,可以打开led.xdc文件中,并点击重新Reload

在这里插入图片描述
可以看到,会在最下面加入一行时序约束的代码

在这里插入图片描述

1.6、生成比特流文件

点击vivado左侧PROGRAM AND DEBUG下面的Generate Bitstream,生成比特流文件(最后下载到板子的文件)。
在这里插入图片描述
弹出如下窗口,直接选择Yes即可!

在这里插入图片描述

当然也可能会弹出下面所示的窗口,也无所谓,Yes即可!
在这里插入图片描述

同样设置内核数,还是选择4即可。
在这里插入图片描述
可以看到vivado右上角正在运行。
在这里插入图片描述

运行完毕后,弹出如下所示界面。

第一个是打开布局布线设计,第二个是打开报告,第三个是打开硬件管理器(下载程序用),第四个是生成内存配置文件。

这里我们可以先点击cancel!

在这里插入图片描述
接下来我们可以下载比特流文件到FPGA开发板看一下运行效果了,具体操作见下节。

1.7、下载验证PL设计

先连接好开发板的电源和JTAG口,然后点击vivado左侧PROGRAM AND DEBUG下的Open Hardware Manage

在这里插入图片描述

然后在vivado上面可以看到有个Open target的提示信息,点击它然后再点击弹出的 Auto Connect,进行连接!
在这里插入图片描述

连接成功后,会有如下图所示界面,分别对应PS端的ARM、PL端的FPGA、XADC

在这里插入图片描述
右键xc7z020_1然后选择Program Device
在这里插入图片描述
下载比特流文件(默认会填充),然后选择Porgram进行下载
在这里插入图片描述
下载完成后,可观察到板子PL端的4个LED灯在1s为间隔同时闪烁!

二、仿真

2.1、软件仿真

在这里插入图片描述

RTL仿真又称为行为级仿真(又称为功能仿真)【常做这个仿真即可】
时序仿真更由于考虑布局布线,会更接近硬件真实环境
在这里插入图片描述

在vivado左侧,右键SIMULATION,然后选择Simulation Settings

在这里插入图片描述

主要设置xsim.simulation.runtime为50ms

在这里插入图片描述

接着添加仿真源文件(同添加设计源文件方法一样)

在这里插入图片描述

在这里插入图片描述

取名为:vtf_led_test

需要说明的是,一般仿真文件的命名为:tb_xxx,这里仅仅是做实验而已,没有按照规范起名。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

vtf_led_test.v中添加如下代码,主要作用是产生时钟信号和复位信号,因为在实际硬件调试时有板载的时钟信号和复位信号,而仿真没有所以需要我们自己创建一个,改文件又称为激励文件

module vtf_led_test;
// Inputs
reg sys_clk;
reg rst_n ;
// Outputs
wire [3:0] led;

// Instantiate the Unit Under Test (UUT)
led uut (
    .sys_clk(sys_clk),   
    .rst_n(rst_n),
    .led(led)
 );

initial 
begin
// Initialize Inputs
    sys_clk = 0;
    rst_n = 0 ;
    #1000 ;
    rst_n = 1; 
end
//Create clock
always #10 sys_clk = ~ sys_clk;  

endmodule

保存后,可以看到层级关系发生了变化。

在这里插入图片描述

鼠标左键点击vivado左侧的Run Simulation 然后选择第一个:行为级仿真。

在这里插入图片描述
出现下图所示界面,左边对应仿真的模块,右边对应仿真的目标。

在这里插入图片描述

在现有仿真界面中没有计数器变量,我们将计数器变量拖曳到仿真界面中,如下图

在这里插入图片描述
然后点击Restart

在这里插入图片描述

再点击run all

在这里插入图片描述
仿真时,以9ms为步长步进,而我们的LED灯翻转时1s翻转,所以要经过较为漫长的等待

在这里插入图片描述
当到达1s后,点击暂停即可

在这里插入图片描述

注意:
仿真时间越长,led.sim文件夹里面占用的空间也会越来越大!
在这里插入图片描述
可以在vivado关闭后,将led.sim里面较大的那个文件删除
在这里插入图片描述

1s到了以后,左键单击定位到1s的位置

在这里插入图片描述

然后ctrl+滚轮放大,在1s位置可以看到LED值从0变成了F(取反)

在这里插入图片描述
可以看到翻转也不是严格的1s钟的位置,因为前面还有复位的时间。

在这里插入图片描述

计数器的值默认显示的是16进制的,可以右键timer_cnt变量,然后选择Radix,然后将其改为无符号十进制

在这里插入图片描述

进而可以观察到该变量在1s位置从49999999变为了0

上面仿真结束后,可以保存相应的波形,当然也可以不保存,这里直接不保存了。

当我们修改了源文件,想要再仿真的时候,可以重新操作上面的步骤,进行Run Simulation,但是也可以直接点击下图所示按钮。
在这里插入图片描述

2.2、硬件仿真

内嵌逻辑分析仪是FPGA硬件仿真的重要工具,帮助我们观察内部信号的变化,方便调试。下面介绍两种内嵌逻辑分析仪的方法:

方法一、设计ILA核,修改设计源文件,例化ILA核,进行信号与探针的连接。然后重新生成比特流文件,最后下载到开发板。

方法二、设计ILA核,修改列表和原理图,本质也是修改设计源文件,在要仿真的变量前加入(* MARK_DEBUG="true" *)。然后重新进行综合,再生成比特流文件,最后下载到开发板。

方法一和方法二有一个共同点那就是设计ILA核,接下来看看如何添加ILA核。

2.2.1、ILA核添加

点击vivado左侧PROJECT MANAGER下的 IP Catalog

在这里插入图片描述
然后搜索ila,双击“ILA…”
在这里插入图片描述

设置探针(探针可以连接我们的信号,1个探针连接1个信号)

在这里插入图片描述

然后设置探针宽度,这个要根据探针连接的信号确定。

本次要探测的信号有timer_cnt和led,计数器是32位宽,那么对应连接它的探针也应该是32位宽。LED是4位,那么LED对应的探针应该为4位宽。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接着打开层级,第一次打开比较慢

在这里插入图片描述

在这里插入图片描述
打开之后可以看到如下层级关系(注意,ila和led是同一层级的,画的框容易让人误解led在ila下!)
在这里插入图片描述

2.2.2、方法一

【注意,该种方法需要设计ILA核,然后在设计源文件中例化ILA核】

下一步就是要进行例化,复制ila.v中的定义到led.v中,然后修改如下。

ila ila_inst(
    .clk(sys_clk),

    .probe0(timer_cnt),
    .probe1(led)
);

在这里插入图片描述

需要说明的是,一般例化的时候命名为:u_xxx,这里仅仅是做实验而已,没有按照规范起名。

注意clk和probe前面要加点!!!

在这里插入图片描述

而后保存一下,会在Sources中看到Updating,表示正在更新。
在这里插入图片描述
更新完成后,层级关系发生了变化,把ila.v包含到了led.v中
在这里插入图片描述
再次生成比特流文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完成后,注意这次点击Open HardWare Manager,进行下载程序!

在这里插入图片描述
接着点击Program Device

在这里插入图片描述

注意这里较之前多了一个ltx文件,里面描述了逻辑分析仪与哪些信号进行了链接。

在这里插入图片描述

点击Program后,看到生成了hw_ila_1文件,然后也有对应的信号

在这里插入图片描述

2.2.3、方法二

【注意,该种方法需要在要查看的变量前添加(* MARK_DEBUG="true" *),然后重新综合(更新网表),会自动在led.xdc文件中添加内容】

先把之前写的给注释掉
在这里插入图片描述

点击vivado左侧PROJECT MANAGER下的 Language Templates
在这里插入图片描述

搜索mark,选择verilog下的那个
在这里插入图片描述

(* MARK_DEBUG="true" *)

将其添加到要观测的变量前
在这里插入图片描述

然后保存,可以看到,改完之后的层级关系也变了

在这里插入图片描述
接下来需要先做综合

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
等待综合完成,综合完成点击取消

在这里插入图片描述

点击SYNTHESIS下的Set Up Debug
在这里插入图片描述

在这里插入图片描述
可以看到我们添加的变量

在这里插入图片描述

注意,如果如果看不到我们添加的变量,大概率是因为综合之后没有更新,如下图点击更新即可。
在这里插入图片描述

设置数据采样深度
在这里插入图片描述

在这里插入图片描述

完成之后,保存一下设计或者ctrl+s【一定要注意,这一步也很重要!!!】
在这里插入图片描述
在这里插入图片描述
再去约束文件中,点击reload,然后保存。
在这里插入图片描述
在这里插入图片描述
下一步还是生成比特流文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下载调试方法和前面的ila方法一的一样,这里也就直接复制了。

完成后,注意这次点击Open HardWare Manager,进行下载程序!

在这里插入图片描述
接着点击Program Device

在这里插入图片描述

注意这里较之前多了一个ltx文件,里面描述了逻辑分析仪与哪些信号进行了链接。

在这里插入图片描述

点击Program后,看到生成了hw_ila_1文件,然后也有对应的信号

在这里插入图片描述

2.2.4、硬件仿真操作

点击Run进行触发
在这里插入图片描述
在这里插入图片描述

仿真的话看到的不是实际的情况,而通过逻辑分析仪这种方式看到的是实际的运行

在这一栏我们可以设置一些触发条件

在这里插入图片描述
点击+号添加触发
在这里插入图片描述

选择timer_cnt

在这里插入图片描述

触发条件设置为等于49999999时

在这里插入图片描述
然后再点击触发
在这里插入图片描述
可明显看到这次是从f到0的转变
在这里插入图片描述
放大来看
在这里插入图片描述
其中这个红色的T表示在此处进行了触发
在这里插入图片描述
另一个触发的设置,默认设置的是512,即T在0-1023的中间位置。如果我们想更多看后面数据,可以将其设置小一点,比如100.
在这里插入图片描述
设置好之后再次触发
在这里插入图片描述

触发旁边还有一个按钮,表示循环触发,选中它,再点击触发,循环进行触发。【关掉的话再点击一下该按钮即可】
在这里插入图片描述
可以从这边看逻辑分析仪(ila)的运行状态

在这里插入图片描述


最后硬件调试完毕后,可以在led.xdc文件中生成的硬件调试约束给删除就OK!

当然了,再次下载的时候注意清空Debug probes file文件!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ReCclay/article/details/107730907