握手协议打拍

在芯片中常常用到握手协议中vaild或者ready延迟过大,此时需要对握手协议进行打拍。但打拍不能简单的拿寄存器打一拍。

前向打拍

如果对valid和数据打拍,那么就是前向打拍

复制代码
module cmm_streamPipeForward(
input clk,
input rst_n,
input slv_rvalid,
output slv_ready,
input [1:0] data,

output mst_valid,
output [1:0] mst_data,
input  mst_ready);

reg pipe_valid;
reg [1:0] pipe_data;

always@(posedge clk or negedge rst_n)
  begin
  if(~rst_n)
    begin
    pipe_valid <= 1'b0;
    pipe_data  <= 2'b0;
    end
  else
    begin
    if(slv_ready)
      begin
      pipe_valid <= slv_valid;
      pipe_data <= slv_data;
      end
    end
  end


assign mst_valid = pipe_valid;
assign mst_data = pipe_data;
assign slv_ready = pipe_valid ? mst_ready :1'b1;



endmodule 

后向打拍

后向打拍主要针对ready打拍。因为ready打拍,延迟一拍,所以内部也要缓存一笔数据。

复制代码
module cmm_straemPipeBackward(
  input  clk,
  input rst_n,
  input slv_valid,
  output slv_ready,
  input [1:0] data,
  output mst_valid,
  output [1:0] mst_data,
  input  mst_ready
);

reg pipe_ready;
reg pipe_data

always@(posedge clk or negedge rst_n)
  begin
  if(!rst_n)
    begin
    pipe_ready <=1'b1;
    pipe_data <=2'b0;
    end
  else
   begin
   if(slv_valid)
     begin
     pipe_ready <= 1'b0; 
     end
   if(mst_ready)
     begin
     pipe_ready <= 1'b1;
     end
    
   if(slv_ready)
     begin
     pipe_data <=slv_data;
     end
   end
  end


assign slv_ready = pipe_ready;
assign mst_valid = slv_valid ||(!pipe_ready);
assign mst_data = pipe_data;




endmodule

如果双边都要打拍,那么就需要加一个前向然后再加一个后向,组合起来。

相关推荐
阿豪学编程2 小时前
【Linux】网络基础
网络
Anthony_2312 小时前
五、交换技术与VLAN
服务器·网络·网络协议·http·https·udp·信息与通信
梁洪飞3 小时前
使用rockchip sdk提供的uboot调通网络
linux·网络·arm开发·嵌入式硬件·arm
fanruitian3 小时前
k8s 创建service 暴漏集群ip
服务器·网络·kubernetes
Ar呐3 小时前
HCIP-Datacom-Core Technology~OSPF特殊区域及其他特性
网络
yingzicat3 小时前
华为和华三交换机和路由器时间配置
网络·华为
橘颂TA3 小时前
【Linux 网络】从理论到实践:IP 协议的报头分析与分段技术详解
linux·运维·服务器·网络·tcp/ip
那就回到过去3 小时前
PIM-DM嫁接机制
运维·服务器·网络·智能路由器·pim·ensp
CS创新实验室4 小时前
《计算机网络》深入学:以太网交换机原理与应用
服务器·网络·计算机网络·以太网·以太交换机