GlitchFree的时钟切换技术(glitchless clock mux GLCM)

本文介绍两种GlitchFree时钟切换技术,一种适用于频率呈倍数关系的时钟源,另一种适用于异步时钟源。通过使用AND-OR型多路复用器和D触发器,可以有效避免时钟切换过程中的毛刺现象,确保系统稳定性。

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

0.下文给出了两种glitchFree的电路

第一种电路图包含了DFT的相关控制,且是3级上升沿的寄存器打拍,知乎NingHeChuan给出的是两级寄存器分别使用下沿和上沿触发的寄存器打拍。需要分析两种做法的优劣。

1.项目中实际使用的

参考链接 百度网盘/芯片学习/典型电路

2.知乎给出的方法

摘自知乎NingHeChuan Glitch Free时钟切换技术

多频时钟被用于芯片越来越多,特别是在通信领域,通常会在芯片运行过程中进行时钟切换,芯片中有两个时钟源,通过内部逻辑控制多路复用器来实现时钟源切换。本文将会介绍两种时钟切换方法,分别对应两种情况,第一种时两个时钟源的频率呈倍数关系,第二种是两个时钟源完全没有关系,异步时钟。

两个时钟的频率可能完全无关或者呈倍数关系,所以如果采用直接切换的方法,例如

  assign  outclk = sel? clk0: clk1;

上面这个写法太烂了。。。

肯定会产生毛刺,这对整个系统是很危险的,因为有些寄存器可能会捕获到时钟沿其他没捕获到,造成系统的不稳定。

下面是使用AND-OR型多路复用器逻辑进行简单的时钟切换。

可以看出,当SELECT信号改变时,如果当前时钟源正好处于高电平,这样切换则引起了毛刺。

  assign outclk = (clk1 & select) | (~select & clk0);

仿真结果如图,显而易见。

避免毛刺的方法继续往下看,下图针对的是两个时钟源频率成倍数关系。在每个时钟源的选择路径中插入一个下降沿触发的D触发器,这样可以保证上面的情况被避免,确保在切换时钟源时,即使任意时钟处于高电平,也不会引起输出的变换,时钟源切换时,这个反馈能保证一个时钟被完全取消选择后,输出传播另一个时钟,从而避免产生任何毛刺。

这个电路有三个时序路径需要考虑,SELECT到两个触发器的任何一个,DFF0到DFF1,DFF1到DFF0,这三条路径上的输入信号与时钟边沿同时发生变化,都可能会引起亚稳态,所以需要将触发器的触发边沿和SELECT信号的变换边沿分开,这可以通过时序约束来实现,因为这两个时钟是呈倍数的关系。

芯片在启动时,两个触发器都应该处于0状态。

  reg     out1;
  reg     out0;
  always @(negedge clk1 or negedge rst_n)begin
      if(rst_n == 1'b0)begin
          out1 <= 0;
      end
      else begin
          out1 <= ~out0 & select;
      end
  end
  ​
  ​
  always @(negedge clk0 or negedge rst_n)begin
      if(rst_n == 1'b0)begin
          out0 <= 0;
      end
      else begin
          out0 <= ~select & ~out1;
      end
  end
  ​
  assign outclk = (out1 & clk1) | (out0 & clk0);

仿真结果同样显而易见。

第二种方法是针对两个异步时钟源的切换,这个方法是在第一种方法的基础上,在选择路径上再插入一个上升沿触发D触发器,这是为了针对对两个异步时钟源产生的反馈信号以及异步信号SELECT,对选择信号进行同步处理,这样即使是两个异步的时钟源进行切换,也可以避免亚稳态的产生。

  reg     out_r1;
  reg     out1;
  reg     out_r0;
  reg     out0;
  ​
  always @(posedge clk1 or negedge rst_n)begin
      if(rst_n == 1'b0)begin
          out_r1 <= 0;
      end
      else begin
          out_r1 <= ~out0 & select;
      end
  end
  ​
  always @(negedge clk1 or negedge rst_n)begin
      if(rst_n == 1'b0)begin
          out1 <= 0;
      end
      else begin
          out1 <= out_r1;
      end
  end
  ​
  always @(posedge clk0 or negedge rst_n)begin
      if(rst_n == 1'b0)begin
          out_r0 <= 0;
      end
      else begin
          out_r0 <= ~select & ~out1;
      end
  end
  ​
  always @(negedge clk0 or negedge rst_n)begin
      if(rst_n == 1'b0)begin
          out0 <= 0;
      end
      else begin
          out0 <= out_r0;
      end
  end
  ​
  assign outclk = (out1 & clk1) | (out0 & clk0);

仿真结果显而易见。

多个时钟源切换可以根据本文方法进行拓展。

上面代码又可以分解为以下几个common ip

1.comm_sync

2.comm_clk_and2

3.comm_clk_gate

4.comm_clk_or2

### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值