CLB 负责检测编码器的响应,然后为 SPI 提供时钟以接收数据。首先考虑时钟的占空比和频率。图 2-14 展示了生成 SPI 时钟的 CLB 逻辑。图 2-15 展示了相应的仿真波形。
第一步是生成具有指定频率和占空比的时钟(称为 SPI_CLOCK)。在生成 SPI_CLOCK 时:
- TILE3_COUNTER_1:负责时钟的占空比和频率(宽度)。SPI_CLOCK 高电平转换和低电平转换之间的时间以 CLB 时钟数进行测量。使用以下匹配信号:
- 零匹配:对应于时钟的低电平转换
- match1:对应于时钟的高电平转换
- match2:对应于时钟的宽度
- TILE3_FSM_1:根据 COUNTER_1 匹配值生成时钟边沿:match1 和零匹配
- TILE3_LUT_0:达到 COUNTER_1 match2 输出所指示的时钟宽度时复位计数器
第二步是将时钟与接收到的数据对齐。这是 SPI 正确接收编码器响应所必需的。对齐时钟面临两个挑战:
- 由于电缆传播延迟,响应可能随时到达,如 节 2.3.1.1 中所述。
- 编码器还可能延迟确认 ACK 以请求额外的处理时间,如 节 2.3.1.2 中所述。
为了对齐时钟,LUT_0 监控上升沿的响应信号。第一个上升沿对应于确认 (ACK) 位之后的开始位。检测到此边沿时,LUT_0 会复位 COUNTER_1,从而将 SPI_CLOCK 与响应对齐。
第三步是根据内部 SPI_CLOCK 生成 CLB_SPI_CLOCK。如 图 2-15 所示。
- SPI_CLOCK 的生成持续时间比 SPI 接收响应所需的时间更长
- CLB_SPI_CLOCK 仅输出接收响应所需的时钟数
这是通过使用 TILE4_FSM_2 生成 SPI_CLOCK_OUTPUT_ENABLE 信号来实现的。OUTLUT 使用此信号来根据需要允许/阻止 SPI_CLOCK。