FPGA状态机(一),初学者学习FPGA状态机编程

没做过FPGA,也没做过状态机编程,首先学习理论和语法。

UART串口通讯,接收器(RX)。

记录理论部分,如下:

一,状态描述:

  1. R_START状态:这是UART接收状态机的初始状态。在这个状态下,状态机等待RXD信号的电平跳变,从逻辑1变为逻辑0。这个电平跳变表示了UART数据帧的开始,也就是起始位的开始。一旦起始位被检测到,状态机将转移到R_CENTER状态。

  2. R_CENTER状态:在R_CENTER状态,状态机用来确定数据位的中点。这是为了确保在数据位的中间进行采样,以准确地解析数据。

  3. R_WAIT状态:R_WAIT状态用于等待采样。一旦状态机确定了数据位的中点,它会等待一定时间,以确保在数据位中进行适当的采样。

  4. R_SAMPLE状态:在R_SAMPLE状态,状态机执行数据位的采样操作。这时,它会采样RXD_SYNC信号来确定数据位的值。

  5. R_STOP状态:最后,在R_STOP状态,状态机等待接收并验证停止位。一旦停止位被成功接收,整个UART数据帧就被完整地接收和解析,然后状态机可以重新回到R_START状态,准备接收下一帧数据。

总的来说,这些状态组合在一起,使UART接收器能够可靠地接收和解析传入的数据帧。状态机通过等待起始位、计算数据位的中点、等待采样、执行采样和验证停止位的过程来完成这个任务。这是UART通信中接收端的基本工作原理,确保数据的准确传输。

二,状态分解:

R_START状态:

  1. R_START状态:这是UART接收状态机的初始状态。当UART接收器复位时,状态机会进入这个状态。在R_START状态,状态机等待从逻辑1变为逻辑0的电平跳变,这标志着UART数据帧的开始。这个电平跳变通常表示了起始位的开始。一旦起始位被确定,状态机将转移到R_CENTER状态,以继续接收和解析整个数据帧。

  2. RXD_SYNC信号:描述中提到了RXD_SYNC信号,它是从RXD(UART接收数据线)经过同步处理后的信号。这是因为在接收数据时,不希望在信号不稳定的时候进行逻辑1或逻辑0的检测。因此,通常会在接收前对RXD信号进行同步处理,以确保稳定的信号用于数据解析。

总的来说,这段描述涵盖了UART接收器在开始接收数据前的一些初始化操作,包括等待起始位的电平跳变以及对RXD信号进行同步处理,以确保可靠的数据接收。一旦起始位被确定,状态机将继续处理数据帧的其余部分,包括数据位、奇偶校验位和停止位的解析。这些操作是UART通信中的基本原理之一,用于在串行通信中可靠地传输数据。

R_CENTER状态:

  1. 异步串行信号特性:在异步串行通信中,数据的传输不依赖于外部时钟信号,而是通过发送和接收端之间的协议来同步。因此,在接收端必须采样数据以确定每个位的中点,以确保准确的数据解析。

  2. 求出每位的中点:R_CENTER状态的任务是通过对bclk的个数进行计数(RCNT16),以确定每位的中点。bclk通常是指比特时钟,它指示数据位的时钟。通过计数bclk的数量,可以精确地找到每个数据位的中间位置,这是在数据位上进行采样的理想时机。

  3. 计数值的选择:虽然最初的直觉可能是计数到“1000”来找到每位的中点,但实际上需要考虑一个bclk周期的影响。因为要在每位的中点采样,所以计数值需要考虑经过一个状态(即一个bclk周期)后能够准确地位于位的中间。这个值可能会因具体的UART配置和硬件实现而有所不同。

  4. 起始位的检测:描述中还提到,R_START状态可能会检测到不是真正的起始位,而是一些干扰尖脉冲(负脉冲)。这些尖脉冲通常具有非常短的周期,因此可以使用一个简单的规则来识别它们。如果信号保持逻辑0状态超过1/4个位时间,那么可以假定这是一个真正的起始位,而不是干扰信号。

总之,R_CENTER状态是用于确定异步串行数据位的中点,以确保在每个位上进行准确的采样。它还考虑了在R_START状态可能出现的干扰信号,以提高对起始位的正确识别。这种精确的采样是确保正确解析数据的关键步骤之一。

