前言
UART是一种常用的串行通信协议,RS485则是一种用于长距离和抗干扰的物理层标准。结合UART和RS485可以实现可靠的数据传输,特别是在多点通信和长距离应用中。通过合适的硬件连接、软件配置和验证测试,可以确保这一通信系统的稳定性和数据完整性。
正文
一、UART通信实现与验证(RS485)
1.项目需求
A板通过按键控制B板led灯进行流水灯效果或呼吸灯效果,反过来也可以实现
2.技术介绍
RS-485是双向、半双工通信协议,信号采用差分传输方式,允许多个驱动器和接收器挂接在总线上,其中每个驱动器都能够脱离总线。适合远距离传输(最远1200米,最快10MB/s),RS232适合一主机一从机,RS485允许多主机和多从机的连接,抗干扰能力强。
RS485工作时,通过差分信号线检测传输到来的电平信号,通常检测该电平信号有专用的RS485收发器芯片,该类芯片可以检测到低至200MV的电平信号,不同于RS232收发器芯片的是该芯片需要有一使能信号进行数据传入/传出使能。在帧结构上于RS232相同,1波特起始位,8波特数据位,1波特停止位。
因为帧结构上于RS232相同,故利用RS232工程的收发模块,对其简单调整,即可实现RS485通信。完成实验任务还需要按键消抖,呼吸灯,流水灯模块。对接受到的帧数据另外需用一个模块对接收串并处理后的数据进行抽位判断,并将呼吸灯,流水灯显示效果按照判断结果进行选择输出,以上完成实验任务。
3.顶层架构
为方便仿真,在连线时调用按键消抖,但是按键直接给到flag上,并未使用按键消抖,如果需要实物验证,可将连线自行连接。
4.端口描述
clk | 时钟(50Mhz) |
rst_n | 复位按键(低电平有效) |
rx | 数据接收端口 |
key_w | 按键(流水灯) |
key_y | 按键(呼吸灯) |
tx | 数据发送端 |
re | RS485收发器芯片使能信号 |
led[3:0] | led灯输出 |
二、代码验证
data_led:状态选择模块
module data_led(
input clk ,
input rst_n ,
input flag_w ,//按键有效信号,持续一个时钟
input flag_y ,//按键有效信号,持续一个时钟
input led ,//呼吸灯
input [3:0] led_da ,//流水灯
input [7:0] data ,//收模块处理后的数据
output reg [3:0] led_out ,//LED选择结果
output wire po_flag ,//发模块使能
output wire [7:0] po_data //发数据
);
reg w_en;//流水灯工作输出
reg y_en;//呼吸灯工作输出
always@(posedge clk,negedge rst_n)//按键按下后,划分工作状态
begin
if(rst_n == 0)
w_en <= 1'b0;
else
if(flag_y == 1'b1)//相互清零,避免影响
w_en <= 1'b0;
else
if(flag_w == 1'b1)//按下一次,流水灯,按下2次,led输出清零
w_en <= ~w_en;
else
w_en <= w_en;
end
always@(posedge clk,negedge rst_n)//按键按下后,划分工作状态
begin
if(rst_n == 0)
y_en <= 1'b0;
else
if(flag_w == 1'b1)//相互清零,避免影响
y_en <= 1'b0;
else
if(flag_y == 1'b1)//按下一次,流水灯,按下2次,led输出清零
y_en <= ~y_en;
else
y_en <= y_en;
end
always@(posedge clk,negedge rst_n)//对收到的数据进行检测
begin
if(rst_n == 0)
led_out <= 4'b0000;
else
if(data[0] == 1'b1)
led_out <= led_da;//流水灯
else
if(data[1] == 1'b1)//呼吸灯
led_out <= {led,led,led,led};
else
led_out <= 4'b0000