[FPGA2]创建PL工程完整流程

创建PL工程,RTL,约束,综合,实现,在线调试,打包IP

FPGA设计的实现过程

  • 分析综合:
  1. 编译:将原理图、HDL代码、IP软核生成门级网表。
  2. 映射:把编译得到的网表,转换为FPGA中的LUT实现。
  • 布局布线:
  1. 布局:将已连接好的LUT合理地放到特定的FPGA中。
  2. 布线:将现有的模块连接起来,本质上是一个线路分布求最优的问题。

创建Vivado工程

  1. 启动Vivado软件,点击"Quick Start"选项下的"Create Project",创建一个新工程
  2. 点击next,输入工程名与存放目录,注意工程路径不得有空格,点击Next
  3. 工程类型"Project Type"选择"RTL Project",点击Next
  4. 目标语言选择"Verilog",点击Next
  5. 若有原文件,则可在"Add Constraints"界面添加文件,若无,则直接点击Next
  6. 在'Parts'选项中,选择对应的芯片类型,若为官方开发版,则选择'Boards'选项
  7. 最后,能看到工程的详细设置报告,点击Finish则可完成工程的创建

流程导航界面

  • 在左侧的流程导航界面,可以看到常见的操作选项

创建设计源文件

  • 以LED流水灯为例,编写设计源文件
  1. 点击"Project Manage-Add Sources"图标,选择添加或创建设计源文件"Add or create design sources"
  2. 若已经有编写好的verilog文件,则点击"Add Files"直接添加,否则,点击"Creat File"创建新文件
  3. 选择语言类型,并设置文件名"File name",该案例设定文件名为"led.v"
  4. 点击“Finish” ,完成设计源文件的添加
  5. 软件会自动弹出模块定义"Define Module",在该界面可以通过界面选项指定端口信息,当然,也可以直接跳过点击OK,在代码界面中通过代码对端口进行约束
  6. 完成以上操作后,可在左侧的"Sources-Design Sources"下,看到我们刚刚创建的设计文件
  7. 编写"led.v",实现流水灯功能,具体代码如下
