跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言

FPGA 时钟约束详解:create_clock 与 create_generated_clock 实战指南

FPGA 时钟约束的核心概念与实践方法。内容涵盖主时钟 (create_clock)、衍生时钟 (create_generated_clock) 及虚拟时钟的定义与约束语法,深入讲解了 PLL/MMCM 配置、分频倍频、边沿选择与偏移等高级技巧。同时提供了高速数据采集、视频处理及通信基站等实战案例的完整约束文件,并总结了时钟组设置、常见错误排查及最佳实践,旨在帮助工程师建立完整的时序约束体系,确保 FPGA 设计时序收敛。

DotNetGuy发布于 2026/4/6更新于 2026/7/2663 浏览

FPGA 时钟约束完全攻略

概述

时钟约束是 FPGA 设计中最核心、最重要的约束类型,可以说是整个时序约束体系的基石。正确的时钟约束是时序收敛的前提,所有其他约束 (I/O 延迟、时序例外等) 都建立在时钟约束之上。

为什么时钟约束如此重要?

在 FPGA 设计中,时钟信号驱动着整个数字系统的运行。如果没有正确的时钟约束,会导致:

  • ❌ 综合工具无法正确优化设计
  • ❌ 布局布线工具无法满足时序要求
  • ❌ 静态时序分析 (STA) 无法准确评估设计性能
  • ❌ 最终导致硬件功能异常或不稳定

本文将帮助您:

  1. 深入理解时钟约束的原理和作用机制
  2. 掌握 create_clock 和 create_generated_clock 的正确用法
  3. 学会处理各种复杂时钟场景 (分频、倍频、相移等)
  4. 了解虚拟时钟和时钟组的应用
  5. 通过实战案例巩固时钟约束技能
  6. 避免常见的时钟约束错误

一、时钟约束基础概念

1.1 为什么需要时钟约束

时钟约束不仅仅是告诉工具时钟频率那么简单,它在 FPGA 设计流程中扮演着多重关键角色。

1.1.1 指导综合优化

综合器需要知道时钟频率才能进行合理的优化:

没有时钟约束的情况:

// Verilog 代码
always @(posedge clk) begin
    result <= a + b + c + d;
end

如果没有时钟约束,综合器不知道目标频率,可能会:

  • 选择面积最小但速度慢的实现
  • 无法判断是否需要插入流水线
  • 无法优化关键路径

有时钟约束的情况:

# 约束时钟为 200MHz (周期 5ns)
create_clock -period 5.000 -name sys_clk [get_ports clk]

综合器知道需要在 5ns 内完成运算,会:

  • ✅ 选择更快的加法器实现
  • ✅ 可能自动插入流水线寄存器
  • ✅ 优化关键路径以满足时序
1.1.2 指导布局布线

布局布线器根据时钟约束来放置逻辑单元和规划布线:

# 高速时钟约束
create_clock -period 2.000 -name clk_500m [get_ports clk_in]

布局布线器会:

  • ✅ 将相关逻辑放置得更紧密
  • ✅ 使用更优质的布线资源
  • ✅ 减少时钟偏斜 (Clock Skew)
  • ✅ 优化关键路径的物理实现
1.1.3 进行静态时序分析

静态时序分析 (STA) 是验证设计时序正确性的关键步骤:

时序检查的基本原理:

发起触发器 (Launch FF) → 组合逻辑 → 捕获触发器 (Capture FF)
↓ ↓
时钟边沿 T0 时钟边沿 T1

Setup 时间检查:

数据必须在时钟边沿前稳定 ≥ Setup 时间
Tclk ≥ Tco + Tlogic + Trouting + Tsetup

Hold 时间检查:

数据必须在时钟边沿后保持 ≥ Hold 时间
Tco + Tlogic  Trouting ≥ Thold
+

没有时钟约束,这些检查都无法进行!

1.1.4 定义时钟域关系

在多时钟系统中,时钟约束定义了时钟之间的关系:

# 定义两个独立时钟
create_clock -period 10.000 -name clk_100m [get_ports clk_a]
create_clock -period 8.000 -name clk_125m [get_ports clk_b]
# 声明它们是异步的
set_clock_groups -asynchronous \
-group [get_clocks clk_100m] \
-group [get_clocks clk_125m]

