由于之前学习FPGA的过程中,没有做一个良好的记录,以及已学知识的扩展,所以从今天开始每一个实验例程和扩展应用,都要做文档记录。本实验,是基于正点原子达芬奇xc7a35tfgg484-2开发板。开发板时钟为50Mhz,采用RS232的通信协议。
1.UART串口通信简介
串口数据的发送与接收都是基于帧结构的,即一帧一帧的发送与接收数据。每一帧除了中间包含8bit有效数据外,还在每一帧的开头都必须要有一个起始位,且固定为0;在每一帧的结束时,也必须要有一个停止位,且固定为1,即最基本的帧结构(不包括校验等)有10bit。在不发送或不接收数据的情况下,rx和tx处于空闲状态,此时rx和tx都保持高电平。
后续则在上述实验原理的基础下,完成以下两个实验。
2.实验一:回环测试
输入回环测试,即输入即输出。当上位机通过串口调试工具发送数据给FPGA,FPGA再通过串口接收数据并将接收到的数据返送给上位机,完成串口数据回环。
2.1.串口接收模块
串口发送模块将输入的8位并行数据进行串行输出。串口发送模块uart_rx代码如下:
module uart_rx
#(
parameter UART_BPS = 'd19200,
parameter CLK_FREQ = 'd50_000_000
)
(
input wire sys_clk,
input wire sys_rst_n,
input wire rx,
output reg [7:0] Po_data,
output reg Po_flag
);
parameter BAUD_CNT_MAX = CLK_FREQ/UART_BPS ;
reg rx_reg1;
reg rx_reg2;
reg rx_reg3;
reg start_nedge;
reg work_en;
reg [15:0] baud_cnt;
reg bit_flag;
reg [3:0] bit_cnt;
reg [7:0] rx_data;
reg rx_flag;
//插入两级寄存器进行数据同步,用来消除亚稳态
always@(posedge sys_clk or negedge sys_rst_n)begin
if(sys_rst_n == 1'b0)
rx_reg1 <= 1'b1;
else
rx_reg1 <= rx;
end
always@(posedge sys_clk or negedge sys_rst_n)begin
if(sys_rst_n == 1'b0)
rx_reg2 <= 1'b1;
else
rx_reg2 <= rx_reg1;
end
always@(posedge sys_clk or negedge sys_rst_n)begin
if(sys_rst_n == 1'b0)
rx_reg3 <= 1'b1;
else
rx_reg3 <= rx_reg2;
end
always@(posedge sys_clk or negedge sys_rst_n)begin
if(sys_rst_n =&