PL端:LED闪烁

实验环境

vivado2024.1

实验任务

LED闪烁

引脚关系

硬件配置

新建一个vivado实验







创建 Verilog HDL 文件点亮 LED

点击 Project Manager 下的 Add Sources 图标(或者使用快捷键 Alt+A)



编辑led.v

bash 复制代码
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。


编写激励文件

bash 复制代码
`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 中的仿真软件开始工作了,需要耐心等待,才能看到实验变化

下载验证

  1. 连接好开发板的 JTAG 接口,给开发板上电
  2. 在"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,并保存

bash 复制代码
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





调试

此时弹出在线调试窗口,出现了我们添加的信号

点击运行按钮,出现信号的数据

相关推荐
9527华安1 小时前
FPGA视频GTH 8b/10b编解码转PCIE3.0传输,基于XDMA中断架构,提供工程源码和技术支持
fpga开发·音视频·pcie·gth·xdma·pcie3.0
爱奔跑的虎子2 小时前
FPGA实现以太网(一)、以太网基础知识
fpga开发·以太网·fpga·vivado
北京太速科技股份有限公司3 小时前
太速科技-634-基于3U PXIe的VU3P FMC+数据接口板
fpga开发
爱奔跑的虎子17 小时前
详解CRC校验原理以及FPGA实现
fpga开发·vivado·xilinx·数字逻辑通信
沐欣工作室_lvyiyi17 小时前
基于单片机的智能婴儿监控系统设计(论文+源码)
stm32·单片机·嵌入式硬件·fpga开发·单片机毕业设计·物联网毕业设计·电气毕业设计
aa_lh20 小时前
fpga引脚约束问题
fpga开发
aa_lh21 小时前
fpga生成pwm简单案例
fpga开发
赵闪闪16821 小时前
基于FPGA的可控分频器设计与应用
fpga开发
卡尔-TONY1 天前
嵌入式常用功能之通讯协议1--IIC
fpga开发