FPGA(9) 实验综合4 串口操作
程序员文章站
2022-06-08 22:56:25
...
串口通信原理
处理器与外部设备通信的两种方式:并行通信和串行通信(前面回忆过了
串行通信的通信方式:同步通信和异步通信
同步通信:带时钟同步信号的数据传输;发送方和接收方在同一时钟的控制下,同步传输数据
异步通信:不带时钟同步信号的数据传输。发送方于接收方使用各自的时钟控制数据的发送和接收过程
串行通信的传输方向:
单工:数据只能沿一个方向传输
半双工:数据传输可以沿两个方向,但需要分时进行
全双工:数据可以同时进行双向传输(这里的方向不是是同一条数据线上的方向)
串口通信就是串行异步全双工的传输,iic spi就是同步的。但iic是半双工,spi全双工
UART基础知识
采用异步串行通信方式的通用异步收发传输器
发送数据时将并行数据转换为串行数据
接收数据时将串行数据转换成并行数据
协议层
数据格式:
需要rx,tx两根信号线实现
校验位分为奇校验和偶校验
保证数据位和校验位中1的个数之和为奇数/偶数,接收方在检查时发现1的个数不为奇数/偶数 则数据出错
传输速率
用波特率表示,每秒内传输二进制数据的位数。
物理层
接口标准
串口通信实验
规定:数据位为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
通过串口调试助手验证
上一篇: php给rar文件添加解压说明实现代码
下一篇: 学习ZYNQ之FPGA7(基础语法2)