这告诉工具:

  • ✅ 这两个时钟域之间的路径不需要时序分析
  • ✅ 设计者需要自行处理跨时钟域 (CDC) 问题
  • ✅ 避免工具报告大量无意义的时序违例

二、主时钟约束 (create_clock) 详解

2.1 基本语法与参数
2.1.1 完整语法格式
create_clock \
-period <period_value> \
-name <clock_name> \
-waveform <edge_list> \
-add \
[get_ports <port_name>]
2.1.2 参数详解

1. -period(时钟周期)

# 单位:纳秒 (ns)
create_clock -period 10.000 -name clk_100m [get_ports clk]
# 100MHz = 1000MHz / 100 = 10ns 周期

频率与周期换算公式:

周期 (ns) = 1000 / 频率 (MHz)
频率 (MHz) = 1000 / 周期 (ns)

2. -name(时钟名称)

# ✅ 推荐:使用有意义的名称
create_clock -period 10.000 -name clk_sys_100m [get_ports sys_clk]
# ❌ 不推荐:使用默认名称或无意义名称
create_clock -period 10.000 [get_ports sys_clk]
# 默认使用端口名

命名建议:

  • 包含频率信息:clk_100m, clk_125m
  • 体现用途:clk_sys, clk_ddr, clk_eth
  • 避免使用 clk1, clk2 等无意义名称

3. -waveform(波形定义)

# 默认波形:50% 占空比,从 0 开始
create_clock -period 10.000 -name clk [get_ports clk]
# 等效于:-waveform {0 5.0}
# 自定义波形
create_clock -period 10.000 -waveform {0 2.5} -name clk_25duty [get_ports clk]
# 25% 占空比:高电平 2.5ns,低电平 7.5ns

波形格式: {上升沿时间 下降沿时间}

4. -add(添加模式)

# 同一端口定义多个时钟 (用于时钟切换场景)
create_clock -period 10.000 -name clk_normal [get_ports clk_in]
create_clock -period 100.000 -name clk_slow [get_ports clk_in] -add
# 需要配合时钟组使用
set_clock_groups -physically_exclusive \
-group [get_clocks clk_normal] \
-group [get_clocks clk_slow]

三、衍生时钟约束 (create_generated_clock) 详解

4.1 什么是衍生时钟?
4.1.1 衍生时钟的概念

衍生时钟 (Generated Clock) 是指由主时钟经过 FPGA 内部逻辑处理后产生的时钟信号。

📌 关键特征:

特征说明
来源由主时钟 (Primary Clock) 派生而来
产生方式通过 PLL、MMCM、分频器、选择器等逻辑产生
频率关系与源时钟存在确定的频率关系 (倍频/分频)
相位关系可能存在相位偏移
约束方式使用 create_generated_clock 命令
4.1.2 为什么需要衍生时钟约束?

❌ 不约束衍生时钟的后果:

1. 时序分析不完整
└─ 工具无法正确分析跨时钟域路径
2. 时钟关系丢失
└─ 无法识别同步/异步时钟关系
3. 优化效果差
└─ 布局布线工具无法进行针对性优化
4. 时序收敛困难
└─ 可能出现意外的时序违例

✅ 正确约束衍生时钟的好处:

# 示例:PLL 输出时钟
create_clock -period 10.000 -name clk_in [get_ports clk_in]
# 约束 PLL 输出 (100MHz -> 200MHz)
create_generated_clock -name clk_200m \
-source [get_pins pll_inst/CLKIN1] \
-multiply_by 2 \
[get_pins pll_inst/CLKOUT0]
# 工具能够:
# 1. 自动计算衍生时钟周期 (5ns)
# 2. 识别与源时钟的同步关系
# 3. 正确分析跨时钟域路径
# 4. 优化时钟树结构
4.2 create_generated_clock 基本语法
4.2.1 完整语法格式
create_generated_clock \
-name <clock_name> \
# 时钟名称 (必需)
-source <source_pin> \
# 源时钟引脚 (必需)
[-master_clock <master_clock>] \
# 主时钟名称 (可选)
[-divide_by <divisor>] \
# 分频系数
[-multiply_by <multiplier>] \
# 倍频系数
[-duty_cycle <percent>] \
# 占空比
[-invert] \
# 反相
[-edge_shift <edge_list>] \
# 边沿偏移
[-edges <edge_list>] \
# 边沿选择
[-add] \
# 添加模式
<target_pin> # 目标引脚 (必需)
4.2.2 关键参数详解

