您的位置 首页 软件

根据FPGA的跨时钟域信号处理——专用握手信号

在逻辑设计领域,只涉及单个时钟域的设计并不多。尤其对于一些复杂的应用,FPGA往往需要和多个时钟域的信号进行通信。异步时钟域所涉及的两个时钟之间可能存在相位差,也可能没有任何频率关系,即通常所说的

  在逻辑规划范畴,只触及单个时钟域的规划并不多。特别关于一些杂乱的运用,FPGA往往需要和多个时钟域的信号进行通讯。异步时钟域所触及的两个时钟之间或许存在相位差,也或许没有任何频率联系,即一般所说的不同频不同相。

  图1是一个跨时钟域的异步通讯实例,发送域和接纳域的时钟别离是clk_a和clk_b。这两个时钟频率不同,而且存在必定的相位差。关于接纳时钟域而言,来自发送时钟域的信号data_a2b有或许在任何时刻改变。

  

点击看大图

 

  图1 跨时钟域通讯

  关于上述的异步时钟域通讯,规划者需要做特别的处理以保证数据牢靠的传输。因为两个异步时钟域的频率联系不确定,触发器之间的树立时刻和坚持时刻要求也无法得到保证。假如呈现树立时刻或许坚持时刻违规,接纳域将会采样到处于亚稳态数据,那么结果可想而知。

  怎么有用的进行跨时钟域的信号传输呢?最根本的思维是同步,在这个基础上规划者可以运用各种协议约好进行通讯。单向操控信号检测办法(前面提到过的脉冲信号检测办法,这儿为了和握手办法相差异,所以如此称号)、握手协议的办法或许凭借存储器的办法都是比较常用的处理手法。

  本文将要点介绍握手办法进行异步时钟域的通讯。

  图2是一个根本的握手通讯办法。所谓握手,意即通讯两边运用了专用操控信号进行状况指示。这个操控信号既有发送域给接纳域的,也有接纳域给发送域的,有别于前面的单向操控信号检测办法。

  

点击看大图

 

  图2 握手通讯原理

  运用握手协议办法处理跨时钟域数据传输,只需要对两边的握手信号(req和ack)别离运用脉冲检测办法进行同步。在详细完结中,假定req、ack、data总线在初始化时都处于无效状况,发送域先把数据放入总线,随后发送有用的req信号给接纳域。接纳域在检测到有用的req信号后锁存数据总线,然后回送一个有用的ack信号表明读取完结应对。发送域在检测到有用ack信号后吊销当时的req信号,接纳域在检测到req吊销后也相应吊销ack信号,此刻完结一次正常握手通讯。尔后,发送域可以持续开端下一次握手通讯,如此循环。该办法可以使接纳到的数据安稳牢靠,有用的避免了亚稳态的呈现,但操控信号握手检测会耗费通讯两边较多的时刻。以上所述的通讯流程如图3所示。

  

点击看大图

 

  图3 握手通讯流程

  下面经过一个简略的工程代码及其仿真测验进一步加深我们对根本握手协议的知道。

  module handshack(

  clk,rst_n,

  req,datain,ack,dataout

  );

  input clk; //50MHz体系时钟

  input rst_n; //低电平复位信号

  input req; //恳求信号,高电平有用

  input[7:0] datain; //输入数据

  output ack; //应对信号,高电平有用

  output[7:0] dataout;//输出数据,首要用于调查是否和输入共同

  //————————————–

  //req上升沿检测

  reg reqr1,reqr2,reqr3;

  always @(posedge clk or negedge rst_n)

  if(!rst_n) begin

  reqr1 <= 1’b1;

  reqr2 <= 1’b1;

  reqr3 <= 1’b1;

  end

  else begin

  reqr1 <= req;

  reqr2 <= reqr1;

  reqr3 <= reqr2;

  end

  //pos_req2比pos_req1拖延一个时钟周期,保证数据被安稳锁存

  wire pos_req1 = reqr1 & ~reqr2; //req上升沿标志位,高有用一个时钟周期

  wire pos_req2 = reqr2 & ~reqr3; //req上升沿标志位,高有用一个时钟周期

  //————————————–

  //数据锁存

  reg[7:0] dataoutr;

  always @(posedge clk or negedge rst_n)

  if(!rst_n) dataoutr <= 8’h00;

  else if(pos_req1) dataoutr <= datain; //检测到req有用后锁存输入数据

  assign dataout = dataoutr;

  //————————————–

  //发生应对信号ack

  reg ackr;

  always @(posedge clk or negedge rst_n)

  if(!rst_n) ackr <= 1’b0;

  else if(pos_req2) ackr <= 1’b1;

  else if(!req) ackr <= 1’b0;

  assign ack = ackr;

  endmodule

  该实例的verilog代码模拟了握手通讯的接纳域,其仿真波形如图4所示。在发送域恳求信号(req)有用的若干个时钟周期后,先是数据(datain)被有用锁存了(dataout),然后接纳域的应对信号(ack)也处于有用状况,尔后发送域吊销恳求信号,接纳域也跟着吊销了应对信号,由此完结一次通讯。

  

点击看大图

 

  图4 握手通讯仿真波形

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/116984.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部