// 接收数据 always @(posedge clock, negedge nrst) begin if (!nrst) begin // 模块复位 bit_i <= 10; counter <= 0; received <= 0; end elsebegin if (bit_i <= 9) begin if (bit_end) begin // 当前位结束, 准备接收下一位 bit_i <= bit_i + 1'b1; counter <= 0; end elsebegin if (bit_sample) begin // 当前位数据采样 if (bit_i == 0 && _rx) bit_i <= 10; // 起始位错误, 停止接收 elseif (bit_i >= 1 && bit_i <= 8) data[bit_i - 1] <= _rx; // 收到数据位 elseif (bit_i == 9) begin // 收到停止位 bit_i <= 10; // 接收完毕 if (_rx) received <= 1; end end counter <= counter + 1; end end elseif (!_rx) begin // 检测到起始位, 开始接收 bit_i <= 0; counter <= 1; received <= 0; end elsebegin // 空闲 if (bit_end) begin counter <= 0; received <= 0; end elseif (counter != 0) counter <= counter + 1; end end end endmodule