1. -name(时钟名称)

# 命名规范建议
create_generated_clock -name clk_pll_200m ...
# ✅ 清晰表明来源和频率
create_generated_clock -name clk_div2 ...
# ✅ 表明分频关系
create_generated_clock -name clk1 ...
# ❌ 名称不明确

2. -source(源时钟引脚)

# 必须指向源时钟所在的引脚
# 对于 PLL:指向 PLL 的输入引脚
create_generated_clock -name clk_out \
-source [get_pins pll_inst/CLKIN1] \
[get_pins pll_inst/CLKOUT0]
# 对于分频器:指向分频器的时钟输入
create_generated_clock -name clk_div \
-source [get_pins clk_div_reg/C] \
[get_pins clk_div_reg/Q]

3. -divide_by(分频系数)

# 2 分频示例
create_generated_clock -name clk_50m \
-source [get_pins pll_inst/CLKIN1] \
-divide_by 2 \
[get_pins pll_inst/CLKOUT1]
# 100MHz -> 50MHz
# 4 分频示例
create_generated_clock -name clk_25m \
-source [get_pins pll_inst/CLKIN1] \
-divide_by 4 \
[get_pins pll_inst/CLKOUT2]
# 100MHz -> 25MHz

4. -multiply_by(倍频系数)

# 2 倍频示例
create_generated_clock -name clk_200m \
-source [get_pins pll_inst/CLKIN1] \
-multiply_by 2 \
[get_pins pll_inst/CLKOUT0]
# 100MHz -> 200MHz
# 4 倍频示例
create_generated_clock -name clk_400m \
-source [get_pins pll_inst/CLKIN1] \
-multiply_by 4 \
[get_pins pll_inst/CLKOUT3]
# 100MHz -> 400MHz

5. -master_clock(主时钟指定)

# 当源引脚有多个时钟时,需要明确指定主时钟
create_clock -period 10.000 -name clk_a [get_ports clk_in]
create_clock -period 8.000 -name clk_b [get_ports clk_in] -add
# 指定使用 clk_a 作为源
create_generated_clock -name clk_gen \
-source [get_ports clk_in] \
-master_clock clk_a \
-divide_by 2 \
[get_pins div_inst/Q]

四、虚拟时钟与时钟组

6.1 虚拟时钟 (Virtual Clock)
6.1.1 什么是虚拟时钟?

虚拟时钟 (Virtual Clock) 是一种不直接驱动 FPGA 内部逻辑的时钟,主要用于定义 I/O 接口的时序约束。

📌 关键特征:

特征说明
物理存在不存在于 FPGA 内部,仅用于约束
主要用途定义输入/输出延迟的参考时钟
创建方式使用 create_clock 但不指定目标对象
典型场景板级接口时序约束
6.1.2 为什么需要虚拟时钟?

应用场景:

📊 虚拟时钟使用场景
│ ├─ 1️⃣ 源同步接口
│ └─ 数据和时钟来自同一源,但时钟不进入 FPGA
│ ├─ 2️⃣ 系统同步接口
│ └─ 外部器件使用不同频率时钟,但与 FPGA 同步
│ ├─ 3️⃣ 中心对齐接口
│ └─ 数据在时钟中心采样
└─ 4️⃣ 复杂 I/O 时序
└─ 需要独立定义输入输出时序
6.1.3 虚拟时钟创建

基本语法:

# 创建虚拟时钟 (不指定目标对象)
create_clock -period <period> -name <virtual_clock_name>

示例 1:源同步接口

# 外部器件使用 100MHz 时钟
create_clock -period 10.000 -name virt_clk_100m
# FPGA 内部时钟
create_clock -period 10.000 -name clk_fpga [get_ports sys_clk]
# 使用虚拟时钟定义输入延迟
set_input_delay -clock virt_clk_100m -max 2.0 [get_ports data_in[*]]
set_input_delay -clock virt_clk_100m -min 0.5 [get_ports data_in[*]]

