欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FPGA(9) 实验综合4 串口操作

程序员文章站 2022-06-08 22:56:25
...

串口通信原理

处理器与外部设备通信的两种方式:并行通信和串行通信(前面回忆过了

串行通信的通信方式:同步通信和异步通信
同步通信:带时钟同步信号的数据传输;发送方和接收方在同一时钟的控制下,同步传输数据
异步通信:不带时钟同步信号的数据传输。发送方于接收方使用各自的时钟控制数据的发送和接收过程

串行通信的传输方向:
单工:数据只能沿一个方向传输
半双工:数据传输可以沿两个方向,但需要分时进行
全双工:数据可以同时进行双向传输(这里的方向不是是同一条数据线上的方向)

串口通信就是串行异步全双工的传输,iic spi就是同步的。但iic是半双工,spi全双工

UART基础知识

采用异步串行通信方式的通用异步收发传输器
发送数据时将并行数据转换为串行数据
接收数据时将串行数据转换成并行数据

协议层

数据格式:
需要rx,tx两根信号线实现
FPGA(9) 实验综合4 串口操作

校验位分为奇校验和偶校验
保证数据位和校验位中1的个数之和为奇数/偶数,接收方在检查时发现1的个数不为奇数/偶数 则数据出错

传输速率
用波特率表示,每秒内传输二进制数据的位数。

物理层

接口标准
FPGA(9) 实验综合4 串口操作

串口通信实验

规定:数据位为8位,停止位为1位,无校验位
波特率115200bps

//边沿检测常用程序
assign  start_flag = uart_rxd_d1 & (~uart_rxd_d0);  
always @(posedge sys_clk or negedge sys_rst_n) begin 
    if (!sys_rst_n) begin 
        uart_rxd_d0 <= 1'b0;
        uart_rxd_d1 <= 1'b0;          
    end
    else begin
        uart_rxd_d0  <= uart_rxd;                   
        uart_rxd_d1  <= uart_rxd_d0;
    end   
end

检测到下降沿则开始,前面图有

always @(posedge sys_clk or negedge sys_rst_n) begin         
    if (!sys_rst_n)                                  
        rx_flag <= 1'b0;
    else begin
        if(start_flag)                       
            rx_flag <= 1'b1;                  
        else if((rx_cnt == 4'd9)&&(clk_cnt == BPS_CNT/2))
            rx_flag <= 1'b0;                    
        else
            rx_flag <= rx_flag;
    end
end

将flag标记为1,后面还需要对接收到的数据位数计数

always @(posedge sys_clk or negedge sys_rst_n) begin 
    if ( !sys_rst_n)  
        rxdata <= 8'd0;                                     
    else if(rx_flag)                          
        if (clk_cnt == BPS_CNT/2) begin        
            case ( rx_cnt )
             4'd1 : rxdata[0] <= uart_rxd_d1;  
             4'd2 : rxdata[1] <= uart_rxd_d1;
             4'd3 : rxdata[2] <= uart_rxd_d1;
             4'd4 : rxdata[3] <= uart_rxd_d1;
             4'd5 : rxdata[4] <= uart_rxd_d1;
             4'd6 : rxdata[5] <= uart_rxd_d1;
             4'd7 : rxdata[6] <= uart_rxd_d1;
             4'd8 : rxdata[7] <= uart_rxd_d1;   
             default:;                                    
            endcase
        end
        else 
            rxdata <= rxdata;
    else
        rxdata <= 8'd0;
end

最关键的部分 将串行数据转为并行

//----------------------------------------------------
发送部分关键代码:
经过上升沿检测后,将并行转为串行

always @(posedge sys_clk or negedge sys_rst_n) begin        
    if (!sys_rst_n)  
        uart_txd <= 1'b1;        
    else if (tx_flag)
        case(tx_cnt)
            4'd0: uart_txd <= 1'b0;          
            4'd1: uart_txd <= tx_data[0];   
            4'd2: uart_txd <= tx_data[1];
            4'd3: uart_txd <= tx_data[2];
            4'd4: uart_txd <= tx_data[3];
            4'd5: uart_txd <= tx_data[4];
            4'd6: uart_txd <= tx_data[5];
            4'd7: uart_txd <= tx_data[6];
            4'd8: uart_txd <= tx_data[7];  
            4'd9: uart_txd <= 1'b1;        
            default: ;
        endcase
    else 
        uart_txd <= 1'b1;                
end

通过串口调试助手验证

FPGA(9) 实验综合4 串口操作

相关标签: 嵌入式