verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波

上传人:ni****g 文档编号:496531871 上传时间:2022-09-25 格式:DOC 页数:18 大小:68.50KB
返回 下载 相关 举报
verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波_第1页
第1页 / 共18页
verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波_第2页
第2页 / 共18页
verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波_第3页
第3页 / 共18页
verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波_第4页
第4页 / 共18页
verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波》由会员分享,可在线阅读,更多相关《verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波(18页珍藏版)》请在金锄头文库上搜索。

1、Verilog 基本电路设计(包括:时钟域同步、无缝切换、步 FIFO 、去抖滤波) )Verilog 基本电路设计共包括四部分:单 bit 跨时钟域同步时钟无缝切换异步 FIFO 去抖滤波Verilog 基本电路设计之一 : 单 bit 跨时钟域同步 (帖子链接: )看到坛子里不少朋友, 对于基本数字电路存在这样那样的疑惑,本人决定开贴,介 绍数字电路最常见的模块单元,希望给初学者带来帮助,也 欢迎大佬们前来拍砖。如果想要做数字设计,下面这些电路 是一定会碰到的,也是所有大型 IP , SOC 设计必不可少的 基础,主要包括异步信号的同步处理, 同步 FIFO ,异步 FIFO , 时钟无

2、缝切换,信号滤波 debounce 等等,后面会根据大家 反馈情况再介绍新电路。 首先介绍异步信号的跨时钟域同步问题。一般分为单 bit 的 控制信号同步,以及多 bit 的数据信号同步。多 bit 的信号同 步会使用异步 FIFO 完成, 而单 bit 的信号同步, 又是时钟无 缝切换电路以及异步 FIFO 电路的设计基础,这里先介绍单 bit 信号同步处理。clka 域下的信号 signal_a ,向异步的 clkb 域传递时, 会产生 亚稳态问题。所有的亚稳态,归根结底就是 setup/hold 时间 不满足导致。在同一个时钟域下的信号,综合以及布线工具 可以在 data 路径或者 cl

3、ock 路径上插入 buffer 使得每一个 DFF 的 setup/hold 时间都满足;但是当 signal_a 在 clkb 域 下使用时,由于 clka 与 clkb 异步,它们的相位关系不确定, 那么在 clkb 的时钟沿到来时, 无法确定 signal_a 此时是否处 于稳定无变化状态,也即 setup/hold 时间无法确定,从而产 生亚稳态。这种异步信号在前后端流程里面是无法做时序分 析的,也就是静态时序分析里常说的 false_path 。 消除亚稳态, 就是采用多级 DFF 来采样来自另一个时钟域的 信号,级数越多,同步过来的信号越稳定。对于频率很高的 设计,建议至少用三级

4、 DFF ,而两级 DFF 同步则是所有异 步信号处理的最基本要求。单 bit 的信号跨时钟域同步,又分成电平信号同步以及脉冲 信号同步。 电平信号, 就是说 clka 下的信号 signal_a 在 clkb 看来,是一个很宽的信号,会保持多个 clkb 的时钟周期,一 定能被 clkb 采到。这种情况,只需要使用 clkb 用至少两级 DFF 连续抓 signal_a 即可,特别需要强调的是, 此时 signal_a 必须是 clka 下的寄存器信号,如果 signal_a 是 clka 下的组 合逻辑信号,一定要先在 clka 下用 DFF 抓一拍,再使用两 级 DFF 向 clkb 传

5、递。这是因为 clka 下的组合逻辑信号会有 毛刺,在 clka 下使用时会由 setup/hold 时间保证毛刺不会被 clka 采到,但由于异步相位不确定,组合逻辑的毛刺却极有 可能被 clkb 采到。 电平信号的同步处理, 一般用于知道确定 的时钟频率大小关系或者极慢时钟下的信号向极快时钟域 传递时使用,简单处理如下: always (posedge clkb or negedge rst_n)beginif (!rst_n) beginlevl_b_d1levl_b_d2levl_b_d3endelse beginlevl_b_d1levl_b_d2levl_b_d3endendass

6、ign puls_b_pos = levl_b_d2 & (levl_b_d3);assign puls_b_neg = levl_b_d3 & (levl_b_d2);assign levl_b_out = levl_b_d2; 上面三个输出分别是经过同步之后, clkb 下可以使用的 0 变 1 脉冲信号, 1 变 0 脉冲信号以及电平信号。再次强调:levl_a_in 必须是 clka 的 DFF 信号!下面是更常见的, clka下的脉冲信号,同步到clkb 时钟域下,它对于 clka 与 clkb的时钟频率关系没有任何限制,快到慢,慢到快都没问题。 其主要原理就是先把脉冲信号在 clk