示例 2:不同频率的外部时钟

# 外部 ADC 使用 80MHz 时钟
create_clock -period 12.500 -name virt_clk_adc
# FPGA 内部使用 100MHz 时钟
create_clock -period 10.000 -name clk_fpga [get_ports sys_clk]
# ADC 数据输入延迟
set_input_delay -clock virt_clk_adc -max 3.0 [get_ports adc_data[*]]
set_input_delay -clock virt_clk_adc -min 1.0 [get_ports adc_data[*]]

五、完整实战案例

7.1 案例 1:高速数据采集系统
7.1.1 系统架构

系统组成:

📊 高速数据采集系统
│ ├─ ADC 接口 (200MHz LVDS)
│ ├─ DDR3 内存 (800MHz)
│ ├─ 以太网接口 (125MHz RGMII)
│ ├─ 系统控制 (100MHz)
└─ UART 调试 (50MHz)
7.1.2 完整约束文件
# ========================================
# 高速数据采集系统时钟约束
# ========================================
# ------------------
# 1. 输入时钟
# ------------------
# 系统主时钟:100MHz 差分输入
create_clock -period 10.000 -name clk_sys_p [get_ports sys_clk_p]
set_property IOSTANDARD LVDS [get_ports sys_clk_p]
set_property IOSTANDARD LVDS [get_ports sys_clk_n]
# ADC 数据时钟:200MHz LVDS
create_clock -period 5.000 -name clk_adc [get_ports adc_clk_p]
set_property IOSTANDARD LVDS [get_ports adc_clk_p]
set_property IOSTANDARD LVDS [get_ports adc_clk_n]
# 以太网接收时钟:125MHz
create_clock -period 8.000 -name clk_eth_rx [get_ports eth_rxc]
# ------------------
# 2. PLL 输出时钟
# ------------------
# PLL 实例:sys_pll
# 输入:100MHz -> VCO:1000MHz
# 核心时钟:200MHz
create_generated_clock -name clk_core \
-source [get_pins sys_pll_inst/CLKIN1] \
-multiply_by 2 \
[get_pins sys_pll_inst/CLKOUT0]
# DDR 时钟:400MHz
create_generated_clock -name clk_ddr \
-source [get_pins sys_pll_inst/CLKIN1] \
-multiply_by 4 \
[get_pins sys_pll_inst/CLKOUT1]
# DDR 参考时钟:200MHz
create_generated_clock -name clk_ddr_ref \
-source [get_pins sys_pll_inst/CLKIN1] \
-multiply_by 2 \
[get_pins sys_pll_inst/CLKOUT2]
# 以太网发送时钟:125MHz
create_generated_clock -name clk_eth_tx \
-source [get_pins sys_pll_inst/CLKIN1] \
-multiply_by 5 \
-divide_by 4 \
[get_pins sys_pll_inst/CLKOUT3]
# UART 时钟:50MHz
create_generated_clock -name clk_uart \
-source [get_pins sys_pll_inst/CLKIN1] \
-divide_by 2 \
[get_pins sys_pll_inst/CLKOUT4]
# ------------------
# 3. 虚拟时钟
# ------------------
# ADC 输出虚拟时钟 (用于输入延迟约束)
create_clock -period 5.000 -name virt_adc_out
# 以太网 PHY 虚拟时钟
create_clock -period 8.000 -name virt_eth_phy
# ------------------
# 4. 时钟组
# ------------------
# 异步时钟组
set_clock_groups -asynchronous \
-group [get_clocks {clk_sys_p clk_core}] \
-group [get_clocks {clk_adc virt_adc_out}] \
-group [get_clocks {clk_ddr clk_ddr_ref}] \
-group [get_clocks {clk_eth_rx clk_eth_tx virt_eth_phy}] \
-group [get_clocks clk_uart]
# ------------------
# 5. I/O 延迟约束
# ------------------
# ADC 数据输入 (LVDS,200MHz)
set_input_delay -clock virt_adc_out -max 1.5 [get_ports adc_data_p[*]]
set_input_delay -clock virt_adc_out -min 0.5 [get_ports adc_data_p[*]]
# 以太网 RGMII 接口
# RX 数据 (125MHz,DDR)
set_input_delay -clock clk_eth_rx -max 1.2 \
-clock_fall [get_ports eth_rxd[*]]
set_input_delay -clock clk_eth_rx -min -0.8 \
-clock_fall [get_ports eth_rxd[*]]
# TX 数据 (125MHz,DDR)
set_output_delay -clock clk_eth_tx -max 1.0 \
-clock_fall [get_ports eth_txd[*]]
set_output_delay -clock clk_eth_tx -min -0.5 \
-clock_fall [get_ports eth_txd[*]]
# ------------------
# 6. 时钟不确定性
# ------------------
# 系统时钟不确定性 (考虑晶振抖动)
set_clock_uncertainty 0.2 [get_clocks clk_sys_p]
# ADC 时钟不确定性
set_clock_uncertainty 0.15 [get_clocks clk_adc]
# ------------------
# 7. 时序例外
# ------------------
# 复位路径 false path
set_false_path -from [get_ports sys_rst_n]
# 异步 CDC 路径
set_max_delay 5.0 -from [get_clocks clk_adc] -to [get_clocks clk_core]
set_max_delay 5.0 -from [get_clocks clk_core] -to [get_clocks clk_eth_tx]

