当前位置: 首页 > 解决方案
返回
列表

FPGA串行接口(RS-232)

发表时间: 2024-01-12 作者: 解决方案

  数据通常由 8 位(我们叫做字节)的块发送,并且是“序列化”的:首先发送 LSB(数据位 0),然后发送位 1,...最后是 MSB(第 7 位)。

  此接口使用异步协议。 这在某种程度上预示着没有时钟信号沿数据传输。 接收器必须有一种办法能够将自身“计时”到输入的数据位。

  电缆的两端事先就通信参数(速度、格式等)达成一致。这是在通信开始之前手动完成的。

  发送器在发送每个字节之前发送“start”(=“0”),以便接收器能确定一个字节即将到来。

  这里的数据是0xC4,你能看到它吗?这些位更难看到。 这说明了接收方知道数据以何种速度发送是多么重要。

  速度以波特率为单位,即每秒可以发送多少位。 例如,1000 波特意味着每秒 1000 位,或者每个位持续 毫秒。

  RS-232 接口的常见实现(如 PC 中使用的接口)不允许用任何速度。 如果你想使用123456波特率,你就不走运了。 你一定要满足于一些“标准”速度。常见值包括:

  在 115200 波特时,每个比特持续 (1/115200) = 8.7μs。 如果传输 8 位数据,则持续时间为 8 x 8.7μs = 69μs。 但是每个字节都需要一个额外的起始位和停止位,因此实际上需要 10 x 8.7μs = 87μs。 这在某种程度上预示着最大速度为每秒 11.5KB。

  在 115200 波特率下,一些带有错误芯片的 PC 需要一个“长”停止位(1.5 或 2 位长...),这使得最大速度降至每秒 10.5KB 左右。

  在这里,我们大家都希望以最大速度使用串行链路,即 115200 波特(较慢的速度也非常容易生成)。 FPGA 通常以 MHz 的速度运行,远高于 115200Hz(按照今天的标准,RS-232 相当慢)。 我们应该找到一种方法来生成(从FPGA时钟)尽可能接近每秒115200次的“滴答声”。

  这很容易。但是,如果你有一个1MHz的时钟,而不是8432.2MHz,你会怎么做? 要从 115200MHz 时钟生成 2Hz,我们应该将时钟除以“17.361111111...” 不完全是一个整数。 解决方案是有时除以 17,有时除以 18,确保比率保持“17.361111111”。 这实际上很容易做到。

  最后一个实现问题: “BaudGeneratorInc”计算是错误的,因为 Verilog 使用 32 位中间结果,并且计算超出了这个范围。 更改该行,如下所示以获得解决方法。

  我们正在构建一个具有固定参数的“异步发射器”:8 个数据位、2 个停止位、非奇偶校验。

  此设计允许从 PC 控制几个 FPGA 引脚(通过 PC 的串行端口)。