AHB2APB 桥

发布时间 2023-03-27 09:47:12作者: luckylan

AHB到APB读写的时序

 

AHB到APB读的时序

 传输在 AHB 上的时刻T1 发起并且地址在T2 被APB 桥采样。如果传输是到外设总线,那么该地址被广播并且产生合适的外设选择信号。在外设总线上的第一个周期成为SETUP周期,当PENABLE 信号被断言后,该周期后跟随着ENABLE 周期。在ENABLE周期期间外设必须提供读数据。通常可能会将要读的数据直接发回到AHB,总线主机在ENABLE周期结束时的时钟上升沿采样该数据,在上图 中为时间T4。在时钟频率很高的系统中可能需要桥在ENABLE周期结束时寄存读数据然后桥在接下来的周期将该数据驱动回AHB总线主机。尽管对外设总线读传输而言这将要求一个额外的等待状态,但这允许AHB运行在较高的时钟频率,这也导致了系统性能的全面提高。下图 表示了一次突发读传输。(图中)所有读传输都要求一个等待状态。

 

AHB突发读传输

 

 AHB到APB写的时序

单个到 AHB 的写传输可以零等待状态发生。APB 桥负责采样传输的地址和数据并在APB 的写传输期间保持这些数据值。

 

 AHB突发写传输

虽然第一个传输可以零等待状态完成,但之后到外设总线的传输将为每个传输的执行要求一个等待状态。APB 桥需要包含两个地址寄存器,以便APB 桥可以采样下一次传输的地址而同时当前传输继续在外设总线上(执行)。

背靠背传输

 

背靠背传输

 传输序列以一个写操作开始,之后跟随着一个读操作,然后是一个写操作,之后是一个读操作。如果一个读传输紧跟在一个写传输之后,那么需要3 个等待状态来完成这次读操作。事实上,在基于处理器的设计中一个写传输后跟随着一个读传输并不经常发生因为处理器将在两个传输之间执行指令预取并且指令存储器不太可能挂接在APB总线上。

 

产生AHB传输有效的标志信号:

ahb_trans_valid=ahb_hsel_i & ahb_hready_i & ahb_htrans_i[1]; //htrans_i[1]代表SEQ或NONSEQ状态,即有传输进行的状态;

3. APB的选通信号
产生APB的选通信号apb_select,如下代码:

当AHB master开启传输时,APB才选通;
HTRANS[1]代表SEQ或NONSEQ状态,即有传输进行的状态;
//------产生APB的sel信号-------
wire apb_sel;//状态机内部的信号
assign apb_sel = HSEL & HREADY & HTRANS[1];
1
2
3
4. ahb slave的地址处理
为了保证AHB 在地址映射时不出错,要对 ahb slave的地址(PADDR)做处理,确保1KB对齐。

//------产生APB的PADDR信号-------
reg [ADDRWIDTH-3:0] addr_reg;//HADDR
assign PADDR = {addr_reg, 2'b00};
//-----锁存控制信号------
always@(posedge HCLK or negedge HRESETn) begin
if(! HRESETn) begin
addr_reg <= 0;
write_reg <=0;
end
else if(apb_select) begin
addr_reg <= HADDR[ADDRWIDTH-1:2];//为了保证地址1KB对齐
write_reg <= HWRITE;
end
end

5. 状态机的描述
状态机的描述,采用三段式描述如下:

/*********************************
*--------==== 状态机 ====------
*********************************/
reg state,next_state;

//状态编码
parameter IDLE = 2'b00;//空闲状态
parameter WAIT = 2'b01;//等待输入数据寄存一拍
parameter SETUP = 2'b10;//传输建立状态,开始传输
parameter ENABLE = 2'b11;//传输完成状态,判断是否有下一次传输继续

always @(state or PREADY or PSLVERR or apb_select or rdata_reg_param or
PCLKEN or wdata_reg_param or HWRITE)
begin
case (state)
IDLE : begin
if (PCLKEN & apb_select & HWRITE)
next_state = WAIT; // 如果是写操作,就寄存一拍
else if (apb_select)
next_state = SETUP; // 如果是读操作,就不寄存
else
next_state = IDLE; // 其他情况则保持IDLE
end

WAIT : begin
if (PCLKEN)
next_state = SETUP; // 寄存一拍后到达SETUP状态,准备开始传输
else
next_state = WAIT; // PCLKEN 没到之前,保持WAIT
end

SETUP : begin
if (PCLKEN)
next_state = ENABLE; //
else
next_state = SETUP; //
end

ENABLE : begin
if (PREADY & PCLKEN & apb_sel)
next_state = SETUP; //如果紧接着还有传输
else if(!apb_sel)
next_state = IDLE;
else //如果此时PREDY为低
next_state = ENABLE; //PCLKEN没到之前,保持ENABLE状态
end

endcase
end

always @(posedge HCLK or negedge HRESETn) begin
if (~HRESETn)
state <= 2'b00;
else
state <= next_state;
end

always @(posedge HCLK or negedge HRESETn) begin
if (~HRESETn)
wdata_reg <= {32{1'b0}};
else if (PCLKEN & sample_wdata_flag)
wdata_reg <= HWDATA;
else
wdata_reg <= wdata_reg;
end
1
6. HREADYOUT信号的产生
HREADYOUT信号的产生,如下:

//-------HREADYOUT信号的产生-------
always @(state or PREADY or PCLKEN) begin
case (state)
IDLE : HREADYOUT = 1'b1;
WAIT : HREADYOUT = 1'b0;
SETUP : HREADYOUT = 1'b0;
ENABLE : HREADYOUT = PREADY & PCLKEN;
endcase
end

7. 返回给AHB的信号
返回给AHB的信号,如下:

//------返回给AHB的信号-------
assign HRDATA = PRDATA;
assign HRESP = 1'b0;

8. APB信号的生成
传递给APB的信号,如下:

//------产生APB的信号-------
wire apb_sel;//状态机内部的信号
reg [ADDRWIDTH-3:0] addr_reg;//HADDR
reg write_reg;//HWRITE

assign apb_sel = HSEL & HREADY & HTRANS[1];
assign PADDR = {addr_reg, 2'b00};
assign PWRITE = write_reg;
assign PWDATA = wdata_reg;
assign PSEL = (state == SETUP) | (state == ENABLE);
assign PENABLE = (state == ENABLE);
assign PSLVERR = 1'b0;
assign APBACTIVE = (HSEL & HTRANS[1]) | (state != 2'b00);