从端总线库(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 |