module led(sys_clock,rst_n,led);
input sys_clock;
input rst_n;
output reg [3:0] led;
reg [31:0] timer_cnt;
[email protected](posedge sys_clock or negedge rst_n)begin
    if(!rst_n) begin
        led<=4'b0;
        timer_cnt<=32'b0;
    end
    else if (timer_cnt >= 32'd49_999_999)begin
        led <= ~led;
        timer_cnt <=32'b0;
    end
    else begin
        led <= led;
        timer_cnt <= timer_cnt +32'b1;
    end
end
endmodule
  1. 完成代码编写后,进行RTL仿真分析,点击“RTL ANALYSIS -> Open Elaborated Design”,弹出窗口后选择OK,等待一段时间后,可看到RTL分析仿真分析结果

进行管脚约束与综合

  1. 在菜单中选择"Window -> I/O Ports",可以看到管脚分配情况
  2. 根据原理图进行引脚绑定并设定输出电平标准,并点击保存
  3. 弹出窗口,要求保存约束文件,填写文件名,文件类型默认“XDC”
  4. 当然,也可以使用XDC编写语法,自行编写约束文件
管脚约束如下:
  set_property PACKAGE_PIN "引脚编号" [get_ports “端口名称” ]
电平约束如下:
  set_property IOSTANDARD "电平标准" [get_ports “端口名称” ]
  1. 完成以上操作后,可点击"SYNTHESIS -> Run Synthesis"进行综合,在弹出的对话框中可以选择任务数量,这里和 CPU 核心数有关,一般数字越大,生成的速度越快,点击OK,等待一段时间,综合完成。
  2. 在综合时,我们还可以打开设置"Settings - Project Settings - Synthesis",在"Options - Strategy"可以根据项目工程需要选择对应的综合策略。

进行时序约束与实现

  1. 点击"SYNTHESIS -> Open Synthesized Design -> Constraints Wizard"
  2. 在弹出的窗口中点击“Next”
  3. 时序约束向导分析出设计中的时钟,这里把“sys_clk”频率设置为 50Mhz
  4. 点击"Skip to Finish"结束时序约束向导
  5. 这个时候 led.xdc 文件已经更新,点击"Reload"重新加载文件,并保存文件
  6. 完成时序设置后,我们可以进行实现操作。点击"IMPLEMENTATION - Run Implementation"进行实现,在弹出的对话框中可以选择任务数量,这里和 CPU 核心数有关,一般数字越大,生成的速度越快,点击OK,等待一段时间,实现完成。
  7. 在实现时,我们还可以打开设置"Settings - Project Settings - Implementation",在"Options - Strategy"可以根据项目工程需要选择对应的实现策略。
  8. 如果我们是在一个原有已实现过的工程的基础上进行少量的修改,我们希望加快布局布线的运行时间,或原来存有一个布局布线较好的工程,我们希望保留其布局布线以保证时序收敛,此时我们可以采用增量编译。需要注意的是,增量编译要求综合后的设计与原有设计有95%左右的相似之处。点击设置"Settings - Project Settings - Implementation",在"Options - Incremental compile"选项处添加原工程的DCP文件(参考设计检查点),该文件一般位于"xxx.runs - impl_1"文件夹下,xxx为工程名。推荐同时使用增量综合和增量实现,这样能够获得更好的效果。

生成Bit文件

  1. 如果实现没有任何问题,时序报告的资源使用情况与时序情况均符合预期,则我们可以开始进行Bit的生成
  2. 点击"PROGRAM AND DEBUG -> Generate Bitstream"进行代码实现,生成bit文件
  3. 在弹出的对话框中可以选择任务数量,这里和 CPU 核心数有关,一般数字越大,生成的速度越快,点击OK
  4. 如果没有任何错误,完成后,会弹出一个对话框让我们选择后续操作, 可以选择
    "Open Hardware Manger"进行Bit的下载,当然,也可以选择"Cancel"取消

进行仿真分析

  • 可以利用 Vivado 自带的仿真工具来输出波形验证流水灯程序设计结果和我们的预想是否一致。
  1. 设置 Vivado 的仿真配置, 右击 SIMULATION 中 Simulation Settings,在该界面能够设置仿真的各类仿真参数
  2. 点击"Project Manage-Add Sources",在弹出的界面选择"Add or create simulation sources",点击Next
  3. 可以添加已经存在的仿真文件,也可创建新的仿真文件,文件名一般为'tb_文件名"
  4. 弹出IO Ports配置界面,可直接点击OK跳过
  5. 可使用VsCode中的TestBench插件快速生成测试文件模板,也可以自己手动编写,仿真代码如下:
`timescale  1ns / 1ps
module tb_led;
// led Parameters
parameter PERIOD  = 10;
// led Inputs
reg   sys_clock                            = 0 ;
reg   rst_n                                = 0 ;
// led Outputs
wire  [3:0]  led                           ;
initial
begin
    forever #(PERIOD/2)  sys_clock=~sys_clock;
end
initial
begin
    #(PERIOD*2) rst_n  =  1;
end

led  u_led (
    .sys_clock               ( sys_clock        ),
    .rst_n                   ( rst_n            ),

    .led                     ( led        [3:0] )
);
initial
begin
    sys_clock = 0;
    rst_n = 0 ;
    #1000 ;
    rst_n = 1;
    $finish;
end
endmodule
  1. 编写好测试文件后,点击"SIMULATION -> Run Simulation",进行行为级仿真
  2. 仿真完成后,会自动弹出波形界面,可通过波形观察目标信号的变化情况

下载

  1. 使用JTAG连接开发板,并给开发板供电
  2. 点击"PROGRAM AND DEBUG -> Open Hardware Manager -> Auto Connect",连接设备
  3. 或也可以通过菜单的"Window -> Hardware"选项,打开"HARDWARE MANAGER"界面
  4. 在识别到硬件后,右键芯片型号,右键"Program Device..."
  5. 在弹出的窗口点击"Program"
  6. 等待进度条结束,下载完成。

在线调试

使用调试向导进行DeBug设置

  1. 点击"SYNTHESIS -> Open Synthesized Design -> Set Up Debug"
  2. 打开向导后,点击Next下一步
  3. 可选择默认选项"Continue debugging 10 nets connected to existing debug core"在原有DeBug设置的基础上继续添加待观测信号,也可点击"Only debug new nets"重新设置DeBug信号。完成后点击Next下一步。
  4. 在"Additional Debug Nets"界面一般不进行勾选,即对于未被连接的信号不进行选择观测。完成后点击Next下一步
  5. 接着在"Nets to Debug"界面可以看到所有DeBug信号,并可以继续增删用户想要观测的信号。完成后点击Next下一步
  6. 在"ILA Core Options"界面,可设置观测数据的存储深度,即可完成Debug向导的配置。
  7. 完成以上操作后,需再次进行综合实现生成Bit的操作

ILA-逻辑分析IP核

  • Vivado 有内嵌的逻辑分析仪,叫做 ILA,可以用于在线观察内部信号的变化
  1. 点击"IP Catalog",在搜索框中搜索ILA,双击ILA的IP
  2. 在打开ILA这个IP核后,在"General Options"界面,可以修改IP核名,设置待采集信号的数量,以及采样深度,在"Probe_Ports"页面,设置 Probe的宽度,根据待采信号,进行设置
  3. 点击OK,重新综合该IP核,点击"Generate"
  4. 在原设计文件中,元件例化该ILA核,并将采集输入与待观测信号相连,代码如下:
ila ila_inst(      //元件例化
    .clk(sys_clk),
    .probe0(timer_cnt),
    .probe1(led)
);
  1. 点击"Generate Bitstream",重新生成Bit文件
  2. 再次下载程序,这时可以看到有bit和ltx两个文件
  3. 下载完成后,会弹出在线调试窗口,在窗口中可以看到我们观测的信号,运行即可捕获数据

MAKE DEBUG方法

  • 也可以通过在代码中添加综合属性的方式,实现在线调试
  1. 在待观测信号的定义前,添加(*MAKE_DEBUG="true"*),保存文件,代码如下:
module led(sys_clock,rst_n,(*MAKE_DEBUG="true"*)led);
  1. 点击"SYNTHESIS -> Run Synthesis",重新进行综合
  2. 综合结束后,点击"SYNTHESIS -> Set Up Debug"
  3. 同理设定采样深度,点击Finish完成引导,点击保存,在XDC文件中可以看到添加的ILA核约束
  4. 点击"Generate Bitstream",重新生成Bit文件
  5. 后续调试方式与上一方法一致、

打包成IP核

  1. 在完成代码的设计、输入,并在功能仿真或时序仿真完全正确的情况下,可进行IP核的打包
  2. 点击菜单的"Tool -> Creat and Package New IP",打开IP核生成向导,点击Next
  3. 选择"Package your current project",将工程创建为IP核,点击Next
  4. 设定IP核存储的位置,方便后期调用,点击Next
  5. 最后点击Finish结束向导,会自动弹出封装IP的界面
  6. 根据具体需要设定待封装IP的各类参数,最后点击"Package IP",完成IP打包,具体的IP核打包配置,可见Vivado学习笔记5
  7. 最后打开我们设定的IP文件夹,即可看到打包好的IP核