RS232串口经常使用在PC机与FPGA通信中,用于两者之间的数据传输,因为UART协议简单、易实现,故经常使用。
DB9接口只需要使用3根线,RXD(2)、TXD(3)和GND(5),如下图所示。而用FPGA实现控制器时只需要利用RXD和TXD两根线即可完成串口通信。
UART的异步通信协议如下所示:
1. 首先接受双方提前定义好通信的速度和格式等信息;
2. 如果是空闲状态,发送器一直将数据线拉高;
3. 开始通信时,发送器将数据线拉低,从而接收器能知道数据字节即将过来;
4. 数据位通常是8位,低位先发送,高位后发送;
5. 停止通信时,发送器将数据线再次拉高。
控制器包括3部分:波特率发生器、发送器和接收器,本设计发送器和接收器都带有异步FIFO缓存数据。本设计完成如下功能;串口助手发送数据字节给FPGA,FPGA将数据返回给串口助手。波特率采用11520bps,数据格式1位开始位、8位数据位和1位停止位,无校验位。
1. 波特率发生器
波特率发生器需要对主时钟进行分频生成发送器和接收器的工作时钟。发送器的时钟就等于波特率,而接收器的时钟频率是波特率的8倍或者16倍,即对发送器发过来的数据进行过采样以获得准确的数据。下面是接收器和发送器的分频系数。
parameter Div_rcv = Clk_freq/Bandrate/16-1; //8倍
parameter Div_trans = Clk_freq/Bandrate/2-1;
发送完一个数据字节后,等待FIFO_T非空或者FIFO_R非空。
2. 发送器
发送器发送的数据从FIFO_T中读取,而FIFO_T数据是从FIFO_R获得。如果FIFO_T非空,读取一个数据字节并在末尾添加数据位0(开始通信位,拉低数据线),下一步进行9次右移操作,串行输出数据位。
XMT_shftreg <= { 1‘b1,XMT_shftreg[word_size:1]};
assign Serial_out = XMT_shftreg[0];
3. 接收器
本设计采样时钟频率是波特率的8倍,数据有效的中间时刻采样数据,即在第4个采样时钟获取数据。先采样到起始数据0之后,通过一个计数器计满8个时钟采样下一个有效数据。当采样获得8位数据后将8位数据写入FIFO_R,从而产生非空信号准备供发送器FIFO_T读取。
RCV_shftreg <= {Serial_in,RCV_shftreg[word_size - 1:1]};
4. 实验结果
在实验板测试UART通信,接收数据个数等于发送数据个数,能满足一般的通信要求。如果想提高准确度,可提高采样频率、增加校验位或者增加停止位个数(1.5或2)。
此外,3个模块可以共使用一个系统时钟clk。接收器和发送器工作时钟可以作为clk的时钟使能信号,这样这个设计就只使用了一个时钟。
RS232串口通信