美文网首页
跨时钟域的处理方法(2)-数据的同步之握手协议

跨时钟域的处理方法(2)-数据的同步之握手协议

作者: 罐头说 | 来源:发表于2019-12-05 23:42 被阅读0次
握手协议

使用握手信号“xreq”和“yack”,“系统x”将数据发送给“系统y”。下面是使用握手信号传输数据的例子。

1)     发送器“系统x”将数据放在数据总线上并发出“xreq”(请求)信号,表示有效数据已经发到接收器“系统y”的数据总线上。

2)    采用两级D触发器缓存,把“xreq”信号同步到接收器的时钟域“yclk”上,得到“yreq2”信号,当采样到yreq2有效后,将数据锁存到系统y的总线上,同时接收器发出“yack”信号(相应信号)。

3) 发送器接收到接收器发送来的“yack”信号,然后将“yack”信号同步到“xclk”时钟域上,同步的原理同上,采用两级的D触发器采样,采样时钟为“xclk”,得到同步后的“xack2”信号,xclk时钟采样到“xack2”有效后,发出下一个数据,同时让“xreq”有效一个时钟(xclk)。

握手过程的时序图

module  handshake_y(clky, rst_n_y, xdata, xreq, yack);

input         clky;

input         rst_n_y;

input[7:0]     xdata;

input         xreq;

output        yack;

reg[7:0]      ydata;

reg yreq1, yreq2;

always@(posedgeclky or negedge rst_n_y)

begin

   if(!rst_n_y) yreq1 <= 1'b0;

   else       yreq1 <= xreq;

end

always@(posedgeclky or negedge rst_n_y)

begin

   if(!rst_n_y) yreq2 <= 1'b0;

   else       yreq2 <= yreq1;

end

always@(posedgeclky or negedge rst_n_y)

begin

   if(!rst_n_y)   ydata <= 8'h00;

   else if(yreq2) ydata <= xdata;

   else         ydata <= ydata;

end

always@(posedgeclky or negedge rst_n_y)

begin

   if(!rst_n_y)   yack <= 1'b0;

   else if(yreq2) yack <= 1'b1;

   else        yack <= 1'b0;

end

endmodule

//////////////////////////////////////////////////////////////////////////////////////

module  handshake_x(clkx, yack, rst_n_x, xreq, xdata);

input         clkx;

input         yack;

input         rst_n_x;

output        xreq;

output[7:0]    xdata;

reg xack1,xack2;

always@(posedgeclkx or negedge rst_n_x)

begin

   if(!rst_n_x) xack1 <= 1'b0;

   else        xack1 <= yack;

end

always@(posedgeclkx or negedge rst_n_x)

begin

   if(!rst_n_x) xack2 <= 1'b0;

   else        xack2 <= xack1;

end

always@(posedgeclkx or negedge rst_n_x)

begin

   if(!rst_n_x)   data <= 8'h00;

   else if(xack2) data <= data + 1;

   else           data <= data;

end

always@(posedgeclkx or negedge rst_n_x)

begin

   if(!rst_n_x)   xdata <= 8'h00;

   else if(xack2) xdata <= data;

   else           xdata <= xdata;

end

always@(posedgeclkx or negedge rst_n_x)

begin

   if(!rst_n_x)   xreq <= 1'b0;

   else if(xack2) xreq <= 1'b1;

   else           xreq <= 1'b0;

end

endmodule

////////////////////////////////////////////////////////////////////////////

module tb;

regclkx;

regclky;

regrst_n_x;

regrst_n_y;

initial

begin

clkx =1'b0;

clky =1'b0;

rst_n_x= 1'b0;

rst_n_y= 1'b0;

# 100;

rst_n_x= 1'b1;

rst_n_y= 1'b1;

end

always#5 clkx = ~clkx;

always#6 clky = ~clky;

handshake_x  x1(  // transmiter

.clkx(clkx),//in

.yack(yack);//in

.rst_n_x(rst_n_x);//in

.xreq(xreq);//out

.xdata(xdata);//out

);

handshake_y  y1( //receiver

.clky(clky),//in

.rst_n_y(rst_n_y),//in

.xdata(xdata),//in

.xreq(xreq),//in

.yack(yack)//out

);

endmodule

相关文章

  • 跨时钟域的处理方法(2)-数据的同步之握手协议

    使用握手信号“xreq”和“yack”,“系统x”将数据发送给“系统y”。下面是使用握手信号传输数据的例子。 1)...

  • 无题

    时序分析STA,时序约束UCF 跨时钟域,亚稳态处理 同步/异步FIFO 状态机 复位 异步时钟切换 仿真 代码:...

  • 跨时钟域的处理方法(1)-控制信号的同步

    在设计中,如果将一个异步信号直接送给若干个并行工作的触发器,就会大大增加亚稳态事件发生的概率,因为有可能有多...

  • 数字IC

    https://zhuanlan.zhihu.com/p/29642469 (1)信号的跨时钟域同步。包括单比特和...

  • 单bit跨时钟域同步电路设计

    做个假设:需要将100M时钟下的脉冲同步到1M的时钟域下,如果按照打拍的方式,需要延展100拍后再进行跨时钟域才能...

  • AJAX入门

    处理跨域的主要方法 JSONP CORS本文主要讨论CORS解决AJAX因为浏览器同源策略不能跨域请求数据的问题。...

  • web跨域解决方案

    围绕以下几点介绍: 什么是跨域? 常用的几种跨域处理方法? crossdomain.xml解决跨域问题 什么是跨域...

  • 关于设置env等环境变量的思考

    1、如何处理跨域后台处理跨域前端处理跨域浏览器处理跨域 前端本地处理跨域:代理线上跨域的处理方式:Nginx反向代...

  • 跨域和跨域资源共享 CORS

    1. 跨域 跨域指域名、协议、端口至少有一个不同 2. 跨域资源共享

  • 一个小例子学习JSONP的基本使用

    在JavaScript中Ajax是无法跨域的,当协议或者域名或者端口任一不同时,都会出现跨域,跨域处理的其中一种方...

网友评论

      本文标题:跨时钟域的处理方法(2)-数据的同步之握手协议

      本文链接:https://www.haomeiwen.com/subject/oefsgctx.html