协议描述
- 常见的三大低速通信协议之一,UART,通用异步收发协议。
- 非常简单的协议,协议细节不需要多说,只说需要注意的点。
- 空闲位为高位,起始位为低位,8位数据,校验位,停止位为高位,一共11位数据,空闲位不算在发送的数据之中,因为它和停止位是相同的。这样才符合异步传送的连续性逻辑。
- 发送的逻辑比较简单,直接利用系统时钟和波特率产生我们需要的发送脉冲,也就是波特率发送脉冲,脉冲需要计数11次,当计数完成时,表示发送完毕,给出done信号。
- 接受逻辑主要要考虑两个点,第一,当数据从空闲态进入起始位时是一个下降沿,需要检测工业的实际接受需要采样很多次,因此我们给出一个16倍频的时钟去采样16ci,取中间的6次作为样本,然后计算他们的和,若大于等于4,则判断为1,否则为0,不考虑3个1和3个0的情况,也就是第三位为1的时候,则为1,否则为0。其余的逻辑都和发送类似,不再赘述。
- 校验逻辑是否正确可以直接将发送的数据接口接入到接受的数据接口,

然后观察接受的数据和发送的是否一致即可。比如下面这样:

关键代码逻辑
- uart_rx逻辑关键代码:
assign nedge = !tmp0_Rs232_Rx && tmp1_Rs232_Rx;
always @ (posedge clk or negedge rst_n) beginif (!rst_n) begintmp0_Rs232_Rx <= 1'b0;tmp1_Rs232_Rx <= 1'b0;endelse begintmp0_Rs232_Rx <= s1_Rs232_Rx;tmp1_Rs232_Rx <= tmp0_Rs232_Rx;end
end
always @ (posedge clk or negedge rst_n) beginif (!rst_n) begindata_byte <= 8'd0;endelse if (bps_cnt == 8'd159) begindata_byte[0] <= r_data_byte[0][2];data_byte[1] <= r_data_byte[1][2];data_byte[2] <= r_data_byte[2][2];data_byte[3] <= r_data_byte[3][2];data_byte[4] <= r_data_byte[4][2];data_byte[5] <= r_data_byte[5][2];data_byte[6] <= r_data_byte[6][2];data_byte[7] <= r_data_byte[7][2];end
end
- uart_tx逻辑关键代码:
always @ (posedge clk or negedge rst_n) beginif (!rst_n) beginbps_clk <= 1'b0;endelse if (div_cnt == 1'b1) beginbps_clk <= 1'b1;endelse beginbps_clk <= 1'b0;end
end
写在最后
- 保持节奏,戒骄戒躁!