## 从端总线库(Bus Slave Factory) ### 一、简介 在许多情况下, 需要实现一个总线寄存器行。`BusSlaveFactory`是一个工具, 它提供了一种抽象而流畅的方式来定义它们。 为了体现该工具的功能, 有一个简单的示例, 其使用Apb3SlaveFactory的变体来实现内存映射的UART(请见examples)。还有一个包含一个内存映射函数的Timer的例子(请见examples)。 您可以在(Developers area >> Bus Slave Factory Implementation)找到更多关于`BusSlaveFactory`工具内部实现的文档 ### 二、功能性(Functionality) 目前`BusSlaveFactory`工具有三个实现方式:APB3、AXI-lite 3和Avalon。 该工具的每个实现都以一个对应总线的实例作为参数, 然后提供以下函数来映射用户的硬件到内存映射: | 命名 | 返回类型 | 描述 | | :-----------------------------------------------------------------------------: | :------: | :----------------------------------------------------------------------------------------------------------------------------------------------------: | | busDataWidth | Int | 返回总线的数据位宽 | | read(that,address,bitOffset) | | 在`bitOffset`下的对`that`的回应 | | write(that,address,bitOffset) | | 当总线对地址`address`写, 则将来自`bitOffset`的总线数据赋值给`that` | | onWrite(address)(doThat) | | 当写操作发生在`address`地址时调用`doThat` | | onRead(address)(doThat) | | 当读操作发生在`address`地址时调用`doThat` | | nonStopWrite(that,bitOffset) | | 通过总线从`bitOffset`写数据并永久赋值给`that` | | readAndWrite(that,address,bitOffset) | | 令`that`在`address`地址可读并可写, 并将其防止在字的`bitOffset`位置 | | readMultiWord(that,address) | | 为从`address`读`that`创建内存映射。如果`that`大于一个字, 则它会扩大相应位置的寄存器 | | writeMultiWord(that,address) | | 为向`address`写`that`创建内存映射。如果`that`大于一个字, 则它会扩大相应位置的寄存器 | | createWriteOnly(dataType,address,bitOffset) | T | 创建一个`dataType`类型的只读寄存器并且放置于字的`bitOffset`位置 | | createReadWrite(dataType,address,bitOffset) | T | 创建一个`dataType`类型的读写寄存器并且放置于字的`bitOffset`位置 | | createAndDriveFlow(dataType,address,bitOffset) | Flow[T] | 创建一个`dataType`类型的可写流寄存器并且放置于字的`bitOffset`位置 | | drive(that,address,bitOffset) | | 通过一个地址为`address`的可写寄存器驱动`that`并且放置于字的`bitOffset`位置 | | driveAndRead(that,address,bitOffset) | | 通过一个地址为`address`的可读可写寄存器驱动`that`并且放置于字的`bitOffset`位置 | | driveFlow(that,address,bitOffset) | | 当对地址`address`写时, 使用放置在字的`bitOffset`位置的数据发送`that`进行传输 | | readStreamNonBlocking(that,
address,
validBitOffset,
payloadBitOffset) | | 当对`address`地址读时, 读取`that`并完成传输
valid <= validBitOffset bit
payload <= payloadBitOffset+widthOf(payload) downto `payloadBitOffset` | | doBitsAccumulationAndClearOnRead(that,
address,
bitOffset) | | 实例化一个内部寄存器, 其每周期会进行:reg := reg | that操作。随后当读发生时, 寄存器被清空。该寄存器在地址`address`可读并放置在字的`bitOffset`位置 |