首页 > 其他分享 >CDC设计实例-02

CDC设计实例-02

时间:2023-02-26 10:22:24浏览次数:51  
标签:02 en scan clk CDC in0 in1 in2 实例

CDC设计实例

加速器

假设要处理一项业务比如图像处理,有两种方向,第一种选择一些通用的处理器CPU\GPU\DSP等通用的处理器,第二种是将算法映射成IP,直接使用IP进行处理图像处理等专门的业务就是加速器。加速器是挂接到总线上的,类似于DMA,需要CPU派发一些任务给加速器执行。

软件配置

C代码--》编译成二进制文件--》二进制文件存放在RAM中--》CPU通过I-Cache读入二进制文件进行执行

CPU动态切换时钟,不能出现glitch


以三个时钟为例,有一个2bit的选择信号,DFT模式下选择Clk_scan进行输出;首先clk的enable信号经过几级寄存器打拍操作,然后输入到ICG中;ICG使用的是打过几拍之后的信号,ICG的enable是高电平有效的
如果选择clk1信号,select信号选择clk1会从0到1进行拉高,同时clk1到ICG的enable信号会被拉低,但是经过三级打拍之后,会延迟3个周期enable信号才会被拉低,在延迟的3个周期内,让clk2和clk3的enable失效,即使此时clk2和clk3的select信号拉高,但是不能用,形成一个真空区域(在这个时间内,没有时钟可用),经过三个周期之后,再输出选择的时钟

通过mux实现二选1得时钟,毛刺出现在时钟切换的过程中,通过硬件实现时钟切换,就是在切换时钟的过程中,产生一个真空地带,在这个区域中不会出现任何时钟,输出一直是低电平,经过这个地带之后,输出选择的稳定的时钟信号

CPU时钟切换的代码

module glitch_free(
  clk_out,
  cgm_sel,
  clk_in0,
  clk_in1,
  clk_in2,
  rst_clk_n,
  scan_dc_mode,
  icg_scan_mode,
  clk_scan
);

  output clk_out;
  input [1:0] cgm_sel;  // 时钟选择信号2bit
  input clk_in0;
  input clk_in1;
  input clk_in2;
  input rst_clk_n;
  input icg_scan_mode;   // scan mode
  input scan_dc_mode;
  input clk_scan;   // dft使用的时钟
  
// 定义三组打三拍的寄存器,9个register
  
  reg in0_en_sync1,in0_en_sync2,in0_en_sync3;
  reg in1_en_sync1,in1_en_sync2,in1_en_sync3;
  reg in2_en_sync1,in2_en_sync2,in2_en_sync3;

// 判断是不是scan mode,如果是scan mode会将时钟切换为clk_scan
  assign clk_in0_scan = scan_dc_mode ? clk_sacn : clk_in0;
  assign clk_in1_scan = scan_dc_mode ? clk_sacn : clk_in1;
  assign clk_in2_scan = scan_dc_mode ? clk_sacn : clk_in2;

