Generated Clock简介及实现方法在FPGA

181 篇文章

已下架不支持订阅

本文介绍了Generated Clock在FPGA中的作用及其生成方法,通过Vivado Design Suite的Clocking Wizard组件设置时钟频率和相位偏移。示例代码展示了如何生成100MHz的衍生时钟,并探讨了Generated Clock在FPGA设计中的应用及其对系统性能的影响,强调了设计时考虑时钟抖动和时钟偏移的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Generated Clock简介及实现方法在FPGA

Generated Clock,也称为衍生时钟,是一种经过时钟分频和相位偏移处理的时钟信号,通常用于FPGA芯片中的时序设计。与普通时钟不同的是,Generated Clock可以快速生成,可调节,且具有单一的时钟域,因此在FPGA设计中具有广泛的应用。

如何生成Generated Clock呢?我们以Vivado Design Suite为例,通过以下步骤进行设置:

  1. 在IP Integrator中添加一个Clocking Wizard组件。
  2. 连接所需的时钟输入,外部时钟源或已有的Generated Clock。
  3. 设置需要的时钟频率和相位偏移等参数,生成新的Generated Clock输出。
  4. 将Generated Clock输出连接到需要使用的模块中。

这里给出一个简单的示例代码,生成100MHz的Generated Clock:

// 输入外部时钟信号
input clk_in;

// 定义Clocking Wizard组件
clocking cb @(posedge clk_in);
    // Generated Clock输出端口
    output generated_clock;
endclocking

// 生成100MHz的Generated Clock
wire clk100mhz;
cb #(
    .CLKOUT0_DIVIDE(5),    // 分频比为5
    .CLKOUT0_PHASE(0.0),   // 相位偏移为0
  

已下架不支持订阅

