CDC设计实例-02
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
CDC设计实例-02的更多相关文章
- 分立元件封装尺寸及PCB板材工艺与设计实例
分立元件封装尺寸 inch mm (L)mm (w)mm (t)mm (a)mm (b)mm 0201 0603 0.6±0.05 0.30±0.05 0.23±0.05 0.10±0.05 0.60 ...
- 推荐35个新鲜出炉的响应式 Web 设计实例
响应式设计的准则在于根据用户使用的屏幕的分辨率来改变网站的的布局.因此,视频或图像的大小和文本的数量,可以被视为是一个明显的变化.让你即使从智能手机浏览一个网站的时候能轻松地看到网站上的重要内容.今天 ...
- [原创]obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用
原文链接:obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用 我们在第16和第17篇中分别介绍了obj-c的KVC与KVO特性,当时举的例子比较fun,太抽象,貌似和实际不沾边哦.那么 ...
- obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用
我们在第16和第17篇中分别介绍了obj-c的KVC与KVO特性,当时举的例子比较fun,太抽象,貌似和实际不沾边哦.那么下面我们就用一个实际中的例子来看看KVC与KVO是如何运用的吧. 该例中用到了 ...
- 最新Dashboard设计实例、技巧和资源集锦,视觉和功能两不误,妥妥的!
Dashboard设计,尽管设计师们叫法各不相同(例如:“数据面板设计”, “控制面板设计”, “仪表盘设计”或“后台界面设计”等等).但,此类设计的最终目都是力求以最直观.最简洁的方式呈现各种信息和 ...
- App启动页设计实例与技巧
App启动页,也称闪屏页,最初是为缓解用户等待Web/iOS/Android App数据加载的焦虑情绪而出现,后被设计师巧妙用于品牌文化展示,服务特色介绍以及功能界面熟悉等平台进行设计,被赋予了更加丰 ...
- Oracle数据库设计实例-实时生产效率系统数据库设计
Oracle数据库设计实例-实时生产效率系统数据库设计 引言 1.1 设计前提 某部门经理要求IT部门设计一个流水线实时生产效率系统,用来统计实时的生产量和效率.流水线有数百条,实时间隔为1min. ...
- LeetCode初级算法--设计问题02:最小栈
LeetCode初级算法--设计问题02:最小栈 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...
- 邵国际: C 语言对象化设计实例 —— 命令解析器
本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 邵国际 来源: 微信公众号linux阅码场(id: linuxdev) 内容简介 单片机工程师常常疑惑为什么 ...
- # RESTful登录(基于token鉴权)的设计实例
使用场景 现在很多基于restful的api接口都有个登录的设计,也就是在发起正式的请求之前先通过一个登录的请求接口,申请一个叫做token的东西.申请成功后,后面其他的支付请求都要带上这个token ...
随机推荐
- MinIO客户端之mv
MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc mv 将对象在桶之间移动. 在桶内准备好待移动的文件,检查对象,命令如下: ./mc ls local1/b ...
- Python——第一章:数据类型介绍
数据类型: 区分不同的数据.不同的数据类型应该有不同的操作 数字: 做加减乘除+-*/ 整数,int 小数,float a= 10 #整数 b = 20 print(a + b) #加法运算 c = ...
- k8s环境设置-pod下载及重启策略
k8s环境设置 在我们开始使用k8s之前,我们可以先做一些环境配置,使k8s更加的方便使用 第一个要做的就是kubectl命令的补全 在使用kubectl的时候你会发现参数你是Tab不出来的,这时候我 ...
- tty详解
linux下tty命令详解 [功能] 打印连接到标准输入的终端的文件名. [描述] 命令项: -s, --silent, --quiet: 什么也不打印,只是返回退出状态码. --help: 打印帮助 ...
- MySQL进阶篇:详解存储引擎介绍和基本使用
1. MySQL进阶篇:第一章__一.一_存储引擎介绍和基本使用 1.1 MySQL体系结构 1). 连接层 最上层是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类 ...
- GaussDB(DWS)字符串处理函数返回错误结果集排查
摘要:在使用字符串处理函数时,有时会出现非预期结果的场景.在排除使用问题后,应该从encoding和数据本身开始排查. 本文分享自华为云社区<GaussDB(DWS)字符串处理函数返回错误结果集 ...
- 洞见商业新机,云原生数据库GaussDB让企业决策更科学
摘要:华为云GaussDB(for Redis)为数位科技打造了一个稳定可靠.高效安全.卓越性能的大数据引擎,KV存储降本80%,助力实体企业数字化转型之路走的更加稳健. 本文分享自华为云社区< ...
- 带你了解数仓安全测试的TLS协议
摘要:SSL/TLS协议是业界常用的加密通信协议,通过该协议可以完成通信双方身份认证,会话密钥协商,通信内容加密和完整性保护. 本文分享自华为云社区<GaussDB(DWS)安全测试之TLS协议 ...
- 协同文档:OT与CRDT实现协同编辑笔记
讲协同编辑,先回顾下从BBS.邮件,到IM 信息的异步传播 信息的生产和消费异步发生. 典型的场景如论坛,博客,文档库,邮件.我在写这篇文档的时候,你们看不到.你们看的时候,我早已写完.异步场景下,信 ...
- web自动化测试(1):再谈UI发展史与UI、功能自动化测试
前言(废话) 行文前,安利下文章:<图形界面操作系统发展史--计算机界面发展历史回顾>.<再谈MV*(MVVM MVP MVC)模式的设计原理-封装与解耦> 1973年4月,X ...