AHB---slave响应信号

1. slave传输响应

一旦master开始传输,slave就控制着传输的进展。master一旦开始传输就不能取消。

当slave被访问时,必须提供一个响应,以指示传输的状态。传输状态由HRESP信号提供。

表5-1表明,完整的传输响应是HRESP和HREADYOUT信号的组合。

 表5-1 HRESP信号响应

HRESP响应描述
0OKAY传输已成功完成,或者slave需要额外的周期来完成请求。HREADYOUT信号指示传输是待定还是已完成。
1ERROR在传输过程中发生了错误。必须将错误条件信号给master,以便它知道传输未成功。对于错误条件,需要两个周期的响应,在第二个周期中HREADYOUT被断言。

表5-2 基于HRESP和HREADYOUT信号状态的完整传输响应

                                        HREADYOUT
HRESP01
0传输待定传输成功完成
1错误响应,第一周期错误响应,第二周期

这意味着slave可以通过以下三种方式完成传输:

  1. 立即完成传输。
  2. 标记一个错误以指示传输失败。
  3. 插入一个或多个等待状态以使传输能够完成。

1.1 传输完成 (Transfer done)

       当HREADY为高电平(HIGH)并且HRESP为OKAY时,表示一个传输已经成功完成。

1.2 传输待定 (Transfer pending)

一个典型的slave使用HREADYOUT来插入适当数量的等待状态到传输的数据阶段。然后,传输以HREADYOUT为高电平和一个OKAY响应来完成,以指示传输成功完成。

当slave在完成响应之前插入一定数量的等待状态时,它必须将HRESP驱动为OKAY。

注意     

  • 一般来说,每个slave在完成传输之前都必须插入一个预定的最大等待状态数。这使得可以计算出访问总线的最大延迟。
  • 建议slave不要插入超过16个等待状态,以防止任何单个访问锁定总线太多时钟周期。然而,对于某些设备,例如串行启动ROM,这一建议并不适用。这类设备通常只在系统启动期间被访问,如果使用了超过16个等待状态,对系统性能的影响可以忽略不计。

1.3 错误响应

slave使用错误响应来指示与相关传输的某种错误条件。这通常表示保护错误,例如试图写入只读存储器位置。

尽管OKAY响应可以在单个周期内给出,但ERROR响应需要两个周期。要开始ERROR响应,slave将HRESP驱动为高电平以指示ERROR,同时驱动HREADYOUT为低电平,以延长传输一个额外的周期。在下一个周期,HREADYOUT被驱动为高电平以结束传输,而HRESP保持高电平以指示ERROR。

由于总线的流水线特性,需要两个周期的响应。当slave开始发出ERROR响应时,下一个传输的地址已经被广播到总线上。两个周期的响应为master提供了足够的时间来取消下一个访问,并在下一个传输开始之前将HTRANS[1:0]驱动为IDLE。

如果slave需要超过两个周期来提供ERROR响应,那么可以在传输开始时插入额外的等待状态。在此期间,HREADY为低电平,响应必须设置为OKAY。

图5-1展示了一个带有错误响应的传输

T1-T2 slave插入一个等待状态并提供OKAY响应。

T2-T3 slave发出ERROR响应。这是ERROR响应的第一个周期,因为HREADY为LOW。

T3-T4 slave发出ERROR响应。这是ERROR响应的最后一个周期,因为HREADY现在是HIGH。

          master将传输类型更改为IDLE,这取消了在T2时刻由slave寄存的针对地址B的预期事务。

T4-T5 slave以OKAY响应。

如果slave提供了一个ERROR响应,那么master可以取消突发中剩余的传输。然而,这不是一个严格的要求,master也可以继续完成突发中剩余的传输。

 

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个AHB总线的Slave模块的SystemVerilog代码示例: ``` module ahb_slave ( input logic clk_i, // 时钟信号 input logic rst_i, // 复位信号 input logic [31:0] haddr_i, // 总线地址 input logic [1:0] hprot_i, // 总线保护信号 input logic [31:0] hwdata_i, // 写数据 input logic hwrite_i, // 写使能 input logic hsel_i, // 从设备选择信号 output logic [31:0] hrdata_o, // 读数据 output logic [1:0] hresp_o // 总线响应信号 ); logic [31:0] ram [0:1023]; // 定义一个 1KB 的 RAM always_ff @(posedge clk_i or posedge rst_i) begin if (rst_i) begin // 复位时清空 RAM 中的数据 ram <= '0; end else if (hwrite_i) begin // 写数据 ram[haddr_i[9:0]] <= hwdata_i; end else begin // 读数据 hrdata_o <= ram[haddr_i[9:0]]; end end // 根据总线响应信号 hresp_i 的值设置 hresp_o 信号 assign hresp_o = (haddr_i[31:10] != 10'h0) ? 2'b10 : 2'b00; endmodule ``` 上述代码中,ahb_slave 模块实现了一个简单的 RAM,可以通过 AHB 总线进行读写操作。该模块包括一个时钟信号 clk_i、一个复位信号 rst_i、一个总线地址信号 haddr_i、一个总线保护信号 hprot_i、一个写数据信号 hwdata_i、一个写使能信号 hwrite_i、一个从设备选择信号 hsel_i、一个读数据信号 hrdata_o 和一个总线响应信号 hresp_o。 在 always_ff 块中,根据 haddr_i 和 hwrite_i 的值,可以判断当前操作是读还是写。如果是写操作,则将写入的数据存储到 RAM 中;如果是读操作,则将 RAM 中的数据读取出来,并将其赋值给 hrdata_o。根据读写操作的结果,设置总线响应信号 hresp_o 的值。 需要注意的是,这只是一个简单的示例代码,实际应用中需要根据具体的需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值