能够做代理的网站,有哪个理财网站是专门做汽车抵押的,南京企业网站建设,上海做公司网站UART串口接收模块
背景 在之前就有写过关于串口模块的文章——《串口RS232的学习》。工作后很多项目都会用到串口模块#xff0c;又来重新理解一下FPGA串口接收的代码思路。 关于串口相关的参数#xff0c;以及在文章《串口RS232的学习》中已有详细的描述#xff0c;这里就…UART串口接收模块
背景 在之前就有写过关于串口模块的文章——《串口RS232的学习》。工作后很多项目都会用到串口模块又来重新理解一下FPGA串口接收的代码思路。 关于串口相关的参数以及在文章《串口RS232的学习》中已有详细的描述这里就不过多的赘述了。
uart_rx模块理解 一般来说用FPGA实现串口数据的接收其模块的输入和输出大多都会写成以下形式。 在该模块的输入端时钟和复位信号不必多说FPGA模块的Rx信号则是通过串口线与上位机的Tx端相连接进行数据的传输。 而在该模块的输出端Rx_ready信号代表一帧数据起始位数据校验位停止位校验位不一定有的接收完成当上位机传输了一帧数据之后Rx_ready信号会被拉高一个时钟周期代表接收到了一帧数据而Rx_data一般代表一帧数据中的8位数据当Rx_ready信号被拉高时Rx_data上位机发送过来的8位数据。 uart_rx接收数据后的处理 假设上位机向我们的FPGA板卡发送9 Byte的数据这9 Byte的数据分别为8H11、8H22、8H33、8H44、8H55、8H66、8H77、8H88、8H99。我们应该如何接收呢 在不考虑超时处理和校验处理的情况下可以用以下代码来接收上位机向FPGA板卡发送的数据。 parameter MAX_RX_DATA_NUM 10//接收最大的字节个数假设为10reg [1:0] r_rx_ready; //缓存数据便于采集沿
reg [15:0] rx_data_length; //接收数据的长度
reg [MAX_RX_DATA_NUM*8-1:0] rx_data_sum; //每个字节为10Bit10字节所占的Bit为10*8//当r_rx_ready2b01时代表一帧数据的接收完成。
always(posedge clk or negedge rst_n)beginif(!rst_n)r_rx_ready 2b00;elser_rx_ready {r_rx_ready[0],rx_ready}
end//当r_rx_ready2b01时代表接收到了一个字节的数据接收数据的长度1
//由于接收9字节的数据则rx_data_length的最大值为8
always(posedge clk or negedge rst_n)beginif(!rst_n)rx_data_length 16’b0;else if(r_rx_ready2b01)rx_data_length rx_data_length 1b1;elserx_data_length rx_data_length;
end//将从上位机接收到的9字节数据先发送的数据存入高位按序依次放入rx_data_sum中
//此时rx_data_sum[79:72]8H11;rx_data_sum[71:64]8H22;.....rx_data_sum[15:8]8H99;rx_data_sum[7:0]8H00;
always(posedge clk or negedge rst_n)beginif(!rst_n)rx_data_sum d0;else if(r_rx_ready2b01)rx_data_sum[((MAX_RX_DATA_NUM-rx_data_length)*8-1)-:8] rx_data;elserx_data_sum rx_data_sum;
end