// 选择信号,三个enable信号
  assign in0_sel = (cgm_sel [1:0] == 2'b00)
  assign in1_sel = (cgm_sel [1:0] == 2'b01)
  assign in2_sel = (cgm_sel [1:0] == 2'b10)

// 三个时钟信号可用的标识,in0_en可用的所有可能情况
  assign in0_used = in0_sel | in0_en_sync1 | in0_en_sync2 | in0_en_sync3;
  assign in1_used = in1_sel | in1_en_sync1 | in1_en_sync2 | in1_en_sync3;
  assign in2_used = in2_sel | in2_en_sync1 | in2_en_sync2 | in2_en_sync3;
  
// en信号(与其他时钟相斥)
  assign in0_en = ~in1_used & ~in2_used;
  assign in1_en = ~in0_used & ~in2_used;
  assign in2_en = ~in0_used & ~in1_used;

  always @(posedge clk_in0_sacn or negedge rst_clk_n) begin
    // 复位信号,将寄存器输出置0
    if(!rst_clk_n) begin
      in0_en_sync1 <= 1'b0;
      in0_en_sync2 <= 1'b0;
      in0_en_sync3 <= 1'b0; 
     end
    else begin
    // 不是复位信号,进行三级寄存器打拍
      in0_en_sync1 <= in0_en;
      in0_en_sync2 <= in0_en_sync1;
      in0_en_sync3 <= in0_en_sync2; 
    end
  end 

  always @(posedge clk_in1_sacn or negedge rst_clk_n) begin
    // 复位信号,将寄存器输出置0
    if(!rst_clk_n) begin
      in1_en_sync1 <= 1'b0;
      in1_en_sync2 <= 1'b0;
      in1_en_sync3 <= 1'b0; 
     end
    else begin
    // 不是复位信号,进行三级寄存器打拍
      in1_en_sync1 <= in1_en;
      in1_en_sync2 <= in1_en_sync1;
      in1_en_sync3 <= in1_en_sync2; 
    end
  end 
  
  always @(posedge clk_in2_sacn or negedge rst_clk_n) begin
    // 复位信号,将寄存器输出置0
    if(!rst_clk_n) begin
      in2_en_sync1 <= 1'b0;
      in2_en_sync2 <= 1'b0;
      in2_en_sync3 <= 1'b0; 
     end
    else begin
    // 不是复位信号,进行三级寄存器打拍
      in2_en_sync1 <= in2_en;
      in2_en_sync2 <= in2_en_sync1;
      in2_en_sync3 <= in2_en_sync2; 
    end
  end 
  // 经过三级打拍的信号生成时钟门控信号  
  assign ind_in0 = in0_en_sync2;  // generate the enable signal from the second stage synchronizer
  assign ind_in1 = in1_en_sync2;
  assign ind_in2 = in2_en_sync2;
  
  // 例化门控单元
  cell_clock_gating u_clk_gate_out0 (
  .TE (icg_scan_mode), // DFT:test mode
  .E   (ind_in0),
  .CP  (clk_in0),
  .Q   (clk_ou0)
  );

  assign = ind_in1_scan = ~scan_dc_mode & ind_in1;
  
  // 例化门控单元
  cell_clock_gating u_clk_gate_out1 (
  .TE (icg_scan_mode), // DFT:test mode
  .E   (ind_in1),
  .CP  (clk_in1),
  .Q   (clk_out1)
  );
  
  assign = ind_in2_scan = ~scan_dc_mode & ind_in2;
  
  // 例化门控单元
  cell_clock_gating u_clk_gate_out2 (
  .TE (icg_scan_mode), // DFT:test mode
  .E   (ind_in2),
  .CP  (clk_in2),
  .Q   (clk_out2)
  );

  assign clk_out = clk_out0 | clk_out1 | clk_out2;

endmodule

标签:02,en,scan,clk,CDC,in0,in1,in2,实例
From: https://www.cnblogs.com/Icer-newer/p/17143085.html

相关文章

  • 读Java性能权威指南(第2版)笔记02_ Java SE API技巧上
    1. 压缩字符串1.1. Java61.2. 实验性1.3. compressedstring2. 字符串2.1. Java82.2. 所有都会编码为16位字符数组3. 紧凑字符串3.1. Java113.2. c......
  • 数据探索实例
    一、数据质量分析(一)箱型图分析箱型图提供了识别异常值的一个标准:异常值通常被定义为小于QL-1.5IQR或大于QU+1.5IQR的值。箱型图识别异常值的结果比较客观,在识别异常值方......
  • 2022-2023-2 20221320 数据结构第一周学习总结
    一、教材学习内容总结:1.周一的课上复习了冯·诺依曼模型:输入设备,输出设备(IO设备),存储器,运算器,控制器(CPU)。计算机由硬件(裸机)和软件(系统软件与应用软件)组成(软件是程序、数......
  • AIR32F103(九) CAN总线的通信和ID过滤机制及实例
    目录AIR32F103(一)合宙AIR32F103CBT6开发板上手报告AIR32F103(二)Linux环境和LibOpenCM3项目模板AIR32F103(三)Linux环境基于标准外设库的项目模板AIR32F103(四)2......
  • 浙江理工大学2023acm队淘汰赛
    浙江理工大学2023淘汰赛部分题目的理解这里仅提供代码及思路,网站链接如下:链接>http://47.96.116.66/contest.php?cid=5372<难度梯度:ABCLDEFKIGH——/)/)有......
  • 2023年2月25日(软件工程日报)
    图像视图imageview在XML文件中,通过属性android:src设置图片资源正java代码中,调用setlmageResource方法设置图片的资源。    图像按钮ImageButton显示图片的图像......
  • 2023年2.25日 软工日报
    今天是周六,今天睡到九点才起床,然后写写了概率论,然后写写网络作业,下午写了写安卓,学不会阿,很多代码记不住,看一个博主直接开发记账本app,跟着打,开始是组件控件还有些理解,才看了......
  • 2023.2.25——软件工程日报
    所花时间(包括上课):0h代码量(行):0行博客量(篇):1篇今天,配置好了git,并且学会了如何将本地代码利用git上传到GitHub上。我了解到的知识点:Github首次上传代码测试-sodamate-......
  • 905~907 maven工程servlet实例之间指定web资源包,maven工程servle实例之导入项目依赖
    操作一样把勾进行勾选找到webapp选项   下一步创建就行创建好会有显示   目录结构其余的都需要自己手动补齐有小蓝点的才是一个web项目, 如果上面都正确......
  • [WC/CTS2023] 楼梯 题解
    题目链接简要题意有一块楼梯,这里指的楼梯是倒着的,正过来看上一层宽度一定小于等于这一层宽度,并且由格子组成,你需要对其进行增删和恢复某一历史版本的操作,并回答这块楼梯......