导言
状态机这部分我一直理解得不太清楚,这一章节得习题花了比较长的时间。带校验码的串行接收器这题本身也不是非常难,解题关键在于读懂题目。HDLBits的题目往往由简到难,这道题之前有只要求描述状态转移以及FSM加Datapath两题。
- 串行接收器的传输协议是1bit开始标志位+8bit数据+1bit结束标志位。开始接收标志是in=0,满足条件后连续传输1byte即8bit的数据(LSB到MSB),结束接收标志是in=1。
- 传输线空闲IDLE时,输入in为置高状态。如果检测不到结束标志,则持续检测直到in=1出现,此时没有done信号的输出并丢弃此周期传输的数据。
- 需要注意的是:观察波形可以看出,输出信号done是在接收结束后的下一个周期有效。输出的数据是在done有效的时候进行输出。
- 采取奇校验的方式验证数据传输正确与否,因而多了1bit的校验位。done输出的条件变成:数据接收结束并且校验通过。
思路
- FSM转换是关键,包括空闲状态、数据传输状态、校验状态、结束状态、等待状态。
- IDLE:空闲状态,等待传输开始标志。一旦检测到0,则进入下一状态。
- START:表示数据接收开始,可立即进入数据传输状态。
- S0~S7:S0到S7都是数据传输状态,原则是这一位传完即对下一位传输。在最后一位数据传输完成以后,进入PARITY状态。
- PARITY:校验传输状态,一方面根据此刻parity模块的输出信号odd来判断校验结果,另一方面根据此状态下in的值判断是否进入STOP状态。
- STOP:进入结束状态则表明传输完成,检测下一轮接收开始信号。若按照预期的情况出现,则可以进入IDLE状态准备下一轮接收;否则进入WAIT。
- WAIT:结束标志位没有按照预期的情况出现,说明接收不成功。停留在此状态,直到结束标志位出现,一旦出现即可进入IDLE状态准备下一轮接收。
- done信号出现的时刻是STOP状态的下一时刻(见波形图)。红圈是parity校验位采集沿,绿圈是结束标志位采集沿,起作用的odd值正是两个圈中间的时间段。
代码
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output [7:0] out_byte,
output done
);
// Modify FSM and datapath from Fsm_serialdata
parameter IDLE=4'd0,START=4'd1,S0=4'd2,S1=4'd3,S2=4'd4,S3=4'd5,S4=4'd6;
parameter S5=4'd7,S6=4'd8,S7=