// 第一段:组合逻辑,状态转移 always @(*) begin case (state) START: begin next_state = ONE; // 起始位后去第1位 end ONE: begin next_state = TWO; end TWO: begin next_state = THREE; end THREE: begin next_state = FOUR; end FOUR: begin next_state = FIVE; end FIVE: begin next_state = SIX; end SIX: begin next_state = SEVEN; end SEVEN: begin next_state = EIGHT; end EIGHT: begin if (in) begin next_state = STOP; // 正确的停止位 endelsebegin next_state = WAIT; // 错误的停止位,等待 end end STOP: begin if (in) begin next_state = IDLE; // 线路回到空闲 endelsebegin next_state = START; // 新的起始位来了 end end WAIT: begin if (in) begin next_state = IDLE; // 等到线路回到空闲 endelsebegin next_state = WAIT; end end IDLE: begin if (~in) begin next_state = START; // 检测到起始位(0) endelsebegin next_state = IDLE; end end default: begin next_state = IDLE; end endcase end
// 第二段:时序逻辑,状态更新 always @(posedge clk) begin if (reset) begin state <= IDLE; // 复位到空闲状态 endelsebegin state <= next_state; end end
// 第一段:组合逻辑,状态转移 always @(*) begin case (current_state) IDLE: begin if (~in) begin next_state = START; // 检测到起始位 endelsebegin next_state = IDLE; end end START: begin next_state = DATA; // 去数据接收状态 end DATA: begin if (counter == 4'd8) begin next_state = in ? STOP : WAIT; // 8位收完,看停止位 endelsebegin next_state = DATA; // 继续接收数据 end end STOP: begin next_state = in ? IDLE : START; // 看是否有新的起始位 end WAIT: begin next_state = in ? IDLE : WAIT; // 等待线路回到空闲 end default: begin next_state = IDLE; end endcase end
// 第二段:时序逻辑,状态更新 always @(posedge clk) begin if (reset) begin current_state <= IDLE; endelsebegin current_state <= next_state; end end
// 第三段:数据通路和计数器 always @(posedge clk) begin if (reset) begin done <= 1'd0; out_byte <= 8'd0; counter <= 4'd0; endelsebegin case (next_state) // 注意:用next_state! IDLE: begin done <= 1'd0; out_byte <= 8'd0; counter <= 4'd0; end START: begin done <= 1'd0; out_byte <= 8'd0; counter <= 4'd0; end DATA: begin done <= 1'd0; out_byte <= 8'd0; par_in[counter] <= in; // 用counter做索引! counter <= counter + 1'd1; end STOP: begin done <= 1'd1; out_byte <= par_in; // 输出完整数据 counter <= 4'd0; end WAIT: begin done <= 1'd0; out_byte <= 8'd0; counter <= 4'd0; end endcase end end
// 第一段:组合逻辑,状态转移 always @(*) begin case (current_state) IDLE: begin if (~in) begin next_state = START; endelsebegin next_state = IDLE; end end START: begin next_state = DATA; end DATA: begin if (counter == 4'd9) begin next_state = in ? STOP : WAIT; // 9位收完(8+1) endelsebegin next_state = DATA; end end STOP: begin next_state = in ? IDLE : START; end WAIT: begin next_state = in ? IDLE : WAIT; end default: begin next_state = IDLE; end endcase end
// 第二段:时序逻辑,状态更新 always @(posedge clk) begin if (reset) begin current_state <= IDLE; endelsebegin current_state <= next_state; end end
// 第三段:数据通路和计数器 always @(posedge clk) begin if (reset) begin done <= 1'd0; out_byte <= 8'd0; counter <= 4'd0; endelsebegin case (next_state) IDLE: begin done <= 1'd0; out_byte <= 8'd0; counter <= 4'd0; end START: begin done <= 1'd0; out_byte <= 8'd0; counter <= 4'd0; end DATA: begin done <= 1'd0; out_byte <= 8'd0; counter <= counter + 1'd1; data_in[counter] <= in; end STOP: begin // 只有奇偶校验正确时,done才置1 done <= odd_temp ? 1'd1 : 1'd0; out_byte <= odd_temp ? data_in[7:0] : 8'd0; counter <= 4'd0; end WAIT: begin done <= 1'd0; out_byte <= 8'd0; counter <= 4'd0; end endcase end end