目录
- 创建工程
- 创建 HDL 代码
- 仿真
- 添加管脚约束
- 添加时序约束
- 生成 bit 文件
- 下载
- 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_cntalways@(posedge sys_clk) beginif(!rst) begintimer_cnt <= 32'b0;endelse if(timer_cnt >= CNT_MAX) begintimer_cnt <= 32'b0;endelse begintimer_cnt <= timer_cnt + 32'd1;endend// 赋值 ledalways@(posedge sys_clk) beginif(!rst) beginled <= 1'b1;endelse if(timer_cnt >= CNT_MAX) beginled <= ~led;endend
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 beginsys_clk_p = 0;forever #2.5 sys_clk_p = ~sys_clk_p; end// 初始化rst信号initial beginrst = 0;#100;rst = 1;end
endmodule
仿真得到的时序波形图:
添加管脚约束
综合是将HDL代码转换为门级网表的过程,实现是将门级网表映射到目标FPGA设备的过程。
- 执行综合 run synthesis
- 等待综合完毕,open synthesized design
- 选择 I/O Planning,根据原理图和手册来定义引脚
- ctrl+s 保存
以 AXU9EG 开发板为例:
名称 | 位置 |
---|---|
led | AM13 |
rst | AN12(对应 PL KEY) |
sys_clk_p | AL8 |
添加时序约束
- constraints wizard
- 设置时钟频率
- 重新综合一遍,因为综合是将RTL代码转换为门级网表,并根据时序和其他约束进行逻辑优化。如果在综合之后添加或修改了时序和管脚约束,综合工具不会自动知道这些约束的变化,所以最好重新 run synthesis
综合后的原理图:
生成 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行第四列