<think>我们正在讨论FPGA设计中的时钟约束,特别是XilinxVivado工具中的create_generated_clock约束。用户要求语法和使用示例。根据引用[1]和[2],create_generated_clock用于定义由主时钟(例如PLL或MMCM输出)生成的时钟。基本语法如下:create_generated_clock-name<generated_clock_name>\-source<master_clock_source_pin_or_port>\-multiply_by<mult_factor>\-divide_by<div_factor>\<pin_or_port>或者更详细的语法(引用[2]):create_generated_clock-name<generated_clock_name>\-source<master_clock_source_pin_or_port>\-multiply_by<mult_factor>\-divide_by<div_factor>\-master_clock<master_clk>\<pin_or_port>其中:-`-name`:指定生成时钟的名称。-`-source`:指定生成时钟的源时钟(主时钟)的引脚或端口。-`-multiply_by`:指定相对于源时钟的倍频因子。-`-divide_by`:指定相对于源时钟的分频因子。-`-master_clock`:指定源时钟的名称(注意:在Vivado中,通常-source已经指定了源时钟的物理节点,而-master_clock用于指定源时钟的对象名称,但在实际使用中,有时可以省略,因为-source已经隐含了主时钟)。-`<pin_or_port>`:指定生成时钟所在的引脚或端口。注意:倍频因子和分频因子不能同时使用,通常用其中一个,或者使用-edges选项来指定基于边沿的生成。此外,还可以使用其他选项,如:-`-edges`:通过指定主时钟的边沿列表来生成时钟。-`-edge_shift`:与-edges一起使用,指定每个边沿的偏移时间。-`-duty_cycle`:指定生成时钟的占空比。-`-invert`:反转生成时钟。使用示例:1.简单分频:假设主时钟clk_in频率为100MHz,我们在一个寄存器上进行了2分频,生成一个50MHz的时钟。```tclcreate_generated_clock-nameclk_div2-source[get_pinsclk_in]-divide_by2[get_pinsdiv2_reg/Q]```2.倍频:假设主时钟clk_in为100MHz,通过PLL产生400MHz时钟,但PLL的输出已经由器件自动生成了时钟,因此我们通常不需要对PLL的输出再使用create_generated_clock,因为PLL的输出时钟会被自动识别。但如果是通过逻辑(如ODDR)产生的时钟,则需要约束。例如,通过ODDR将内部时钟驱动到输出引脚,我们可以这样约束:```tclcreate_generated_clock-nameclk_out-source[get_pinsclk_tx]-multiply_by1[get_portsclk_out_p]```3.使用边沿定义:假设主时钟clk_in(周期10ns,占空比50%),我们通过一个寄存器用主时钟的上升沿产生一个延迟2ns的时钟(相位偏移),并且占空比不变。我们可以使用-edges选项:```tclcreate_generated_clock-nameclk_shifted-source[get_pinsclk_in]-edges{123}-edge_shift{222}[get_pinsshift_reg/Q]```这里主时钟的第一个边沿(上升沿)在0ns,第二个边沿(下降沿)在5ns,第三个边沿(上升沿)在10ns。我们指定生成时钟的边沿分别对应主时钟的第1、2、3个边沿,并且每个边沿都偏移2ns。这样生成时钟的上升沿在0+2=2ns,下降沿在5+2=7ns,下一个上升沿在10+2=12ns,周期仍为10ns。4.组合分频和倍频:假设主时钟100MHz,我们想生成一个150MHz的时钟,可以使用分数关系(3/2倍),但通常我们使用-edges来精确描述:```tclcreate_generated_clock-nameclk_150m-source[get_pinsclk_in]-multiply_by3-divide_by2[get_pinsgen_reg/Q]```或者更精确地使用-edges。注意:在Vivado中,对于由PLL或MMCM生成的时钟,我们通常不需要手动约束,因为工具会自动创建。但有时当自动创建的时钟名称不是我们想要的,或者我们需要对内部逻辑生成的时钟进行约束时,就会用到create_generated_clock。最后,引用[1]和[2]提供了基本的语法介绍,但实际使用中可能需要根据具体设计调整。相关问题:1.在FPGA设计中,为什么需要对生成的时钟进行约束?2.除了分频和倍频,还有哪些常见的时钟生成方式需要约束?3.如何验证create_generated_clock约束是否正确应用?</think>### FPGA `create_generated_clock` 约束语法详解 在 FPGA 设计中,`create_generated_clock` 是用于约束衍生时钟的关键命令,常用于处理 PLL/MMCM 输出、分频器或门控时钟等场景。其语法结构如下: #### 基本语法格式 ```tcl create_generated_clock -name <generated_clock_name> \ -source <master_clock_source> \ -multiply_by <mult_factor> \ -divide_by <div_factor> \ <target_pin_or_port> ``` #### 参数说明 | 参数 | 说明 | |-----------------|----------------------------------------------------------------------| | `-name` | **必需**:指定衍生时钟的名称(需唯一) | | `-source` | **必需**:指定源时钟的物理节点(引脚或端口) | | `-multiply_by` | 倍频系数(与`-divide_by`二选一) | | `-divide_by` | 分频系数(与`-multiply_by`二选一) | | `-master_clock` | 源时钟的逻辑名称(可省略,Vivado 通常自动识别)[^2] | | `<target...>` | **必需**:衍生时钟所在的物理位置(引脚/端口) | --- ### 使用示例 #### 示例 1:基本分频器约束 ```tcl # 源时钟 clk_100MHz 通过寄存器分频 create_generated_clock -name clk_50MHz \ -source [get_pins clk_100MHz] \ -divide_by 2 \ [get_pins div_reg/Q] ``` > **效果**:在寄存器输出端创建 50MHz 时钟(100MHz ÷ 2) #### 示例 2:PLL 倍频输出约束 ```tcl # 约束 PLL 输出的 400MHz 时钟 create_generated_clock -name clk_400MHz \ -source [get_pins pll/CLKIN] \ -multiply_by 4 \ [get_pins pll/CLKOUT0] ``` > **注意**:PLL/MMCM 输出通常会自动识别,此约束用于覆盖默认命名或特殊场景[^1] #### 示例 3:相位偏移约束 ```tcl # 创建 90° 相移时钟 create_generated_clock -name clk_90deg \ -source [get_pins mmcm/CLKOUT0] \ -edges {2 3 4} \ -edge_shift {2.5 2.5 2.5} \ [get_pins phase_reg/Q] ``` > **参数说明**: > - `-edges`:指定源时钟边沿序列(1=上升沿,2=下降沿) > - `-edge_shift`:各边沿的偏移时间(单位 ns) --- ### 关键设计原则 1. **源时钟必须存在**:需先通过 `create_clock` 约束源时钟 2. **避免逻辑时钟**:优先使用 PLL/MMCM 而非逻辑分频(降低抖动) 3. **命名一致性**:衍生时钟名称需与代码中名称匹配 4. **时序例外**:衍生时钟域需单独设置 `set_clock_groups` > 完整语法参考 Xilinx UG903 时序约束文档[^1][^2] --- ### 相关问题 1. 如何验证 `create_generated_clock` 约束是否生效? 2. 衍生时钟和虚拟时钟(virtual clock)有何区别? 3. 在多时钟域设计中,如何处理衍生时钟的跨域路径? 4. 当使用 `-edges` 参数时,如何计算边沿序列的数值? [^1]: [Xilinx约束] create_generated_clock 约束语法介绍 [^2]: FPGA时序约束--进阶篇(衍生时钟约束)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值