• FPGA上板项目(一)——点灯熟悉完整开发流程、ILA在线调试



    创建工程

    • 型号选择:以 AXU9EG 开发板为例,芯片选择 xczu9eg-ffvb1156-2-i

    创建 HDL 代码

    • 注意:由于输入时钟为 200MHz 的差分时钟,因此需要添加 IBUFDS 原语连接差分信号
    `timescale 1ns / 1ps
    module led
    #(
        parameter CNT_MAX = 'd199_999_999
    )(
        input wire sys_clk_p,
        input wire sys_clk_n,
        input wire rst,        //同步低复位
        
        output reg led
    );
    
        reg [31:0] timer_cnt;
        wire sys_clk;
    
    /**********************************************
    *********** IBUFDS 原语
    **********************************************/    
        IBUFDS IBUFDS_inst(
            .O(sys_clk),
            .I(sys_clk_p),
            .IB(sys_clk_n)
        );
        
    /**********************************************
    *********** 信号赋值
    **********************************************/ 
        // 赋值 timer_cnt
        always@(posedge sys_clk) begin
            if(!rst) begin
                timer_cnt <= 32'b0;
            end
            else if(timer_cnt >= CNT_MAX) begin
                timer_cnt <= 32'b0;
            end
            else begin
                timer_cnt <= timer_cnt + 32'd1;
            end
        end
        
        // 赋值 led
        always@(posedge sys_clk) begin
            if(!rst) begin
                led <= 1'b1;
            end
            else if(timer_cnt >= CNT_MAX) begin
                led <= ~led;
            end
        end
    endmodule
    
    

    仿真

    • 此步骤的目的是进行功能验证,不需要时可以忽略。仿真前需要编写激励文件 testbench
    `timescale 1ns / 1ps
    module tb_led(
    );
        parameter CNT_MAX = 32'd10;
        reg sys_clk_p;
        wire sys_clk_n;
        reg rst;
        
        wire led;
        
        led #(
            .CNT_MAX(CNT_MAX)
        )tb_led(
            .sys_clk_p(sys_clk_p),
            .sys_clk_n(sys_clk_n),
            .rst(rst),
            .led(led) 
        );  
        
        // 初始化clk信号
        assign sys_clk_n = ~sys_clk_p;
        initial begin
            sys_clk_p = 0;
            forever #2.5 sys_clk_p = ~sys_clk_p;   
        end
        
        // 初始化rst信号
        initial begin
            rst = 0;
            #100;
            rst = 1;
        end
    endmodule
    
    

    仿真得到的时序波形图:

    在这里插入图片描述

    添加管脚约束

    综合是将HDL代码转换为门级网表的过程,实现是将门级网表映射到目标FPGA设备的过程。

    • 执行综合 run synthesis
    • 等待综合完毕,open synthesized design
    • 选择 I/O Planning,根据原理图和手册来定义引脚
    • ctrl+s 保存

    以 AXU9EG 开发板为例:

    名称位置
    ledAM13
    rstAN12(对应 PL KEY)
    sys_clk_pAL8

    在这里插入图片描述

    添加时序约束

    • constraints wizard
    • 设置时钟频率
    • 重新综合一遍,因为综合是将RTL代码转换为门级网表,并根据时序和其他约束进行逻辑优化。如果在综合之后添加或修改了时序和管脚约束,综合工具不会自动知道这些约束的变化,所以最好重新 run synthesis
    • 针对此部分,拓展可参考 FPGA时钟约束设计

    综合后的原理图:
    在这里插入图片描述

    生成 bit 文件

    • generate bitstream

    下载

    • 拨码开关调整到 JTAG 模式,连接 JTAG 接口后,上电

    • open hardware manager -> open target -> auto connect 后,成功扫描到硬件

    在这里插入图片描述

    • 选择芯片,右键 program device

    在这里插入图片描述

    • 点击 program 等待下载完成

    ILA 在线调试

    • IP Catalog -> 搜索 ILA
    • Number of Probes:需要采样的信号数量
    • Sample Data Depth:采样深度
    • Probe Width:信号的位宽
    • 在 HDL 代码中例化 ILA
    /**********************************************
    *********** ILA 例化
    **********************************************/ 
        ila_0 inst_ila (
            .clk(sys_clk), // input wire clk
            .probe0(timer_cnt) // input wire [31:0] probe0
        );
    
    • 重新生成比特流,并连接
      在这里插入图片描述

    • 选择 ILA 窗口
      在这里插入图片描述

    • 点击运行即可看到采集信号的波形,采集的个数为设置的采样深度

    • 可以添加采样触发条件
      在这里插入图片描述
      最终调试窗口结果
      在这里插入图片描述

    • 导出 csv 文件:

      • 右键后 export IDA data,导出 csv 格式的文件
      • MATLAB 读取代码:
    clc;
    clear;
    close all;
    
    data_depth = 131072;   % 采集的数据个数
    
    %% 读取csv文件
    csv_file_name = 'iladata.csv';
    out_data = csvread(csv_file_name, 2, 3, [2,3,2 + data_depth - 1,3]);  % 从csv文件的第三行第四列开始读取读取到end行第四列
    
    
  • 相关阅读:
    LeetCode验证二叉搜索树
    LED红外照明器市场现状及未来发展趋势分析
    Vue.js循环语句
    decltype 类型指示符
    pytorch 实战【以图像处理为例】
    请问什么是 CICD
    数据库基础 培训讲义
    八大排序之插入排序
    [AI] LRTA*ls(k)搜索算法
    六、K8S之StatefulSet
  • 原文地址:https://blog.csdn.net/weixin_45926435/article/details/140035427