Vivado - BD(差分时钟、简单分频、RESET、KEY)
目录
1. 简介
1.1 要点
1.2 buffer 介绍
2. vivado 工程
2.1 Block Design
2.2 IBUFDS
2.3 BUFGCE_DIV
2.4 Processor System Reset
2.5 key_mod
2.6 led_drv
3. 编译与调试
3.1 XDC
3.2 Debug
4. 总结
1. 简介
1.1 要点
- 了解 Utility Buffer v2.2 中的 Buffer,重点分析 IBUFDS 和 BUFGCE_DIV
- 分析 Processor System Reset v5.0
- 分析按键消抖模块(key_mod)
- 了解与 ILA 相关自动生成的约束
1.2 buffer 介绍
- IBUFDS:差分输入缓冲器,用于接收差分信号并将其转换为单端信号。
- OBUFDS:差分输出缓冲器,用于将单端信号转换为差分信号输出。
- IOBUFDS:差分输入/输出缓冲器,支持双向差分信号。
- IBUFDSGTE:专用于 GTP/GTX 收发器的差分输入缓冲器。
- BUFG:全局时钟缓冲器,用于将时钟信号分配到 FPGA 的全局时钟树中,减少时钟偏斜。
- BUFGCE:带有时钟使能(Clock Enable)的全局时钟缓冲器,可以控制时钟信号的启用和禁用。
- BUFGCE_DIV:带有时钟使能和分频功能的全局时钟缓冲器,可以对时钟信号进行分频。
- BUFG_GT:专用于 GT 收发器的全局时钟缓冲器。
- IOBUF:输入/输出缓冲器,支持双向信号。
- OBUFDS_GTE:专用于 GTP/GTX 收发器的差分输出缓冲器。
- OBUFDS_GTE_ADV:高级差分输出缓冲器,提供更高性能的差分信号输出。
- BUFG_PS:专用于处理器系统的全局时钟缓冲器。
2. vivado 工程
2.1 Block Design
2.2 IBUFDS
差分输入缓冲器,用于接收差分信号并将其转换为单端信号。
在 Language Templates 中,可以找到 verilog 例化模板。
IBUFDS #(
.DIFF_TERM("FALSE"), // 差分端接
.IBUF_LOW_PWR("TRUE"), // 低功耗="TRUE",最高性能="FALSE"
.IOSTANDARD("DEFAULT") // 指定输入 I/O 标准
) IBUFDS_inst (
.O(O), // 缓冲器输出
.I(I), // Diff_p 缓冲器输入(直接连接到顶层端口)
.IB(IB) // Diff_n 缓冲器输入(直接连接到顶层端口)
);
2.3 BUFGCE_DIV
- BUFGCE_DIV:能够进行简单分频的 BUFG,可进行1~8 分频
- BUFG:全局时钟缓冲器,可以走专门的时钟资源,增强驱动能力,减少传播延迟
- Fout = Fin / div,div = 1 to 8;
在 Language Templates 中,也可以找到 verilog 例化模板。
BUFGCE_DIV #(
.BUFGCE_DIVIDE(1), // 1-8
// 可编程反相属性:指定特定引脚上内置的可编程反相
.IS_CE_INVERTED(1'b0), // CE 的可选反相
.IS_CLR_INVERTED(1'b0), // CLR 的可选反相
.IS_I_INVERTED(1'b0), // I 的可选反相
.SIM_DEVICE("ULTRASCALE_PLUS") // ULTRASCALE, ULTRASCALE_PLUS
)
BUFGCE_DIV_inst (
.O(O), // 1位输出:缓冲器
.CE(CE), // 1位输入:缓冲器使能
.CLR(CLR), // 1位输入:异步清除
.I(I) // 1位输入:缓冲器
);
2.4 Processor System Reset
IP 用途
- 同步异步复位信号:将异步外部复位(External Reset)和辅助复位(Auxiliary Reset)信号与时钟同步。
- 配置复位信号:可以选择外部和辅助复位信号是低电平有效还是高电平有效,并设置复位信号的最小脉宽。
- DCM 锁定输入:支持 DCM(数字时钟管理器)的锁定输入信号。
- 生成上电复位信号:在系统上电时生成复位信号,确保系统在上电时处于已知状态。
外部/辅助复位有效宽度:复位信号有效电平需要持续指定的若干时钟周期才被视为有效信号,才会有复位输出。
复位信号的顺序输出:
- 总线结构复位解除(互连和桥接)
- 外设在 16 个时钟周期后复位解除(UART、SPI、IIC)
- MicroBlaze 处理器在外设后 16 个时钟周期复位解除
Auxiliary Reset(辅助复位)信号通常用于提供额外的复位控制,除了主复位信号之外。它可以连接到系统中的其他复位源,例如调试器或其他控制逻辑。具体连接位置取决于你的设计需求和系统架构。
2.5 key_mod
按键消抖模块,用于消除由于机械或者接触不良造成的按键电信号的跳动(抖动)。
module key_mod (input wire i_sys_clk ,input wire i_rst_n ,input wire i_button ,output reg o_pb_state ,output wire o_pb_negedge ,output wire o_pb_posedge
);---------------- internal parameter ---------------
parameter N = 32 ; // debounce timer bitwidth
parameter FREQ = 200 ; // model clock :Mhz
parameter MAX_TIME = 20 ; // ms---------------- internal localparam --------------
localparam TIMER_MAX_VAL = MAX_TIME * 1000 * FREQ; // 20ms//====================================================
// 按键下降沿检测:
//-- _ _ _ _ _ _ _ _ _
//-- CLK | |_| |_| |_| |_| |_| |_| |_| |_| |
//-- ____
//-- button_r[1] |______________________________
//-- ____ __________
//-- PB_idle |___________________|
//-- ___________________
//-- add_PB_cnt ____| |__________
//-- ___ ___ ___ ___
//-- PB_cnt ________/___X___X___X___\__________
//-- ___
//-- end_PB_cnt ____________________| |__________
//-- ________________________
//-- PB_state |__________
//-- ___
//-- PB_negedge ____________________| |__________
//====================================================//====================================================
// 按键上升沿检测:
//-- _ _ _ _ _ _ _ _ _
//-- CLK | |_| |_| |_| |_| |_| |_| |_| |_| |
//-- ______________________________
//-- button_r[1] ____|
//-- ____ __________
//-- PB_idle |___________________|
//-- ___________________
//-- add_PB_cnt ____| |__________
//-- ___ ___ ___ ___
//-- PB_cnt ________/___X___X___X___\__________
//-- ___
//-- end_PB_cnt ____________________| |__________
//-- __________
//-- PB_state ________________________|
//-- ___
//-- PB_posedge ____________________| |__________
//====================================================//====================================================
// 消除亚稳态
//
//====================================================
reg [1:0] button_r;
always @(posedge i_sys_clk or negedge i_rst_n) beginif (!i_rst_n) beginbutton_r <= 2'b11;endelse beginbutton_r <= {button_r[0], i_button};end
end//====================================================
// 定义空闲状态 PB_idle,可以一直是高电平,
// 也可以一直是低电平
// 按键按下和松开,均开始计时
//====================================================
reg [N-1:0] PB_cnt;
wire PB_idle = (o_pb_state==button_r[1]);
wire add_PB_cnt;
wire end_PB_cnt;always @(posedge i_sys_clk or negedge i_rst_n) beginif (!i_rst_n) beginPB_cnt <= 16'b0;endelse if (add_PB_cnt) beginif (end_PB_cnt)PB_cnt <= 16'd0;elsePB_cnt <= PB_cnt + 16'd1;end
endassign add_PB_cnt = ~PB_idle;
assign end_PB_cnt = add_PB_cnt && PB_cnt==TIMER_MAX_VAL-1;always @(posedge i_sys_clk or negedge i_rst_n) beginif (!i_rst_n) begino_pb_state <= 1'b1;endelse if (end_PB_cnt) begin //到达设定数值,认为按键稳定,改变PB_state状态o_pb_state <= ~o_pb_state;end
end//====================================================
// 计时器到达设定值时,进行事件判断:
// PB_state常为高电平状态
// 下降沿:非空闲 && 计数完毕 && 当前状态为1
// 上升沿:非空闲 && 计数完毕 && 当前状态为0
// 注:PB_state会在end_PB_cnt脉冲后反转,故此处引用了
// PB_state的当前状态
//====================================================
assign o_pb_negedge = ~PB_idle && end_PB_cnt && (o_pb_state==1'b1);
assign o_pb_posedge = ~PB_idle && end_PB_cnt && (o_pb_state==1'b0);endmodule
2.6 led_drv
pulse 接口,每收到一个脉冲,led 翻转一次。
module led_drv (input clk ,input rst_n ,input pulse ,output reg led
);always @(posedge clk or negedge rst_n)beginif (rst_n == 1'b0)led <= 1'b0;else if (pulse)led <= ~led;elseled <= led;endendmodule
3. 编译与调试
3.1 XDC
set_property PACKAGE_PIN K22 [get_ports {CLK_IN_D_0_clk_p[0]}]
set_property IOSTANDARD DIFF_SSTL12 [get_ports {CLK_IN_D_0_clk_p[0]}]set_property PACKAGE_PIN H13 [get_ports ext_reset_in_0]
set_property IOSTANDARD LVCMOS33 [get_ports ext_reset_in_0]set_property PACKAGE_PIN J13 [get_ports i_button_0]
set_property IOSTANDARD LVCMOS33 [get_ports i_button_0]set_property PACKAGE_PIN H12 [get_ports led_0]
set_property IOSTANDARD LVCMOS33 [get_ports led_0]set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
connect_debug_port dbg_hub/clk [get_nets clk]
重点解释下与 ILA 相关的约束,它们用于配置调试核心(debug core)和连接调试端口。
1)set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
- 这条命令设置调试核心的输入时钟频率为300 MHz(300,000,000 Hz)。这意味着调试核心将以300 MHz的频率运行。
2)set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
- 这条命令禁用时钟分频器。也就是说,调试核心将直接使用输入时钟频率,而不会进行分频。
3)set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
- 这条命令设置用户扫描链的数量为1。扫描链用于调试和测试目的,允许多个调试核心串联在一起。
4)connect_debug_port dbg_hub/clk [get_nets clk]:
- 这条命令将调试核心的时钟端口(dbg_hub/clk)连接到设计中的时钟网络(clk)。这确保调试核心能够接收到正确的时钟信号。
3.2 Debug
抓取按键下降沿:
抓取按键上升沿:
4. 总结
本文档提供了在 Vivado 中对 FPGA 设计中常用的几个简单模块和功能的详细分析,包括输入输出缓冲器、全局时钟缓冲器、处理器系统复位以及按键消抖模块。
- 了解 Utility Buffer v2.2 中的 Buffer,重点分析 IBUFDS 和 BUFGCE_DIV
- 分析 Processor System Reset v5.0
- 分析按键消抖模块(key_mod)
- 了解与 ILA 相关自动生成的约束
相关文章:

Vivado - BD(差分时钟、简单分频、RESET、KEY)
目录 1. 简介 1.1 要点 1.2 buffer 介绍 2. vivado 工程 2.1 Block Design 2.2 IBUFDS 2.3 BUFGCE_DIV 2.4 Processor System Reset 2.5 key_mod 2.6 led_drv 3. 编译与调试 3.1 XDC 3.2 Debug 4. 总结 1. 简介 1.1 要点 了解 Utility Buffer v2.2 中的 Buffer…...

7--苍穹外卖-SpringBoot项目中套餐管理 详解(一)
前言 目录 新增套餐 需求分析和设计 代码开发 根据分类id查询菜品 Controller层 Service层 ServiceImpl层 Mapper层 DishMapper.xml 新增套餐 实体类 mapper层 Service层 ServiceImpl层 Mapper层 SetmealMapper.xml setmealDishMapper.xml 套餐分页查询 需求分…...
【尚硅谷】RocketMQ 消息队列学习笔记
RocketMQ 和 Kafka 消息队列概念比较? 好的!RocketMQ 和 Kafka 都是分布式消息队列系统,它们的核心概念有很多相似之处,但在具体实现和命名上有所不同。下面我通过一个表格来对比 RocketMQ 和 Kafka 中的五个概念:消息…...

C题(三)芝麻开门 --- strcmp函数应用
场景一:“芝麻开门 ”是通往C语言的大门的暗号,现在你需要说对暗号,大门才会打开。 【分解目标1】字符串的输入 char arr[20] { 0 }; //字符的集合---字符串(数组表示)//20为预定的数组的大小scanf("%s", a…...

C++函数模板、选择排序实现(从大到小)
template <class T> void mysw (T &a , T &b) {T temp b;b a;a temp; }template <class T> void muSort( T &arr ,int len) {//该实现为选择排序(高到低)for (int i 0; i < len; i) {int max i ; //首先默认本次循环首位元素为最大for (int j …...

EasyExcel使用介绍
EasyExcel使用 1、EasyExcel介绍 1.1 官网介绍 传统操作Excel大多都是利用Apach POI进行操作的,但是POI框架并不完善,使用过程非常繁琐且有较多的缺陷: 动态操作Excel非常繁琐,对于新手来说,很难在短时间内上手;读写时需要占用…...
字段临时缓存包装器
前言 在实际开发中,我们有时候存在一种需求,例如对于某个字段,我们希望在某个明确的保存节点前对字段的修改都仅作为缓存保留,最终是否应用这些修改取决于某些条件,比如玩家对游戏设置的修改可能需要玩家明确确认应用修…...

Python(三)——列表
文章目录 创建列表访问下标遍历列表元素新增元素查找元素删除元素连接列表切片操作 创建列表 创建列表主要有两种方式 [ ]表示一个空的列表 a [] print(type(a)) # <class list> print(a) # []通过list()的方式来创建一个空列表 a list() print(type(a)) # …...

MySQL--三大范式(超详解)
目录 一、前言二、三大范式2.1概念2.2第一范式(1NF)2.3第二范式(2NF)2.3第三范式(3NF) 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导,有什么不对的地方,我会及时改进…...
追梦无Bug的软件世界
追梦无Bug的软件世界:测试人员的视角与探索 我有一个梦想,今天我们共同承载着一个愿景:创造一个没有Bug的软件世界。 我梦想有一天,用户将享受到完全无Bug的软件体验,用户不再因为软件中的Bug而感到困扰和沮丧。 我梦…...
在C#中使用Redis实现高效消息队列
使用Redis实现C#中的消息队列 Redis是一种开源的内存数据结构存储系统,因其高性能和灵活性被广泛用于缓存、数据库和消息队列等场景。本文将详细介绍如何在C#中使用Redis实现一个简单的消息队列,涵盖环境准备、代码实现和使用示例。 1. 环境准备 1.1 安装Redis 首先,确保…...

微服务JMeter解析部署使用全流程
目录 1、介绍 2、下载 3、运行 4、设置简体中文版 5、开始测试 1、添加线程组 2、添加监听器 3、添加请求 先.测试userController里的查询方法 6、查看结果 1、查看结果树 2、汇总报告 3、聚合报告 7、JMeter报错 1、介绍 Apache JMeter 是 Apache 组织基于 Java…...

Python 从入门到实战32(数据库MySQL)
我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们讨论了数据库编程接口操作的相关知识。今天我们将学习…...
hrnet训练的pt模型结合目标检测进行关键点识别的更准确前向推理
本篇在将图像输入hrnet识别之前先进行目标检测来确定识别的位置,让识别更加精准。 本段代码设置了一个区域框BOX,让人走入区域内才开始检测,适用于考核等场景,也可以直接去掉BOX也是一样的效果。若画面背景中有多个行人࿰…...
Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II
Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II 1. 解题思路2. 代码实现 题目链接:3306. Count of Substrings Containing Every Vowel and K Consonants II 1. 解题思路 这一题的话思路上就是一个滑动窗口,考察没一…...

算法笔记(五)——分治
文章目录 算法笔记(五)——分治快排颜色分类排序数组数组中的第K个最大元素库存管理 III 归并排序数组交易逆序对的总数计算右侧小于当前元素的个数翻转对 算法笔记(五)——分治 分治算法字面上的解释是“分而治之”,就…...

多级侧边菜单(递归)
需要编写两个文件 aside-menu.vue 和 menu-item.vue menu-item.vue <script setup> defineOptions({name: MenuItem}) defineProps({menuList: Array}) </script><template><template v-for"menu of menuList"><!-- 如果当前有子菜单&a…...

JavaScript break与continue语句
break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。 break break语句用于跳出代码块或循环 for(i0;i<100;i){if(i5){break;}console.log(i);} continue continue语句用于应即终止本轮循环,返回循环结构的头部,开始下一轮循环。…...
算法【从递归入手一维动态规划】
动态规划:用空间代替重复计算,包含一整套原理和技巧的总和。后面会有非常多的文章介绍动态规划。 有些递归在展开计算时,总是重复调用同一个子问题的解,这种重复调用的递归变成动态规划很有收益。如果每次展开都是不同的解&#…...

Linux中的进程间通信之共享内存
共享内存 共享内存示意图 共享内存数据结构 struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kerne…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...