外围接口
Holoscan 传感器桥 IP 支持多种软件定义的外围接口,包括 SPI、I2C 和 GPIO。对于这些协议中的每一种,都定义了一个通用内核来处理所有协议特定的要求,并允许软件设置事务,然后由 Holoscan 传感器桥 IP 执行这些事务。
可以使用单个内核实例支持多个端点。在这种情况下,每个端点都将获得自己的虚拟寄存器范围,所有这些范围都映射到同一个外围内核实例。此寄存器范围的高位充当 MUX 选择位,用于在不同端点之间进行选择。这减少了总体资源利用率,而无需给定内核的多个实例。但是,这创建了一个要求,即每个协议一次只能设置和执行一个事务,因为所有端点共享相同的物理寄存器。
SPI 内核由一系列寄存器控制。所有 SPI 事务都通过 ECB 写入数据包设置。此系统允许软件将一系列数据字节加载到缓冲区中,然后将其写入 SPI 外围设备。来自 SPI 外围设备的任何数据都将存储到同一个缓冲区中,然后可以通过 ECB 读取来读取。
SPI 内核具有一个 4 位双向信号数据信号 (SDIO)、一个芯片选择 (CS_N) 和一个时钟信号 (SCK),用于连接的每个端点。双向数据信号被分解为 4 位输入信号和 4 位输出信号,以及用于三态的输出使能 (oen) 信号。此 SPI 内核支持使用 SDIO[0] 作为输出 (MOSI) 和 SDIO[1] 作为输入 (MISO) 的单 SPI 模式。双 SPI 和四 SPI 分别使用 SDIO 信号的 2 位和 4 位来支持。
SPI 内核使用 i_apb_clk 时钟并使用 i_apb_rst 复位。所有逻辑都基于此时钟。为了设置 SPI 接口的 SCK 频率,包含了一个预分频器寄存器,用于将此时钟分频到较低的频率。顶层输入应与此时钟域同步。以下代码片段演示了如何将 Holoscan 传感器桥 SPI 接口连接到顶层端口,其中 “i” 是端点索引。SPI_SCK、SPI_CSN、SPI_MOSI、SPI_MISO 和 SPI_SDIO 是顶层端口。

图 1. 简单的 SPI 连接
assign SPI_SCK = o_spi_sck [i];
assign SPI_CSN = o_spi_csn [i];
assign SPI_MOSI = o_spi_sdio [i];
assign i_spi_sdio[i] = {2'b0, SPI_MISO, 1'b0};

图 2. 双/四 SPI 连接
双 SPI 分配
assign SPI_SCK = o_spi_sck [i];
assign SPI_CSN = o_spi_csn [i];
assign SPI_SDIO [1:0] = o_spi_oen [i] ? o_spi_sdio[i][1:0] : 2'bz;
assign i_spi_sdio [i] = {2’b0,SPI_SDIO};
四 SPI 分配
assign SPI_SCK = o_spi_sck [i];
assign SPI_CSN = o_spi_csn [i];
assign SPI_SDIO = o_spi_oen [i] ? o_spi_sdio[i] : 4'bz;
assign i_spi_sdio [i] = SPI_SDIO;
SPI CTRL FSM 的基地址从 0x0300_0000 开始。对于每个 SPI 控制器,寄存器偏移量为 0x0000_0200。因此,SPI 控制器 0 的起始地址为 0x0300_0000,SPI 控制器 1 的起始地址为 0x0300_0200,依此类推。
I2C CTRL FSM 通过一系列寄存器控制 I2C 内核。所有 I2C 事务都通过 ECB 控制数据包设置。此内核的工作方式与 SPI 内核非常相似,软件填充要通过 I2C 写入的数据缓冲区,内核处理协议特定的握手。I2C 内核具有两个双向信号,sda 和 scl。内核使用输入信号和输出使能信号来实现此双向信号。当输出使能信号为高电平时,相应的信号应保持浮空,只有当输出使能为低电平时,输出才应被拉低。此行为与 I2C 协议一致。
I2C 内核使用 i_apb_clk 时钟并使用 i_apb_rst 复位。所有逻辑都基于此时钟。为了设置 I2C 接口的频率,包含了一个预分频器寄存器,用于将此时钟分频到较低的频率。I2C 内核支持 I2C 时钟扩展。
顶层输入应与此时钟域同步,并且还应根据 I2C 协议添加毛刺滤波。
以下代码片段演示了如何将 Holoscan 传感器桥 I2C 接口连接到顶层端口,其中 “i” 是端点索引。I2C_SCL 和 I2C_SDA 是顶层端口。

图 3. I2C 连接
I2C 分配
assign i_i2c_scl[i] = o_i2c_scl_en[i] ? I2C_SCL : 1'b0;
assign i_i2c_sda[i] = o_i2c_sda_en[i] ? I2C_SDA : 1'b0;
assign I2C_SCL = o_i2c_scl_en[i] ? 1'bz : 1'b0;
assign I2C_SDA = o_i2c_sda_en[i] ? 1'bz : 1'b0;
I2C CTRL FSM 的基地址从 0x0400_0000 开始。对于每个 I2C 控制器,寄存器偏移量为 0x0000_0200。因此,I2C 控制器 0 的起始地址为 0x0400_0000,I2C 控制器 1 的起始地址为 0x0400_0200,依此类推。
*注意:I2C 仅在 400kHz 速度模式下经过验证和测试。
Holoscan 传感器桥 IP 支持用于状态和控制功能的通用 I/O (GPIO) 信号。GPIO 信号可以设置为输入或输出信号。默认情况下,GPIO 信号设置为输入。
GPIO 信号可以连接到内部用户逻辑或板上的顶层。GPIO 控制的示例包括切换板载引脚、IP 配置的内部跳线、LED 控制等。
可以使用 “GPIO_RESET_VALUE” 参数定义 GPIO 控制信号的复位值。
GPIO 状态的示例包括传感器状态信号、板载和内部校准完成信号、软件复位计数等。
GPIO 输入信号将跨时钟域 (CDC) 进入 “i_apb_clk” 时钟域。
GPIO 输出信号将跨时钟域 (CDC) 进入 “i_hif_clk” 时钟域。

图 4. GPIO 连接