在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2750|回复: 4

[求助] 求助,关于ICG和跨时钟域同步

[复制链接]
发表于 2018-7-9 16:41:54 | 显示全部楼层 |阅读模式
100资产
上一个帖子,弄错了,点成售卖信元了,实际上是求助

内容如下:

最近参与一颗对功耗极为敏感的芯片项目,希望用ICG单元+寄存器实现低时钟翻转的跨时钟域同步

目标是检测A时钟域上脉冲,并且在B时钟域上输出一个周期的脉冲信号,采用握手机制

不限制A时钟域上脉冲的长度,且A时钟一直有,但要求B时钟域上翻转尽量少


实在倍感困惑,请大神指教

发表于 2018-7-10 19:36:38 | 显示全部楼层
你的诉求只是这个握手设计电路的B时钟域门控吗?还是握手后的B时钟域门控,感觉如果单独只是做握手电路的B时钟域门控,功耗收益也不大呀,异步处理是不可能门控,最多就是B 时钟域产生握手信号的那个D触发器被握手的上下沿门控,整体看没有太大收益啊,主要能够被门控的寄存器太少
 楼主| 发表于 2018-7-11 08:37:34 | 显示全部楼层
回复 2# rosshardware

是希望握手电路中的B时钟域上使用的寄存器的时钟都是经过门控的
可不可以直接用A时钟域上的脉冲信号作为B时钟域上的ICG的使能,再用输出时钟去对A时钟域上的脉冲进行同步,类似于这样的思路
发表于 2018-7-12 15:57:49 | 显示全部楼层
回复 3# wangyu135792


    不是这个意思,仍然需要通过B时钟域与A握手,生产一个握手脉冲,通过握手脉冲来实现对B时钟域的门控,写一段代码给你示意:

A时钟域对B的握手指示信号处理:

reg   b_cap_a_ack_flag;  // From B clk domain, indicating b clk domain has captured flag signals from A

reg   b_cap_a_ack_flag_sync0;
reg   b_cap_a_ack_flag_sync1;

reg   b_cap_a_ack_flag_sync2;



reg   event_a;  // Event from A clk domain
reg   a_to_b_flag; // handshake valid signal from A clk domain to B clk domain

always @(posedge clka or negedge rst_a_n) begin
       if (rst_a_n == 1'b0) begin
              b_cap_a_ack_flag_sync0 <= 1'b0;
              b_cap_a_ack_flag_sync1 <= 1'b0;

              b_cap_a_ack_flag_sync2 <= 1'b0;

       end
       else begin
              b_cap_a_ack_flag_sync0 <= b_cap_a_ack_flag;

              b_cap_a_ack_flag_sync1 <=
b_cap_a_ack_flag_sync0
;

              b_cap_a_ack_flag_sync2 <=
b_cap_a_ack_flag_sync1
;



       end
end

always @(posedge clka or negedge rst_a_n) begin

       if (rst_a_n == 1'b0) begin

              a_to_b_flag <= 1'b0;

       end

       else begin

             if ((event_a == 1'b1) && (
b_cap_a_ack_flag_sync2 == 1'b0)
) begin

                  a_to_b_flag <= 1'b1;

             end

             else if (b_cap_a_ack_flag_sync2 == 1'b1) begin

                  
a_to_b_flag <= 1'b0;

             end
            


       end

end


B
时钟域对A的握手指示信号处理:

reg   a_to_b_flag_sync0;

reg   a_to_b_flag_sync1;

reg   a_to_b_flag_sync2;

reg   b_is_idle;



reg   clkb_gate_en;



always @(posedge clkb or negedge rst_b_n) begin

       if (rst_b_n == 1'b0) begin

              
a_to_b_flag_sync0
<= 1'b0;

              
a_to_b_flag_sync1
<= 1'b0;

              
a_to_b_flag_sync
2 <= 1'b0;

       end

       else begin

              
a_to_b_flag_sync0
<= a_to_b_flag;

              
a_to_b_flag_sync1
<=
a_to_b_flag_sync0
;

              
a_to_b_flag_sync
2 <=
a_to_b_flag_sync1
;



       end

end


always @(posedge clkb or negedge rst_b_n) begin

       if (rst_b_n == 1'b0) begin

              b_cap_a_ack_flag <= 1'b0;

       end

       else begin

             if ((a_to_b_flag_sync2 == 1'b1) && (b_is_idle == 1'b1)) begin

                  
b_cap_a_ack_flag
<= 1'b1;

             end

             else if (
a_to_b_flag_sync2 == 1'b0
) begin

                  
a_to_b_flag <= 1'b0;

             end
            


       end

end



always @(posedge clkb or negedge rst_b_n) begin

       if (rst_b_n == 1'b0) begin

              clkb_gate_en <= 1'b0;

       end

       else begin

             if ((a_to_b_flag_sync2 == 1'b1) && (
b_cap_a_ack_flag
== 1'b1)) begin

                 
  clkb_gate_en <= 1'b1;

             end

             else begin

                  
clkb_gate_en <= 1'b0;

             end
            


       end

end






用clkb_gate_en 作B时钟域的ICG的使能即可



发表于 2018-7-13 10:57:54 | 显示全部楼层
mark 一下, 这么细致的低功耗。 感觉楼主的意思似乎是 握手逻辑 的那些DFF也做成ICG控制的, 这个是做不到的,因为你不知道A时钟域脉冲产生的电平什么时候过来B时钟域。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 02:06 , Processed in 0.019362 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表