yhzhangstrive的个人空间 https://blog.eetop.cn/280659 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

跨时钟域设计【三】—— 数据同步

已有 1986 次阅读| 2013-4-1 20:09 |个人分类:FPGA

前面介绍了项目中用到的脉冲同步的基本方法,其基本功能是从某个时钟域取出一个单时钟宽度脉冲,然后在新的时钟域中建立另一个单时钟宽度的脉冲,但在实际应用中,需要同步的往往不止是脉冲信号,数据总线、地址总线和控制总线都有可能跨域传输握手协议,RAM和FIFO是最基本的方法,但如果FPGA资源成为关键因素时,这些方法不一定是最好的方法。这里介绍另外一种方法——Toggle法(已经在项目中运用),适合快时钟域到慢时钟域传输数据。

假如Data是时钟域clkA(20MHz)的数据,需要同步到时钟域clkB(80MHz),我们可以在时钟域A产生一个Toggle信号,为clkA的2分频,然后把Toggle信号同步到clkB,并且在Toggle的上升沿和下降沿去捕获数据,这样能够保证Toggle信号的上升沿和下降沿采集到的是相邻的两个数据,并且数据不会丢失。该方法的Verilog HDL如下:

module DataSync(
input rst_n,
input clkA,
input clkB,
input [7:0] Data,

output reg [7:0] Data_sync
);

reg toggle;
reg toggle_d;
reg toggle_dd;
reg toggle_ddd;
wire toggle_edge;

always @ (posedge clkA or negedge rst_n)
   if(!rst_n)
      toggle <= 1'b0;
   else
      toggle <= ~toggle;
    
always @ (posedge clkB or negedge rst_n)
   if(!rst_n)
   begin
      toggle_d <= 1'b0;
      toggle_dd <= 1'b0;
      toggle_ddd <= 1'b0;
   end
   else
   begin
      toggle_d <= toggle;
      toggle_dd <= toggle_d;
      toggle_ddd <= toggle_dd;
   end
   
always @ (posedge clkB or negedge rst_n)
   if(!rst_n)
      Data_sync <= 8'h00;
   else if(toggle_dd ^ toggle_ddd)
      Data_sync <= Data;
      
endmodule
 这种方法应用范围有限,实际应用中还得具体问题具体分析。 


点赞

发表评论 评论 (1 个评论)

回复 xiaohuozi 2013-4-10 09:36
:handshake 也用过

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 0

    好友
  • 4

    获赞
  • 6

    评论
  • 2422

    访问数
关闭

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

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

GMT+8, 2024-4-25 22:53 , Processed in 0.023953 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部