总结

通过本文的学习,我们系统地掌握了 FPGA 时钟约束的完整知识体系。让我们回顾一下核心要点:

核心知识回顾
1️⃣ 时钟约束基础

时钟分类:

  • 主时钟 (Primary Clock): 使用 create_clock 定义外部输入时钟
  • 衍生时钟 (Generated Clock): 使用 create_generated_clock 定义内部派生时钟
  • 虚拟时钟 (Virtual Clock): 用于 I/O 接口时序约束的参考时钟

时钟约束的三大作用:

  • ✅ 指导综合优化:帮助综合器选择合适的实现方式
  • ✅ 指导布局布线:优化逻辑放置和布线资源分配
  • ✅ 静态时序分析:验证设计是否满足时序要求
2️⃣ create_clock 命令精要

基本语法:

create_clock -period <周期> -name <时钟名> [get_ports <端口>]

关键参数:

  • -period: 时钟周期 (ns),必需参数
  • -name: 时钟名称,强烈建议指定
  • -waveform: 自定义波形,控制占空比和相位
  • get_ports: 指定时钟输入端口

常见应用:

  • 标准时钟约束
  • 差分时钟约束 (只约束 P 端)
  • 自定义占空比和相位
  • 多时钟系统
3️⃣ create_generated_clock 命令精要

基本语法:

create_generated_clock -name <名称> \
-source <源引脚> \
[-multiply_by <倍频>] [-divide_by <分频>] \
<目标引脚>

关键参数:

  • -source: 源时钟引脚位置,必需参数
  • -multiply_by: 倍频系数
  • -divide_by: 分频系数
  • -edges: 边沿选择,实现复杂分频
  • -edge_shift: 边沿偏移,实现相位调整

典型应用:

  • PLL/MMCM 输出时钟
  • 时钟分频器 (偶数/奇数分频)
  • 时钟选择器输出
  • 级联时钟系统
4️⃣ 高级技巧

边沿选择 (-edges):

  • 实现非整数分频 (1.5 分频、2.5 分频等)
  • 精确控制时钟波形

边沿偏移 (-edge_shift):

  • 实现相位调整 (90 度、180 度、270 度)
  • 自定义占空比

时钟组 (Clock Groups):

  • -asynchronous: 异步时钟组
  • -physically_exclusive: 物理互斥时钟
  • -logically_exclusive: 逻辑互斥时钟
5️⃣ 最佳实践

约束文件组织:

1. 输入时钟定义
2. 衍生时钟定义
3. 虚拟时钟定义
4. 时钟组定义
5. I/O 延迟约束
6. 时钟不确定性
7. 时序例外

命名规范:

  • 使用有意义的名称 (如 clk_sys_100m)
  • 包含频率信息
  • 体现时钟来源和用途

验证检查:

report_clocks # 检查时钟定义
check_timing -verbose # 检查未约束路径
report_clock_interaction # 检查时钟关系
report_timing_summary # 时序分析

