hdlbits day11
作者:互联网
5.17、Fsm serial
在许多(较旧的)串行通信协议中,每个数据字节都与一个起始位和一个停止位一起发送,以帮助接收器从位流中划定字节。一种常见的方案是使用 1 个起始位 (0)、8 个数据位和 1 个停止位 (1)。当没有传输任何内容(空闲)时,该线路也处于逻辑 1。
设计一个有限状态机,当给定比特流时,它将识别何时正确接收到字节。它需要识别起始位,等待所有 8 个数据位,然后验证停止位是否正确。如果停止位未按预期出现,则 FSM 必须等到找到停止位后再尝试接收下一个字节。
1)这里开始的标记是低电平,结束的标记是高电平,在开始和结束之间传输的 bit 位为8即一个字节,这是正确接收的条件,当满足该条件后会在 stop 位后面的时钟沿给出 done 的输出标记。如果不满足该条件,比如起始 start 条件不满足,则会一直等待知道接收到低电平信号才开始;又如 start 开始后,中间的位数超过了8 bit,即8 bit 后一直是低电平信号,不出现高电平的 stop 信号,则 receiver 继续等待知道出现高电平位才结束,但这是一个错误接收,不会给出 done 的输出标记。波形图如下所示。
2)设计了五个状态,分别是 IDLE, START, DATA, STOP, ERROR。这里控制状态转移的有输入信号 in 和自定义的计数器 cnt,计数器用于计数 start 和 stop 之间的位数是数据是否满足1 byte。cnt的条件判断只用在 DATA 状态中,在 DATA 状态时,cnt 实行计数,当 cnt 为8时表示真正的数据够了,此时再比较输入 in,如果 in 为高电平则数据接收正常,跳转至 STOP,否则表示出现错误,进入 ERROR。跳出 ERROR 的条件是输入in出现高电平。这里需要注意 STOP 状态可以直接跳转至 START 状态,即 in 为高电平后紧接着出现低电平情况,如果输入 in 为连续的几个高电平,则 STOP 会进入 IDLE 等待低电平到来。另外这里的 START 状态应该可以合并到 DATA 状态中实现状态机化简,可以试试。
标签:cnt,字节,高电平,hdlbits,STOP,低电平,day11,DATA 来源: https://www.cnblogs.com/blog-address/p/16295458.html