实验环境
vivado2024.1
实验任务
LED闪烁
引脚关系
硬件配置
新建一个vivado实验
创建 Verilog HDL 文件点亮 LED
点击 Project Manager 下的 Add Sources 图标(或者使用快捷键 Alt+A)
编辑led.v
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
这是一个对系统时钟上升沿和复位信号下降沿敏感的always块。
当复位信号rst_n为低电平时:
将输出led初始化为 4’b0000。
将计数器timer_cnt初始化为 32’b0。
当计数器timer_cnt的值大于等于 32’d49_999_999 时:
对输出led取反,实现 LED 状态的切换。
将计数器timer_cnt重新初始化为 32’b0。
其他情况下:
保持输出led不变。
计数器timer_cnt自增 1。
总体来说,这个模块实现了一个基于计数器的 LED 闪烁功能。每当计数器达到特定值(49999999)时,LED 的状态就会切换一次。复位时,LED 熄灭且计数器清零。
添加管脚约束
Vivado 使用的约束文件格式为 xdc 文件。xdc 文件里主要是完成管脚的约束,时钟的约束, 以及组的约束。
点击“Open Elaborated Design”
将复位信号 rst_n 绑定到 PL 端的按键,给 LED 和时钟分配管脚、电平标准,完成后点击保存图标
ctrl+S 保存
普通 IO 口只需约束引脚号和电压,管脚约束如下:
set_property PACKAGE_PIN “引脚编号” [get_ports “端口名称”]
电平信号的约束如下:
set_property IOSTANDARD “电平标准” [get_ports “端口名称”]
电平标准中“LVCMOS33”后面的数字指 FPGA 的 BANK 电压,LED 所在 BANK 电压为 3.3伏,所以电平标准为“LVCMOS33”
添加时序约束
点击“Run Synthesis”开始综合
点击“Constraints Wizard”,在弹出的窗口中点击“Next”
时序约束向导分析出设计中的时钟,这里把“sys_clk”频率设置为 50Mhz,然后点击“Skip to Finish”结束时序约束向导
这个时候 led.xdc 文件已经更新,点击“Reload”重新加载文件,并保存文件
生成 BIT 文件
编译的过程可以细分为综合、布局布线、生成 bit 文件等,直接点击“Generate Bitstream”,直接生成 bit 文件
Vivado 仿真
设置 Vivado 的仿真配置,右击 SIMULATION 中 Simulation Settings。
添加激励测试文件,点击 Project Manager 下的 Add Sources 图标,按下图设置后单击 Next。
编写激励文件
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/11/05 18:16:41
// Design Name:
// Module Name: tb_led
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module tb_led;
// 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
ctrl+s保存文件
点击 Run Simulation 按钮,再选择 Run Behavioral Simulation
Vivado 中的仿真软件开始工作了,需要耐心等待,才能看到实验变化
下载验证
- 连接好开发板的 JTAG 接口,给开发板上电
- 在“HARDWARE MANAGER”界面点击“Auto Connect”,自动连接设备
在线调试
Vivado 中的 Integrated Logic Analyzer(ILA)是强大的调试工具。主要功能包括信号监测与分析,可同时监测多个信号并设置触发条件以特定信号状态捕获数据;触发条件设置灵活,基于单个信号值、组合逻辑或特定序列等;数据存储深度可配置,便于平衡资源利用与调试效果;与 Vivado 设计流程完全集成,使用方便且捕获数据可直接分析查看。使用步骤为添加 ILA IP 核并配置参数,连接需监测信号,设置触发条件,生成比特流下载到 FPGA 后开始工作,最后在 Vivado 中分析数据。其优势明显,高效调试,无需额外硬件设备,降低成本和复杂性,快速定位问题缩短设计周期;灵活性强,适应复杂场景,多种触发和显示方式满足不同需求;集成性好,紧密融入设计流程,提高工作效率。
添加 ILA IP 核
修改名称为 ila,由于要采样两个信号,Probes 的数量设置为 2,Sample Data Depth 指的是
采样深度,设置的越高,采集的信号越多,同样消耗的资源也会越多
在 Probe_Ports 页面,设置 Probe 的宽度,设置 PROBE0 位宽为 32,用于采样 timer_cnt,设置 PROBE1 位宽为 4,用于采样 led。点击 OK
在 led.v 中例化 ila,并保存
ila ila_inst(
.clk(sys_clk),
.probe0(timer_cnt),
.probe1 (led)
);
重新生成 Bitstream
下载程序
这时候看到有 bit 和 ltx 文件,点击 program
此时弹出在线调试窗口,出现了我们添加的信号
点击运行按钮,出现信号的数据
也可以触发采集,在 Trigger Setup 窗口点击“+”,深度选择 timer_cnt 信号
将 Radix 改为 U,也就是十进制,在 Value 中设置为 49999999,也就是 timer_cnt 计数的最大值
添加MARK DEBUG
在 Vivado 等 FPGA 开发环境中,“MARK DEBUG” 是一个非常重要的功能。
基本含义
“MARK DEBUG” 的主要目的是标记那些需要在调试过程中重点关注的信号、网线(nets)或模块等设计元素。当你在设计中使用这个功能标记了特定的对象后,开发工具就会知道这些是需要特殊处理用于调试的部分。
与调试工具的关联
它和调试工具(如 ILA)紧密相关。例如,在 Vivado 中,当你使用 “MARK DEBUG” 标记了信号后,这些被标记的信号可以很方便地被连接到诸如 Integrated Logic Analyzer(ILA)这样的调试核上。这样一来,在调试阶段,你就能够通过 ILA 等工具捕获和观察这些标记信号的行为,有助于对设计中的问题进行定位和分析。
使用方式和好处
从使用方式上,一般是在设计的图形化界面或者代码编辑环境中,通过特定的操作(如右键菜单选项等)来对信号等进行 “MARK DEBUG” 标记。其好处在于,它提供了一种有针对性的调试手段。在复杂的 FPGA 设计中,可能有成千上万的信号,通过 “MARK DEBUG” 可以挑选出那些与当前调试任务最相关的信号,避免在无关信号的观察和分析上浪费时间,从而更高效地进行设计调试。
上面介绍了添加 ILA IP 的方式在线调试,下面介绍在代码中添加综合属性,实现在线调试。
首先打开 led.v,将 ila 的例化部分注释掉
在 led 和 timer_cnt 的定义前面添加(* MARK_DEBUG=”true” *),保存文件。
点击综合
综合结束后,点击 Set Up Debug
弹出的窗口点击 Next
按照默认点击 Next
采样深度窗口,选择 Next
点击 Finish
ctrl+s保存
重新生成 bitstream
调试
此时弹出在线调试窗口,出现了我们添加的信号
点击运行按钮,出现信号的数据