AXI_BVALID/AXI_BREADY的异步处理
AXI_BVALID/AXI_BREADY的异步处理本质上是单比特信号的异步处理,但其对持续总cycle数也需要保持一致。并且需要考虑到VALID/READY的握手关系。
思路是用一个计数器对源时钟域的A_AXI_BVALID&A_AXI_BREADY做计数,然后转换成格雷码,再同步到目标时钟域去,再转换成顺序计数码,在目标时钟域根据B_AXI_BREADY生成对应的B_AXI_BVALID。同时需要注意把目标时钟域的计数器反过来同步到源时钟域,判断存储的bvalid个数即将满的时候把A_AXI_BREADY拉低,需要预留一定的反向同步时间。
以下是RTL代码:
module bvalid_sync(
input a_axi_rstn,
input a_axi_clk,
input a_axi_bvalid,
output a_axi_bready,
input b_axi_rstn,
input b_axi_clk,
input b_axi_bready,
output b_axi_bvalid
);
reg [3:0] cnt_a_axi_bvalid;
always @ (posedge a_axi_clk)
begin
if (a_axi_rstn == 0)
cnt_a_axi_bvalid <= 'd0;
else if (a_axi_bvalid & a_axi_bready)
cnt_a_axi_bvalid <= cnt_a_axi_bvalid + 'd1;
end
function [3:0] bin2gray;
input [3:0] data_bin;
begin
bin2gray[3] = data_bin[3];
bin2gray[2] = data_bin[3]^