• Avalon总线协议汇总



    前言

    Nios系统的所有外设都是通过Avalon总线与Nios CPU相接的,Avalon(阿瓦隆) 总线是一种协议较为简单的系统总线(内总线),Nios通过Avalon总线与外界进行数据交换。之前就一直有所耳闻,并没真正去深入的了解过,今天让我们一起来学习学习。Intel官方文档地址:Avalon


    一、Avalon接口简介

    总的来说,Avalon可以方便我们轻松的连接各种组件,进而简化我们的系统设计。常用于我们的流式传输高速数据、读写寄存器和存储器以及控制片外器件的接口。接口可以应用于我们的自定义组件或英特尔原有的组件。在Intel官方文档中定义了7种接口,我们分别来看看。

    1、七种接口定义

    1、Avalon Streaming Interface (Avalon -ST)

    这是Avalon的流式接口,该接口支持单向数据流的接口,包括多路复用、数据包、DSP数据流等。

    2、Avalon Memory Mapped Interface ( Avalon -MM)

    这是Avalon的内存映射接口,基于地址的读/写接口,是主-从连接的典型接口。

    3、Avalon Conduit Interface

    Avalon Conduit接口,适用于不适合其他Avalon类型的单个/多个信号。使用该信号可以将信号导出到顶层SOPC系统,这样就可以将它连接到设计的其他模块。

    4、Avalon Tri-State Conduit Interface(Avalon -TC)

    Avalon三态Conduit接口 – 与片外设备的接口。多个外设可以通过信号多路复用来共享管脚,从而减少FPGA的管脚数和PCB上的走线数量。

    5、Avalon Interrupt Interface

    Avalon 中断接口 — 允许组件向其他组件发出事件信号的接口。

    6、Avalon Clock Interface

    Avalon 时钟接口 — 驱动或接收时钟的接口。

    7、Avalon Reset Interface

    Avalon 重置接口 — 提供重置连接的接口。

    注意:单个组件可以包含任意数量的这些接口,也可以包含相同接口类型的多个实例

    2、接口需要关注的点

    1、Avalon Properties and Parameters

    这是Avalon的属性参数,Avalon接口使用属性描述它们的行为。每种接口类型的规范定义了所有接口属性和默认值。
    例如:Avalon -ST 接口 maxChannel 的属性允许您指定接口支持的通道数。Avalon 时钟接口 clockRate 的属性提供时钟信号的频率。

    2、Signal Roles

    每个Avalon接口可以定义信号角色及行为,并且大多数信号角色是可选的。我们可以灵活的选择实现所需功能所需的信号角色。
    例如:Avalon® -MM 接口包括支持突发的组件的可选 beginbursttransfer 角色和 burstcount 信号角色。Avalon® -ST 接口包括支持数据包的接口的可选 startofpacket 角色和 endofpacket 信号角色。

    需要注意的是:除 Avalon 导管接口外,每个接口只能包含每个信号角色的一个信号,许多信号角色允许低电平有效信号,官方文档通常使用高电平有效信号。

    3、Interface Timing

    这是接口的时序,用于描述我们各个接口类型传输的计时信息,这些接口中的任何一个都无法保证性能,实际性能取决于许多因素,包括组件设计和系统实现。大多数 Avalon 接口不得对时钟和复位以外的信号进行边沿敏感。

    4、系统设计中的 Avalon 接口

    在下图中,外部处理器通过带有Avalon® -MM接口的外部总线桥访问片上组件的控制和状态寄存器。PCI Express 根端口通过驱动具有 Avalon® -MM 主机接口的片上 PCI Express 端点来控制印刷电路板上的设备和 FPGA 的其他组件。外部处理器处理来自五个组件的中断。PLL通过Avalon®时钟接收器接口接受参考时钟,并提供两个时钟源。闪存和SRAM存储器通过Avalon® -TC接口共享FPGA引脚。最后,SDRAM 控制器通过 Avalon® Conduit 接口访问外部 SDRAM 存储器。

    在这里插入图片描述

    二、常用的接口

    由于文档内容较多,现就详细介绍几个常用的接口,其余接口,我们需要时再去了解。

    1、Avalon Clock and Reset Interfaces

    • Avalon的时钟复位接口:
      这是Avalon的时钟复位接口,时钟接口定义组件使用一个或多个时钟。组件可以具有时钟输入、时钟输出或都具备。锁相环(PLL)是同时具有时钟输入和时钟输出的组件示例。
      在这里插入图片描述
      Avalon时钟接口定义了组件使用的时钟,分为两个信号:Clock Sink信号和Clock Source信号。
      Clock Sink信号为其他接口和内部逻辑提供时钟和时序参考,有clockRate属性:
      在这里插入图片描述
    • 关联的时钟接口:
      所有同步接口都有一个属性,该 associatedClock 属性指定将组件上的哪个时钟源用作接口的同步参考。
      在这里插入图片描述
      Clock Source信号为从一个组件中输出一个时钟信号,具有三个属性:
      在这里插入图片描述
    • 同步接口示例:
      Clock 组件(Avalon 时钟)的时钟由 Qsys 外部的 FPGA 逻辑部分接口引人,通过它产生的50MHz的时钟信号供给整个 Qsys 系统上的所有组件。
      在这里插入图片描述
    • 复位接口:
      对于Reset Sink信号复位接口有两个信号角色:
      reset/reset_n:将接口或组件的内部逻辑重置为用户定义的状态。重置的同步属性由 synchronousEdges 参数定义。
      reset_req(可选择的):用于禁用时钟使能或屏蔽片上存储器的地址总线,以防止地址在异步复位输入被置位时转换。
    名字默认值可选值解释
    associatedClockN/A时钟名称此接口同步到的时钟的名称。如果值 synchronousEdges 为 BOTH或DEASSERT 则为必需。
    synchronous-EdgesDEASSERTNONE、DEASSERT、BOTHNONE、不需要同步、DEASSERT --复位是异步的,取消复位是同步的、BOTH --复位和取消复位是异步的
    • 关联的复位接口:
      所有同步接口都有一个 associatedReset 属性,用于指定哪个复位信号重置接口逻辑。

    • Reset Source信号:

    • Reset Source信号包含reset/reset_n和reset_req,角色作用与我们的Reset Sink信号类似,但是属性不同。

    名字默认值可选值解释
    associatedClockN/A时钟名称此接口同步到的时钟的名称。如果值 synchronousEdges 为 BOTH或DEASSERT 则为必需。
    associatedDirectResetN/A复位名称复位输入的名称,此复位输入通过one-to-one链路直接驱动此复位源。
    associatedResetSinksN/A重置名称指定复位输入,使复位源对复位进行复位。
    synchronous-EdgesDEASSERTNONE、DEASSERT、BOTHNONE、不需要同步、DEASSERT --复位是异步的,取消复位是同步的、BOTH --复位和取消复位是异步的

    2、Avalon Memory-Mapped Interfaces(内存映射接口)

    我们可以通过Avalon -MM接口实现我们的主机和代理组件的读写接口,简单的Avalon-MM接口应用有:固定周期读写传输的sram接口,在突发传输的流水线接口中非常复杂。常用的组件有:

    1、Microprocessors :微处理器
    2、Memories:记忆
    3、UART
    4、DMA:目的地管理协议
    5、Timers:定时器

    • 典型的Avalon-MM接口应用场景:
      在这里插入图片描述
    • 组件通常仅包含组件逻辑所需的信号:
      在这里插入图片描述
      Avalon® -MM 从组件中的每个信号正好对应于一个 Avalon® -MM 信号角色。Avalon® -MM 接口只能使用每个信号角色的一个实例。
    • 接口的信号角色:
      信号角色定义 Avalon® 内存映射主机和从机端口允许的信号类型。对于下面的信号,不要求所有信号都存在于我们的Avalon® -MM接口中,没有一个必须需要始终存在的,最低的要求就是只读接口的readdata或 只写接口的writedata write 。下面是我们的Avalon® -MM角色,对于里面的信号可以是高电平有效或低电平有效(以_n结尾),如表:
    信号角色宽度方向必要描述
    address1~64主到从NO主机:默认情况下, address 信号表示字节地址。地址的值必须与数据宽度对齐。要写入数据字中的特定字节,主机必须使用该 byteenable 信号。从机:默认情况下,互连将字节地址转换为代理地址空间中的字地址。从从机的角度来看,每个从机访问都是为了一个数据字比如,address为0表示从机的第一个字
    byteenable 、 byteenable_n2、4、8、16、32、64、128主到从NO在宽度大于8位的数据接口上进行传输时启用一个或多个特定字节通道。 byteenable中的每个位对应于writedata和readdata中的一个字节。byteenable信号中的第n个bit指示数据中的第n个字节是否正在被写或者被读。在写的过程中,byteenable指定要写入的字节,其他字节应该被Slave忽视;同理,在读的过程中,byteenable指定Master正在读哪个字节。
    debugaccess1主到从NO置位时,允许NIOS处理器写入配置为ROM的片上存储器
    read、read_n1主到从NO如果存在则readdata也是必须要求存在的,其有效,则表示正在进行读过程。
    readdata8、16、32、64、128、256、512、1024从到主NO从机将readdata发送到主机来驱动我们的read,这对于支持读取的接口是必需的。
    response [1:0]2从到主NO该 response 信号是承载响应状态的可选信号,有关具体的响应,我们在表格后面进行叙述
    write、write_n1主到从NO如果该信号为1,也即有效,则表明正在进行写传输过程,此信号与writedata同在
    writedata8、16、32、64、128、256、512、1024主到从NO用于写入传输的数据,如果存在readdata信号,则writedata信号的宽度必须与readdata一致,该信号与write信号同在。
    • 在response [1:0]信号角色:
      注意: 由于信号是共享的,因此接口无法在同一时钟周期内发出或接受写入响应和读取响应。

    00: OKAY - 事务的成功响应。
    01: RESERVED - 编码是保留的。
    10: SLVERR - 来自端点代理的错误。指示事务不成功。
    11: DECODEERROR - 指示尝试访问未定义的位置。

    对于已读响应:
    1、每个 readdata 发送一个响应。读取 N 突发长度会导致 N 响应。即使发生错误,无效的响应也较少。突发中每个 readdata 信号的响应信号值可能不同。

    2、接口必须具有读取控制信号。 readdatavalid 信号可以提供管道支持。
    3、在读取错误时,相应的 readdata 是“不在乎”。
    对于写入响应:
    1、必须为每个写入命令发送一个写入响应。写入突发仅产生一个响应,必须在接受突发中的最终写入传输后发送该响应。
    2、如果存在,则必须 writeresponsevalid 使用写入响应完成所有写入命令。

    等待状态信号表:

    信号角色宽度方向必要描述
    lock1master->slavenolock 确保一旦 master 赢得仲裁,此 master 就会对多个传输维持对slave 的访问。Lock 与传输的锁定序列的第一个 read 或 write 同时置位。Lock 在传输的锁定序列的最后传输时置低。lock 的置位并不保证赢得仲裁。lock-asserting master 被授予之后,此 master 保留授权,直到 lock 置低。具备 lock 的 master 不能是一个 burst master。lock-equippedmaster 的仲裁优先级值将被忽略。lock 对于 read-modify-write (RMW)操作是特别有用的。典型的 readmodify-write 操作包括以下几个步骤:1. Master A 置位 lock,并读取具有多个比特域的 32 比特数据。2. Master A 置低 lock,修改一个比特域,并写回 32 比特数据。lock 阻止 master B 在 master A 的读与写之间执行写操作。继
    waitrequest、waitrequest_n1Slave →MasterNo当 slave 无法响应 read 或者 write 请求时会置位 waitrequest。强制 master 等待,直到互连(interconnect)准备好继续传输。在所有传输开始时,master 启动传输并等待,直到 waitrequest 置低。当master 处于空闲状态时一定不要对 waitrequest 的置位状态做出假设:waitrequest 可能是高电平或者低电平,这取决于系统属性。当 waitrequest 置位时,除了 beginbursttransfer,对 slave的 master 控制信号必须保持不变。Avalon -MM slave 可以在空闲周期内置位 waitrequest。 Avalon -MM master 可以在 waitrequest 置位时启动一个传输,并等待此信号置低。为避免系统锁定,从器件(slave device)在复位状态时应该置位waitrequest。

    流水线信号表:

    信号角色宽度方向必要描述
    readdatavalid、readdatavalid_n1Slave →Masterno用于可变延迟,流水线化的 read 传输。置位时表明 readdata 信号包含有效数据。对于一个 burstcount 值为的读突发,readdatavalid 信号必须置位次,每个 readdata item 一次。在read 的接受与 readdatavalid 的置位之间必须至少有一个周期的延迟。关于显示 readdatavalid 信号的时序图,请参考 Pipelined Read Transfer with Variable Latency。slave 可以通过置位 readdatavalid 将数据传输到 master,而不用考虑 slave 是否使用 waitrequest 来停止一个新命令。如果 master 支持流水线化读取(pipelined read),则需要此信号。具有读功能的突发 master 必须包含 readdatavalid 信号。
    writeresponsevalid1Slave →Masterno可选信号。如果存在,那么接口对写命令发出写响应。置位时,响应信号上的值是一个有效的写响应。Writeresponsevalid 仅在接受写命令后的一个时钟周期或更多周期后置位。从命令接受到 writeresponsevalid 的置位至少有一个时钟周期延迟。

    突发信号(Burst Signals):

    信号角色宽度方向必要描述
    burstcount1 –11Master →SlaveNo由突发 master 使用以指示每个突发中的传输数量。最大 burstcount参数的值必须是 2 的幂。一个宽度为的 burstcount 接口能够解码一个尺寸为 2(-1)的最大突发。例如,一个 4-bit burstcount 信号能够支持的最大突发数为 8。最小 burstcount 为 1。
    beginbursttransfer1Interconnect→ Slaveno置位一个突发的第一个周期来指示何时开始一个突发传输。此信号在一个周期后置低,而不管 waitrequest 的值如何。

    接口属性:

    名称默认值合法值描述
    addressUnitsMaster - symbols Slave -wordswords,symbols指定地址的单位。一个符号(symbol)通常是一个字节。
    alwaysBurstMaxBurstfalsetrue, false为 true 时表明 master 总是发出最大长度的突发。最大突发长度为 2burstcount_width - 1 。此参数对 Avalon -MM slave接口无效。
    burstcountUnitswordswords,symbols此属性指定 burstcount 信号的单位。对于符号(symbol),burstcount 值被解释为突发中的符号(字节)数量。对于字(word),burstcount 值被解释为突发中的字传输的数量。
    holdTime(1)00 – 1000cycles指定 write 的置低与 address 和 data 的置低之间的时间(timingUnits)。(仅应用于写传输)
    readLatency00 – 63固定延迟 Avalon -MM slave 的读延迟。关于使用固定延迟读取的时序图,请参考 Pipelined Read Transfers with FixedLatency。固定延迟的 Avalon -MM slave 必须对此接口属性提供一个值。 可变延迟的 Avalon -MM slave 使用 readdatavalid信号来指定有效数据。
    bridgesToMaster0Avalon -MMMaster name on the same component一个 Avalon -MM 桥接由一个 slave 和一个 master 组成,并具有以下属性:对请求一个或多个字节的 slave 的访问会导致master 请求相同的字节。Platform Designer 组件库中的Avalon -MM Pipeline Bridge 实现此功能。
    • 时序:

    Avalon -MM 接口是同步的。每个 Avalon -MM 接口都与一个相关联的时钟接口同步。如果信号是
    从与时钟信号同步的寄存器的输出驱动的,那么这些信号可以是组合的。

    • 传输:

    1、传输(Transfer)—传输是一个字或者一个或多个符号的数据的读或写操作。传输发生在 Avalon-MM 接口与互连之间。传输需要一个或多个时钟周期才能完成。master 和 slave 都是传输的一部分。 Avalon -MM master 启动传输, Avalon -MM slave
    作出响应。
    2、Master-slave pair—此术语是指在一个传输中涉及到到 master 接口和 slave 接口。在一个传输过程中,master 接口控制和数据信号遍历互连架构,并与 slave 接口进行交互。

    • 包含waitrequst的读写传输:
      在这里插入图片描述
    1. address,byteenable 和 read 在 clk 的上升沿后置位。slave 置位 waitrequest,暂停传输。
    2. waitrequest 被采样。由于 waitrequest 置位,因此周期变成一个等待状态(waitstate)。address,read,write 和 byteenable 保持不变。
    3. slave 在 clk 的上升沿之后置低 waitrequest。slave 置位 readdata 和 response。
    4. master 对 readdata,response 和置低的 waitrequest(完成传输)的进行采样。
    5. address,writedata,byteenable 和 write 信号在 clk 的上升沿之后置位。slave
      置位 waitrequest,暂停传输。
    6. slave 在 clk 的上升沿之后置低 waitrequest。
    7. slave 采集结束传输的写数据。
    • 写突发(Write Bursts):
      这些规则应用于一个写突发开始于大于 1 的 burstcount 的情况:

    1、当值为的 burstcount 出现在突发的开始时,slave 必须接受个连续单元的writedata 以完成突发。master-slave pair 之间的仲裁保持锁定,直到突发完成。此锁定保证在写突发完成之前没有其他 master 能够在 slave 上执行传输。
    2、slave 必须在 write 置位时才能采集 writedata。在突发期间,master 通过置低 write来表明 writedata 是无效的。置低 write 不会终止突发。write 的置低会延迟突发,并且没有其他 master 可以访问 slave,从而降低了传输效率。
    3、slave 通过置位 waitrequest,强制 writedata,write,burstcount 和byteenable 保持不变来延迟一个传输。
    4、byteenable 信号的功能对于突发和非突发 slave 是相同的。对一个 64-bit slave 的 32-bitmaster 突发写操作(burst-writing),从字节地址 4 开始,slave 看到的第一个写传输在它的地址 0 上,byteenable = 8’b11110000。byteenables 可以根据突发的不同字进行改变。
    5、 byteenable 信号不必都置位。一个写入部分字的 burst master 能够使用 byteenable信号来识别正被写入的数据。
    6、Writes with 通过全部为 0 的 byteenable 信号的写操作作为有效传输传递到 Avalon -MMslave。

    在这里插入图片描述

    • 解释:
    1. master 置位 address,burstcount,write 并驱动 writedata 的第一个单元。
    2. slave 立即置位 waitrequest,表明 slave 尚未准备好继续传输。
    3. waitrequest 为低电平。slave 采集 addr1,burstcount 和 writedata 的第一个单元。在随后的传输周期中,address 和 burstcount 被忽略。
    4. slave 在 clk 的上升沿采集数据的第二个单元。
    5. write 置低期间突发暂停。
    6. slave 在 clk 的上升沿采集数据的第三个单元。
    7. slave 置位 waitrequest。作为响应,所有输出在另一个时钟周期内保持不变。
    8. slave 在 clk 的上升沿采集数据的最后一个单元。slave 写突发结束。

    三、总结

    看不完,根本看不完,等到后面需要的时候在去查手册吧,先溜。

    四、参考资料

    Avalon总线协议(一)

  • 相关阅读:
    计算机毕业设计之科技创新训练课程系统设计与实现
    【LeetCode:2736. 最大和查询 | 贪心 + 二分 + 单调栈】
    Linux多线程篇【5】——线程池
    LLM - 旋转位置编码 RoPE 代码详解
    springboot一次性定时任务插入1000万条数据
    训练和测试的loss不下降,并且精度超低
    devops-6-pipline
    LAMP和LNMP架构详解
    力扣经典题目之->移除值为val元素的讲解,的实现与讲解
    【虹科传感器小课堂】眨眼之见:通过气体检测进行热流量测量和校正
  • 原文地址:https://blog.csdn.net/qq_52215423/article/details/132791841