R_WAIT状态:

  1. R_WAIT状态是UART接收状态机中的一种状态,用于等待一定数量的bclk(波特率时钟信号)。在R_WAIT状态下,状态机会等待15个bclk时钟周期,然后在第16个bclk周期转移到R_SAMPLE状态。在R_SAMPLE状态,状态机将开始采样数据位,并检查是否已经采集了足够的数据位以满足数据帧的长度(FRAMELEN),如果是,则说明停止位即将到来。

    FRAMELEN 是一个通用参数(Generic),可以在设计时进行配置。在这个设计中,默认为8,表示UART工作在8位数据位和无校验位的格式下。

    R_WAIT状态的主要任务是等待足够的时钟周期以便在R_SAMPLE状态准确地采样数据位,并在必要时检查数据帧的长度是否已满足。这个状态机的目的是确保接收到完整的数据帧,包括数据位和停止位,以便后续的处理

R_SAMPLE状态:

  1. 数据位采样检测:在R_SAMPLE状态,接收状态机会等待数据位的中点,并在此时采样数据信号。这个采样时机通常位于数据位的中间,以确保准确地检测到逻辑1或逻辑0。采样的结果将用于确定接收到的数据位的值。

  2. 无条件状态转移:无论数据位的采样结果如何,R_SAMPLE状态结束后接收状态机都会无条件地转移到R_WAIT状态。这是因为在UART通信中,数据位的值已经被采样并保存,不再需要在R_SAMPLE状态下继续进行其他决策。

  3. 等待下一位数据:R_WAIT状态用于等待下一位数据的到来。一旦上一个数据位的采样检测完成,接收状态机会准备好接收下一位数据,并继续状态机的运行以解析整个数据帧。

总的来说,R_SAMPLE状态的主要任务是在数据位的中点进行采样,以确保准确地检测到数据位的值。一旦采样完成,状态机将无条件地进入R_WAIT状态,等待接收下一位数据。这个过程将持续,直到整个UART数据帧被完全接收和解析。

R_STOP状态:

  1. 帧接收完毕信号:在R_STOP状态,接收状态机不再具体检测RXD信号。相反,它会产生一个帧接收完毕信号(通常表示为REC_DONE),以指示整个UART数据帧已经成功接收。

  2. 无论停止位类型:不管数据帧的停止位类型是1位、1.5位还是2位,R_STOP状态都不会具体检测RXD信号。这是因为停止位主要用于标志数据帧的结束,一旦停止位被检测到,接收状态机知道当前数据帧已经接收完毕。

  3. 状态机状态转移:一旦帧接收完毕信号产生,接收状态机将回到R_START状态,等待下一个数据帧的起始位。这是UART接收状态机的循环操作,它持续接收和处理来自串行数据流的数据帧。

总的来说,R_STOP状态标志着数据帧的接收完成,并且向其他部分发出接收完成的信号。然后,状态机会重新初始化自己,以准备接收下一个数据帧的起始位。接收模块的任务是将串行数据转换成并行数据,并在必要时检测数据帧中的错误。这些操作确保了UART通信的可靠性和正确性。

三,UART接收器的一般工作流程:

  1. 准备接收数据状态:UART接收器首先进入准备接收数据状态,它不断监视串行输入线RXD端。

  2. 检测低电平:接收器在准备接收数据状态时,会不断检测RXD端是否出现低电平。低电平通常表示起始位的开始。

  3. 启动起始位检测电路:一旦检测到低电平,接收器会立刻启动起始位检测电路,以确认是否接收到正确的起始位。这可以通过检测低电平的持续时间和电平变化来实现,以避免误判由噪声引起的低电平。

  4. 采样数据位:一旦确认接收到正确的起始位,接收器会使用波特率作为采样时钟,对每个数据位的中间位置进行采样。这确保在数据位的最佳位置上获取数据值。

  5. 接收移位寄存器RSR:接收器将采样到的每个数据位的信息以移位方式送入接收移位寄存器RSR中。这个寄存器用于暂存接收到的数据。

  6. 并行数据转化:一旦整个数据帧的数据位都被采样并存储在RSR中,接收器将串行数据转换成并行数据。这意味着将连续的串行位转换成并行的字节或字。

  7. 奇偶校验检查:接收器可能会执行奇偶校验,以验证接收到的数据的正确性。这可以用于检测数据传输中的错误。

  8. 停止位和中止态检查:接收器还会检查停止位和中止态,以确保数据帧的完整性和正确性。

  9. DAT_READ置1:一旦整个数据帧被成功接收、校验和检查完成,接收器将DAT_READ标志置1,以指示数据已经准备好供外部读取。

这个工作流程描述了UART接收器如何接收、解析和验周期以准备发送数据位。这确保了数据发送的时序正确,以便接收端能够正确地解析数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值