FPGA基础程序学习
第二节 UART通信
串行通信:同步串行通信和异步串行通信。同步串行通信需要双方在同一时钟下,同步传输;异步串行通信指双方用各自的时钟控制数据的发送和接收。
UART 是一种采用异步串行通信方式的通用异步收发传输器,它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。UART 串口通信需要两根信号线来实现,一根用于发送,另外一根负责接收。UART 在发送或接收过程中的一帧数据由 4 部分组成,起始位、数据位、奇偶校验位和停止位。其中,起始位标志着一帧开始,停止位标志着一帧结束,数据位是一帧数据中的有效数据。校验位分为奇校验和偶校验,用于检验数据在传输过程中是否出错。奇校验时,发送方应使数据位中 1 的个数与校验位中 1 的个数之和为奇数;接收方在接收数据时,对 1 的个数进行检查,若不为奇数,则说明数据在传输过程中出了差错。同样,偶校验则检查 1 的个数是否为偶数。
顶层
uart_recv 为串口接收模块,从串口接收口 uart_rxd 接收上位机发送的数据,并在一帧数据接收结束后给出通知信号 uart_done。
uart_send 为串口发送模块, uart_en 为使能信号。uart_en 的上升沿启动一次串口发送,将uart_din 接口上的数据通过串口发送端口 uart_txd 发送出去。
uart_loop 模块负责完成串口数据的环回功能。它在 uart_recv 模块接收完成后,将接收到的数据发送到 uart_send 模块,并通过 send_en 接口给出一个上升沿,以启动发送过程。
在写代码前,首先要确定串口通信的数据格式及波特率。我们选择串口比较常用的一种模式,数据位为 8 位,停止位为 1 位,无校验位,波特率为 115200bps。时钟频率 CLK_FREQ 与串口波特率 UART_BPS,使用时根据系统需求设置。在模块例化时将这个变量传递到串口接收与发送模块中,从而实现不同速率的串口通信。
接收、发送、回环三大模块顶层
接收模块
信号定义,写程序要前有清晰的认识,
理清楚逻辑,分成多段写程序,更加清晰,注意注释的书写。
//数据接收完毕后给出标志信号并寄存输出接收到的数据
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
uart_data <= 8’d0;
uart_done <= 1’b0;
end
else if(rx_cnt == 4’d9) begin //接收数据计数器计数到停止位时
uart_data <= rxdata; //寄存输出接收到的数据
uart_done <= 1’b1; //并将接收完成标志位拉高
end
else begin
uart_data <= 8’d0;
uart_done <= 1’b0;
end
end
今天放假,文章草率,改日修改,