HDLBits (137) — 有奇偶校验位的串口接收器
本题链接:
https://hdlbits.01xz.net/wiki/fsm_serialdp
另请参阅:Serial receiver and datapath
我们想为串行接收器添加奇偶校验。 奇偶校验要在每个数据字节后增加一位。 这里我们将使用奇校验,其中接收到的 9 位中的 1 的数量必须是奇数。 例如,101001011 满足奇校验(有 5 个 1),但 001001011 不满足。
更改你的有限状态机和数据路径以执行奇校验检查。 只有当一个字节被正确接收并且它的奇偶校验通过时,才断言完成信号。 与 serial receiver FSM 一样,此有限状态机需要识别起始位,等待所有 9 个(数据和奇偶校验)位,然后验证停止位是否正确。 如果停止位未按预期出现,则有限状态机必须等到找到停止位后再尝试接收下一个字节。
这里为你提供了以下模块,可用于计算输入流的奇偶校验(这是一个带复位功能的 T触发器)。 预设用途是应该给它输入比特流,并在适当的时间重置,以便计算每个字节中 1 的比特数。
请注意,串行协议先发送最低有效位,然后再发送 8 个数据位之后的奇偶校验位。
一些时序图
无错误。 第一个字节奇校验通过,第二个字节失败


题目

答案

有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机不仅是一种电路的描述工具,而且也是一种思想方法,在电路设计的系统级和 RTL 级有着广泛的应用。
Verilog 中状态机主要用于同步时序逻辑的设计,能够在有限个状态之间按一定要求和规律切换时序电路的状态。状态的切换方向不但取决于各个输入值,还取决于当前所在状态。状态机可分为 2 类:Moore 状态机和 Mealy 状态机。
在远程通信和计算机科学中,串行通信(英语:Serial communication)是指在计算机总线或其他数据通道上,每次传输一个比特数据,并连续进行以上单次过程的通信方式。与之对应的是并行通信,它在串行端口上通过一次同时传输若干比特数据的方式进行通信。

每个字符表示为一个帧,以逻辑低电平为开始比特,然后是数据比特,可选的奇偶校验比特,最后是一个或多个停止比特(逻辑高电平)。
接收器在每个时钟脉冲时测试接收到的信号状态是否为开始比特。如果开始比特的低电平持续传输1个比特所需时间的一半以上,则认为开始了一个数据帧的传输;否则,则认为是毛刺脉冲并忽略。到了下一个比特时间后,线路状态被采样并送入移位寄存器。
简化的UART在开始比特下降沿开始重新同步时间,然后在每个数据比特的中心时刻采样。
奇偶校验位用于许多计算机硬件中,遇到麻烦时能够重新操作或者通过简单的错误检测就能起到很大作用的场合。例如SCSI总线使用奇偶校验位检测传输错误,许多微处理器的指令高速缓存中也包括奇偶校验位保护。因为指令缓存数据是主内存数据的副本,所以在发现错误的时候能够抛弃错误数据并且重新取回数据。
在串行通信中,常用的格式是7个数据位、1个校验位、1到2个停止位。这种格式用方便的8位字节巧妙地适应了所有的7位ASCII字符。也可以用其它的格式表示,8位数据加上1个校验位可以传输任意的8位字节数据。
在串行通信中,奇偶校验位通常是由UART这样的接口硬件生成、校验的,在接收方,通过接口硬件中的寄存器的状态位传给CPU以及操作系统。错误数据的恢复通常是通过重新发送数据,这个过程通常由如操作系统输入输出程序这样的软件处理的。
参考内容:
6.3 Verilog 状态机 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog-fsm.html
通用异步收发传输器 | 维基百科:
https://zh.wikipedia.org/wiki/UART
串行通信 | 维基百科:
https://zh.wikipedia.org/wiki/串行通信
奇偶校验位 | 维基百科:
https://zh.wikipedia.org/wiki/奇偶校验位