7、a 下展宽,变成电平信号, 再向 clkb 传递,当确认 clkb 已经“看见”信号同步过去之后, 再清掉 clka 下的电平信号。 脉冲信号同步处理电路, 有两个 地方使用了上面的电平信号同步处理原则,请仔细揣摩原因。 详细见下面的 RTL ,其中省略了信号定义声明: module sync_pulse (/ inputrst_n,/ system resetclka,/ clockAclkb,/ clockBpuls_a_in,/ pulse input from clka/ outputpuls_b_out, / pulse output in clkblevl_b_out / leve

8、l output in clkb);parameter DLY =1; /always (posedge clkaor negedge rst_n) beginif (rst_n = 1b0)signal_aelse if (puls_a_in)signal_aelse if (signal_b1_a2)signal_aelse ;endalways (posedge clkb or negedge rst_n) beginif (rst_n = 1b0)signal_belsesignal_bendalways (posedge clkb or negedge rst_n) beginif

9、(rst_n = 1b0) beginsignal_b_b1signal_b_b2endelse beginsignal_b_b1signal_b_b2endendalways (posedge clka or negedge rst_n)beginif (rst_n = 1b0) beginsignal_b1_a1 signal_b1_a2 end else beginsignal_b1_a1signal_b1_a2endendassign puls_b_out = signal_b_b1 & (signal_b_b2) ;assign levl_b_out = signal_b_b1 ;e

10、ndmodule 下一篇讲时钟切换电路。留下一个思考题: clka 下的同一个 寄存器信号 signal_a ,电平宽度对 clkb 而言足够长, 如果同 时调用两个相同的电平同步模块向 clkb 时钟传递, 分别得到 levl_b1 和 levl_b2 ,那么在 clkb 时钟域下看到的 lev_b1 和 levl_b2 信号是否一样? 这个问题是实际设计中一不小心就会犯错的,如果能够想明 白正确回答这个问题,异步信号的理解就可以过关了。Verilog 基本电路设计之二: 时钟无缝切换(帖子链接:http:/ )时钟切换分成 两种方式,普通切换和去毛刺无缝切换。普通切换,就是不 关心切出的时

11、钟是否存在毛刺,这种方式电路成本小。如果 时钟切换时,使用此时钟的模块电路处于非工作状态,或者 模块内电路被全局复位信号 reset 住的,即使切出毛刺也不 会导致 DFF 误触发,这样的模块可以选择用此种切换方式。 写法很简单 assign clk_o = sel_clkb ? clkb : clka , 当 sel_clkb 为 1 时选择 clkb ,否则选择 clka 。不过在实际设计 中,建议直接调用库里的 MUX 单元 set_dont_touch ,不要 采用这里的 assign 写法,因为这种写法最后综合得到的可能 不是 MUX 而是复杂组合逻辑,给前后端流程的时钟约束和 分析

12、带来不便。 无缝切换, 就是切换时无毛刺时钟平稳过渡。 在时钟切换中,只要出现比 clka 或者 clkb 频率更高的窄脉 冲,不论是窄的高电平还是窄的低电平,都叫时钟毛刺。工 作在切换后时钟 clk_o 下的电路模块,综合约束是在 maxclka,clkb 频率下的, 也就是说设计最后 signoff 的时候, 只保证电路可以稳定工作的最高频率是 maxclka,clkb, 如果 切换中出现更高频的时钟毛刺,电路可能出现无法预知的结 果而出错。无缝切换,一般用在处于工作状态的模块需要调 频或者切换时钟源, 比如内部系统总线, CPU 等。你刚用手 机打完游戏后马上关屏听音乐, 这两种场景中,

13、 CPU 在满足 性能前提下为了控制功耗,其工作频率会动态地从很高调至 较低,此时就可能是在 CPU 一直处于工作状态下,通过无缝切换时钟源头实现的。在无缝切换电路中,切换信号sel_clkb 可以是任意时钟域下的信号, 包括但不限于 clka 或 者 clkb 域,但是 sel_clkb 必须是一个 DFF 输出信号; clka 与 clkb 的频率大小相位关系可以任意。 无缝切换需要解决两 个问题,一是异步切换信号的跨时钟域同步问题,这里需要 使用 Verilog 基本电路设计之一 里的同步电路原理消除亚 稳态;二是同步好了的切换信号与时钟信号如何做逻辑,才 能实现无毛刺。下面写出无缝切换

14、电路的主体部分,忽略了 内部信号的定义声明等。module clk_switch (rst_n, clka, clkb, sel_clkb, clk_o);always (posedge clka or negedge rst_n) beginif (!rst_n) beginsel_clka_d0sel_clka_d1endelse beginsel_clka_d0sel_clka_d1endend/ part2/always (posedge clka_n or negedge rst_n) always (posedge clka or negedge rst_n) beginif (!

15、rst_n) beginsel_clka_dly1sel_clka_dly2sel_clka_dly3endelse beginsel_clka_dly1sel_clka_dly2sel_clka_dly3endend/ part3/always (posedge clkb_n or negedge rst_n) always (posedge clkb or negedge rst_n) beginif (!rst_n) beginsel_clkb_d0sel_clkb_d1endelse beginsel_clkb_d0sel_clkb_d1endend/ part4/always (posedge clkb_n or negedge rst_n) always (posedge clkb or negedge rst_n) beginif (!rst_n) beginsel_clkb_dly1sel_clkb_dly2sel_clkb_dly3endelse begin

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号