AHB APB 简单通讯架构 代码 AHB_Arbiter

在这里插入图片描述

仲裁器

module AHB_Arbiter(
input wire HRESETn,
input wire HCLK,input wire [3:0] HBUSREQx,
output reg [3:0] HGRANTx,input wire [31:0] HADDR,
input wire HREADY,
input wire HKGrant,
output reg [3:0] HMASTER
);reg [1:0] State_A;
reg [3:0] REQi;
reg [3:0] GRANTo;
reg [3:0] GRANT_nx;// roll the Input Request , and roll back for Output Grant next state
always @(*)
begincase (State_A)    //     Roll right                               Roll left2'b00:  begin REQi =  HBUSREQx[3:0];                  GRANT_nx =   GRANTo[3:0];  end2'b01:  begin REQi = {HBUSREQx[0]  , HBUSREQx[3:1]};  GRANT_nx =  {GRANTo[2:0], GRANTo[3]};   end2'b10:  begin REQi = {HBUSREQx[1:0], HBUSREQx[3:2]};  GRANT_nx =  {GRANTo[1:0], GRANTo[3:2]}; end2'b11:  begin REQi = {HBUSREQx[2:0], HBUSREQx[3]};    GRANT_nx =  {GRANTo[0]  , GRANTo[3:1]}; enddefault:begin REQi =  HBUSREQx[3:0];                  GRANT_nx =   GRANTo[3:0];  endendcase
end
// fixed arbiter
always @(*)
begincasex(REQi)4'bxxx1:  GRANTo = 4'b0001;4'bxx10:  GRANTo = 4'b0010;4'bx100:  GRANTo = 4'b0100;4'b1000:  GRANTo = 4'b1000;default:  GRANTo = 4'b0000;endcase
end// GRANT the master when there is no grant
assign allowGrant = (HGRANTx == 4'h0);
always @(posedge HCLK or negedge HRESETn)
beginif(!HRESETn)    HGRANTx <= 4'h0;else            HGRANTx <= HKGrant ? 4'h0 : allowGrant ? GRANT_nx : HGRANTx;
end// Decode when HREADY
always @(posedge HCLK or negedge HRESETn)
beginif(!HRESETn)  HMASTER <= 4'h0;else if(HREADY)case(HGRANTx)4'b0001:  HMASTER <= 4'h0;4'b0010:  HMASTER <= 4'h1;4'b0100:  HMASTER <= 4'h2;4'b1000:  HMASTER <= 4'h3;default:  HMASTER <= 4'h0; endcase       
end// change inside state
always @(posedge HCLK or negedge HRESETn)
beginif(!HRESETn)      State_A <= 2'h0;else if (HKGrant) State_A <= State_A + 1;  
endendmodule


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部