参考资料

官方文档
  1. Xilinx 官方文档
    • UG903 - Vivado Design Suite User Guide: Using Constraints
    • UG949 - UltraFast Design Methodology Guide
  2. Intel/Altera 官方文档
    • Quartus Prime Standard Edition User Guide: Timing Analyzer
优秀博客文章
  1. 知乎专栏
    • FPGA 时序约束高级进阶
    • 时钟域交叉 (CDC) 设计技巧
    • PLL 时钟约束最佳实践
  2. 技术论坛
    • Xilinx Community Forums - Timing Constraints
    • FPGA4Fun - Clock Constraints Tutorial
视频教程
  1. 在线课程
    • Xilinx 官方培训课程:Timing Constraints
    • Coursera: FPGA Design for Embedded Systems
    • Udemy: Complete FPGA Timing Constraints Course
推荐书籍
  1. 经典教材
    • 《FPGA 时序分析与约束设计》
    • 《Vivado 从此开始》- 时序约束章节
    • 《FPGA 设计技巧与案例开发详解》

目录

  1. FPGA 时钟约束完全攻略
  2. 概述
  3. 一、时钟约束基础概念
  4. 1.1 为什么需要时钟约束
  5. 1.1.1 指导综合优化
  6. 约束时钟为 200MHz (周期 5ns)
  7. 1.1.2 指导布局布线
  8. 高速时钟约束
  9. 1.1.3 进行静态时序分析
  10. 1.1.4 定义时钟域关系
  11. 定义两个独立时钟
  12. 声明它们是异步的
  13. 二、主时钟约束 (create_clock) 详解
  14. 2.1 基本语法与参数
  15. 2.1.1 完整语法格式
  16. 2.1.2 参数详解
  17. 单位:纳秒 (ns)
  18. 100MHz = 1000MHz / 100 = 10ns 周期
  19. ✅ 推荐:使用有意义的名称
  20. ❌ 不推荐:使用默认名称或无意义名称
  21. 默认使用端口名
  22. 默认波形:50% 占空比,从 0 开始
  23. 等效于:-waveform {0 5.0}
  24. 自定义波形
  25. 25% 占空比:高电平 2.5ns,低电平 7.5ns
  26. 同一端口定义多个时钟 (用于时钟切换场景)
  27. 需要配合时钟组使用
  28. 三、衍生时钟约束 (creategeneratedclock) 详解
  29. 4.1 什么是衍生时钟?
  30. 4.1.1 衍生时钟的概念
  31. 4.1.2 为什么需要衍生时钟约束?
  32. 示例:PLL 输出时钟
  33. 约束 PLL 输出 (100MHz -> 200MHz)
  34. 工具能够:
  35. 1. 自动计算衍生时钟周期 (5ns)
  36. 2. 识别与源时钟的同步关系
  37. 3. 正确分析跨时钟域路径
  38. 4. 优化时钟树结构
  39. 4.2 creategeneratedclock 基本语法
  40. 4.2.1 完整语法格式
  41. 时钟名称 (必需)
  42. 源时钟引脚 (必需)
  43. 主时钟名称 (可选)
  44. 分频系数
  45. 倍频系数
  46. 占空比
  47. 反相
  48. 边沿偏移
  49. 边沿选择
  50. 添加模式
  51. 4.2.2 关键参数详解
  52. 命名规范建议
  53. ✅ 清晰表明来源和频率
  54. ✅ 表明分频关系
  55. ❌ 名称不明确
  56. 必须指向源时钟所在的引脚
  57. 对于 PLL:指向 PLL 的输入引脚
  58. 对于分频器:指向分频器的时钟输入
  59. 2 分频示例
  60. 100MHz -> 50MHz
  61. 4 分频示例
  62. 100MHz -> 25MHz
  63. 2 倍频示例
  64. 100MHz -> 200MHz
  65. 4 倍频示例
  66. 100MHz -> 400MHz
  67. 当源引脚有多个时钟时,需要明确指定主时钟
  68. 指定使用 clk_a 作为源
  69. 四、虚拟时钟与时钟组
  70. 6.1 虚拟时钟 (Virtual Clock)
  71. 6.1.1 什么是虚拟时钟?
  72. 6.1.2 为什么需要虚拟时钟?
  73. 6.1.3 虚拟时钟创建
  74. 创建虚拟时钟 (不指定目标对象)
  75. 外部器件使用 100MHz 时钟
  76. FPGA 内部时钟
  77. 使用虚拟时钟定义输入延迟
  78. 外部 ADC 使用 80MHz 时钟
  79. FPGA 内部使用 100MHz 时钟
  80. ADC 数据输入延迟
  81. 五、完整实战案例
  82. 7.1 案例 1:高速数据采集系统
  83. 7.1.1 系统架构
  84. 7.1.2 完整约束文件
  85. ========================================
  86. 高速数据采集系统时钟约束
  87. ========================================
  88. ------------------
  89. 1. 输入时钟
  90. ------------------
  91. 系统主时钟:100MHz 差分输入
  92. ADC 数据时钟:200MHz LVDS
  93. 以太网接收时钟:125MHz
  94. ------------------
  95. 2. PLL 输出时钟
  96. ------------------
  97. PLL 实例:sys_pll
  98. 输入:100MHz -> VCO:1000MHz
  99. 核心时钟:200MHz
  100. DDR 时钟:400MHz
  101. DDR 参考时钟:200MHz
  102. 以太网发送时钟:125MHz
  103. UART 时钟:50MHz
  104. ------------------
  105. 3. 虚拟时钟
  106. ------------------
  107. ADC 输出虚拟时钟 (用于输入延迟约束)
  108. 以太网 PHY 虚拟时钟
  109. ------------------
  110. 4. 时钟组
  111. ------------------
  112. 异步时钟组
  113. ------------------
  114. 5. I/O 延迟约束
  115. ------------------
  116. ADC 数据输入 (LVDS,200MHz)
  117. 以太网 RGMII 接口
  118. RX 数据 (125MHz,DDR)
  119. TX 数据 (125MHz,DDR)
  120. ------------------
  121. 6. 时钟不确定性
  122. ------------------
  123. 系统时钟不确定性 (考虑晶振抖动)
  124. ADC 时钟不确定性
  125. ------------------
  126. 7. 时序例外
  127. ------------------
  128. 复位路径 false path
  129. 异步 CDC 路径
  130. 总结
  131. 核心知识回顾
  132. 1️⃣ 时钟约束基础
  133. 2️⃣ create_clock 命令精要
  134. 3️⃣ creategeneratedclock 命令精要
  135. 4️⃣ 高级技巧
  136. 5️⃣ 最佳实践
  137. 参考资料
  138. 官方文档
  139. 优秀博客文章
  140. 视频教程
  141. 推荐书籍
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Figma设计稿转前端代码:基于Cursor IDE MCP功能的自动化方案
  • FPGA 卷积神经网络硬件加速:从部署到性能优化
  • 企业微信外部群 Webhook 配置与消息推送指南
  • AirSim 无人机仿真平台零基础部署实战指南
  • 2026 AI 编码工具深度对比:Claude Code、Cursor 与 GitHub Copilot 选型指南
  • 归并排序非递归实现指南
  • LeetCode 高频算法题梳理:Java 面试常见解法
  • RunningHub:基于开源生态的 AIGC 创作平台解析
  • VS Code 调试 C++ 程序完整步骤与配置
  • Stable Diffusion WebUI 基于云主机 RTX 5090 的部署指南
  • C++ std::vector 使用 std::find 查找指定元素
  • 基于腾讯云 HAI 与 DeepSeek 构建个人网页
  • 安卓手机使用 Termux 部署 AstrBot 与 NapCat QQ 机器人
  • 无人机 GPS/北斗多源融合定位:标定、抗干扰与精度提升
  • Wan2.1-I2V 基于步数蒸馏实现 RTX 4060 快速视频生成
  • uniapp 判断运行设备类型(安卓、苹果、鸿蒙、微信小程序、H5)
  • 无人机多源融合定位:GPS/北斗标定、抗干扰与精度提升指南
  • LazyLLM 框架实战:构建代码专家智能体
  • Python 爬虫学习与就业兼职方向解析
  • C++ 结构体基础:定义、成员函数与排序

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online