串口RS485

1.原理

全双工:在同一时刻可以同时进行数据的接收和数据的发送,两者互不影响

半双工:在同一时刻只能进行数据的接收或者数据的发送,两者不能同时进行

差分信号幅值相同,相位相反,有更强的抗干扰能力。

干扰对差分信号的影响都是相同的,所以差分信号的干扰一相减就没有了

RS485的优点,采用差分信号有更强的抗干扰能力;相比RS232能能进行长距离传输(RS485要用到收发器芯片,收发器的灵敏度是很高的,可以检测到低至200mv的电压,表示传输信号在千米之外都可以恢复,最远的通信距离可以达到1200米左右,速度最快10MB/s,速度和距离是成反比的,速度越小,传输距离越长,长距离的通信可以增加RS485的中继器);缺点就是只支持半双工。

RE是低电平有效,表示数据的收,当接收时,RE=0,DE=0;然后芯片将差分信号转换为单端信号。当RE=1,DE=1时,数据发送,将单端信号转换为差分信号。

485和232使用相同的传输协议

2.代码

以上是控制板的波形图

以上是被控板的时序图

2.1 led_ctrl.v

module led_ctrl(input wire 			sys_clk		,input wire 			sys_rst_n	,input wire [3:0]	led_out_w	,//流水灯input wire			led_out_b   ,//呼吸灯input wire [7:0]	pi_data		,input wire 			key_flag_w	,input wire 			key_flag_b	,output reg  [3:0]	led			,output wire  [7:0]	po_data		,output wire 		po_flag	
);reg w_en;
reg b_en;assign po_data={6'b000_000,b_en,w_en};
assign po_flag=key_flag_b||key_flag_w;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)w_en<=1'b0;else if(key_flag_b==1'b1)w_en<=1'b0;else if(key_flag_w==1'b1)w_en<=~w_en;elsew_en<=w_en;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)b_en<=1'b0;else if(key_flag_w==1'b1)b_en<=1'b0;else if(key_flag_b==1'b1)b_en<=~b_en;else b_en<=b_en;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)led<=4'b1111;else if(po_data[0]==1'b1)led<=led_out_w;else if(po_data[1]==1'b1)led<=led_out_b;elseled<=4'b1111;endmodule

2.2 uart_tx.v

闲杂输出的赋值条件不再是bit_flag信号,而是使能信号,rx下降沿延迟work_en一个周期,因为是时序逻辑,而且只延迟一个时钟周期,一个Bit传输有5208个周期。若是想对齐可以把work_en打一拍

module uart_tx
#(parameter UART_BPS='d9600,parameter CLK_FREQ='d50_000_000)(input wire 			sys_clk			,input wire 			sys_rst_n		,input wire [7:0]	pi_data			,input wire 			pi_flag			,output reg 			work_en			,output reg 			tx		
);parameter BAUD_CNT_MAX=CLK_FREQ/UART_BPS;reg [15:0]	baud_cnt;
reg bit_flag;
reg [3:0]bit_cnt;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)work_en<=1'b0;else if ((bit_cnt==4'd9)&&(bit_flag==1'b1))work_en<=1'b0;else if(pi_flag==1'b1)work_en<=1'b1;elsework_en<=work_en;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)baud_cnt<=16'd0;else if((baud_cnt==BAUD_CNT_MAX-1'b1)||(work_en==1'b0))baud_cnt<=16'd0;else if(work_en==1'b1)baud_cnt<=baud_cnt+1'b1;elsebaud_cnt<=baud_cnt;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)bit_flag<=1'b0;else if (baud_cnt==BAUD_CNT_MAX-1'b1) //因为只有使能信号为高电平时,使能信号才进行计数,使能信号为低电平,波特计数器为0。所以不适合用计数值为0来作为条件bit_flag<=1'b1;else bit_flag<=1'b0;
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)bit_cnt<=4'd0;else if((bit_cnt==4'd9)&&(bit_flag==1'b1))bit_cnt<=4'd0;else if(bit_flag==1'b1)bit_cnt<=bit_cnt+1'b1;elsebit_cnt<=bit_cnt;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)tx<=1'b1;else if(work_en==1'b1)case(bit_cnt)4'd0: tx<=1'b0;4'd1: tx<=pi_data[0];4'd2: tx<=pi_data[1];4'd3: tx<=pi_data[2];4'd4: tx<=pi_data[3];4'd5: tx<=pi_data[4];4'd6: tx<=pi_data[5];4'd7: tx<=pi_data[6];4'd8: tx<=pi_data[7];4'd9: tx<=1'b1;default:tx<=1'b1;endcase
endmodule

2.3 rs485.v

module rs485(input wire		sys_clk		,input wire 		sys_rst_n	,input wire	    key_in_w	,input wire		key_in_b	,input wire 		rx			,output wire 	tx			,output wire 	re			,output wire[3:0]led
);parameter KEY_CNT_MAX=20'd999_999;
parameter WATER_LED_CNT_MAX=25'd24_999_999;parameter CNT_1US_MAX  =    6'd49	 ,CNT_1MS_MAX  =    10'd999  ,CNT_1S_MAX   =    10'd999  ;parameter UART_BPS=9600,CLK_FREQ=50_000_000;wire w_flag;
wire b_flag;
wire [3:0]w_led;
wire b_led;        
wire [7:0]rx_data;	
wire [7:0]po_data;
wire po_flag;key_filter
#(.CNT_MAX(KEY_CNT_MAX)
)
key_filter_inst_w
(.sys_clk	(sys_clk	)		,.sys_rst_n	(sys_rst_n	)	,.key_in		(key_in_w	)	,.key_flag	(w_flag)	
);key_filter
#(.CNT_MAX(KEY_CNT_MAX)
)
key_filter_inst_b
(.sys_clk	(sys_clk	)		,.sys_rst_n	(sys_rst_n	)	,.key_in		(key_in_b	)	,.key_flag	(b_flag	)	
);water_led
#(.CNT_MAX(WATER_LED_CNT_MAX)
)
water_led_inst
(.sys_clk	(sys_clk	),.sys_rst_n	(sys_rst_n	),.led_out	(w_led	)
);breath_led#(.CNT_1US_MAX(CNT_1US_MAX ),.CNT_1MS_MAX(CNT_1MS_MAX ),.CNT_1S_MAX (CNT_1S_MAX  ))
breath_led_inst
(.sys_clk	(sys_clk	)	,.sys_rst_n	(sys_rst_n),.led_out    (b_led  )
);uart_rx
#(.UART_BPS(UART_BPS),.CLK_FREQ( CLK_FREQ )
)
uart_rx_inst
(.sys_clk	(sys_clk	)		,.sys_rst_n	(sys_rst_n	)	,.rx			(rx			)	,.po_data	(rx_data	)		,.po_flag    ()
);led_ctrl led_ctrl_inst(.sys_clk	(sys_clk)	,.sys_rst_n	(sys_rst_n),.led_out_w	(w_led),.led_out_b  (b_led),.pi_data	(rx_data)	,.key_flag_w	(w_flag),.key_flag_b	(b_flag),.led		(led)	,.po_data	(po_data)	,.po_flag	(po_flag)
);uart_tx
#(.UART_BPS(UART_BPS    	),.CLK_FREQ(CLK_FREQ ))
uart_tx_inst
(.sys_clk	(sys_clk)		,.sys_rst_n	(sys_rst_n)	,.pi_data	(po_data)		,.pi_flag	(po_flag)		,.work_en	(re)		,.tx		    (tx)
);endmodule

2.4 tb_rs485.v

`timescale 1ns/1nsmodule tb_rs485();reg sys_clk;
reg sys_rst_n;
reg key_in_w	;
reg key_in_b	;
reg rx			;
wire tx;
wire re;
wire [3:0]led;initial beginsys_clk=1'b1;sys_rst_n<=1'b0;key_in_b<=1'b1;key_in_w<=1'b1;#20sys_rst_n<=1'b1;//流水灯#2000000  key_in_w<=1'b0; //按下流水灯的按键#20 	  key_in_w<=1'b1;#20 	  key_in_w<=1'b0;#20 	  key_in_w<=1'b1; //模拟前抖动#20 	  key_in_w<=1'b0; //模拟稳定状态#200  	  key_in_w<=1'b1; //模拟后抖动#20 	  key_in_w<=1'b0;#20 	  key_in_w<=1'b1;#20 	  key_in_w<=1'b0;#20 	  key_in_w<=1'b1;//呼吸灯#2000000  key_in_b<=1'b0;#20 	  key_in_b<=1'b1;#20 	  key_in_b<=1'b0;#20 	  key_in_b<=1'b1;#20 	  key_in_b<=1'b0;#200  	  key_in_b<=1'b1;#20 	  key_in_b<=1'b0;#20 	  key_in_b<=1'b1;#20 	  key_in_b<=1'b0;#20 	  key_in_b<=1'b1;//呼吸灯#2000000  key_in_b<=1'b0;#20 	  key_in_b<=1'b1;#20 	  key_in_b<=1'b0;#20 	  key_in_b<=1'b1;#20 	  key_in_b<=1'b0;#200  	  key_in_b<=1'b1;#20 	  key_in_b<=1'b0;#20 	  key_in_b<=1'b1;#20 	  key_in_b<=1'b0;#20 	  key_in_b<=1'b1;//流水灯#2000000  key_in_w<=1'b0;#20 	  key_in_w<=1'b1;#20 	  key_in_w<=1'b0;#20 	  key_in_w<=1'b1;#20 	  key_in_w<=1'b0;#200  	  key_in_w<=1'b1;#20 	  key_in_w<=1'b0;#20 	  key_in_w<=1'b1;#20 	  key_in_w<=1'b0;#20 	  key_in_w<=1'b1;endalways #10 sys_clk=~sys_clk;defparam rs485_inst0.KEY_CNT_MAX=5;
defparam rs485_inst0.WATER_LED_CNT_MAX=4000;
defparam rs485_inst1.WATER_LED_CNT_MAX=4000;
defparam rs485_inst0.CNT_1US_MAX=4;
defparam rs485_inst1.CNT_1US_MAX=4;
defparam rs485_inst0.CNT_1MS_MAX=9;
defparam rs485_inst1.CNT_1MS_MAX=9;
defparam rs485_inst0.CNT_1S_MAX=9;
defparam rs485_inst1.CNT_1S_MAX=9;
defparam rs485_inst0.UART_BPS=1000_000;
defparam rs485_inst1.UART_BPS=1000_000;//越大越快//控制板不用rx信号
rs485 rs485_inst0(.sys_clk	(sys_clk)	,.sys_rst_n	(sys_rst_n),.key_in_w	(key_in_w	),.key_in_b	(key_in_b	),.rx			(),//对于控制板来说,rx是无效的,因为我们只需要两路按键.tx			(tx),.re			(re),.led        ()//控制板的led灯一直是熄灭状态不需要引出来
);//被控板
rs485 rs485_inst1(.sys_clk	(sys_clk)	,.sys_rst_n	(sys_rst_n),.key_in_w	(	),//对于被控板来说,按键信号是无效的.key_in_b	(	),.rx			(tx),.tx			(),//tx和re没有用到不需要引出.re			(),.led        (led)
);endmodule

看控制模块

看被控模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/1375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vlan的学习笔记1

vlan&#xff1a; 1.一般情况下:以下概念意思等同: 一个vlan一个广播域 一个网段 一个子网 2.一般情况下: &#xff08;1&#xff09;相同vlan之间可以直接通信&#xff0c;不同vlan之间不能直接通信! &#xff08;2&#xff09;vlan技术属于二层技术&…

C语言中, 文件包含处理,#include< > 与 #include ““的区别

文件包含处理 指一个源文件可以将另外一个文件的全部内容包含进来 &#xff23;语言提供了#include命令用来实现文件包含的操作 #include< > 与 #include ""的区别 <> 表示系统直接按系统指定的目录检索 "" 表示系统先在 "" 指定…

Rust序列化和反序列化

Rust 编写python 模块 必备库 docker 启动 nginx 服务 NGINX 反向代理配置

MySQL下载与安装

文章目录 1&#xff1a;MySQL下载与安装2&#xff1a;配置环境变量3&#xff1a;验证是否安装成功 1&#xff1a;MySQL下载与安装 打开MySQL官网&#xff0c;MySQL 下载链接选择合适的版本和操作系统&#xff0c;页面跳转之后选择No thanks, just start my download.等待下载即…

linux中/etc/hosts文件的内容和功能

更准确的说是主机和ip地址映射绑定配置文件 用于主机名解析成ip地址的 转换配置 效果&#xff1a; 这个东西是局域网下面的解析&#xff0c;老师说是本地局域网解析 windows对应的就是

笔试狂刷--Day2(模拟高精度算法)

大家好,我是LvZi,今天带来笔试狂刷--Day2(模拟高精度算法) 一.二进制求和 题目链接:二进制求和 分析: 代码实现: class Solution {public String addBinary(String a, String b) {int c1 a.length() - 1, c2 b.length() - 1, t 0;StringBuffer ret new StringBuffer()…

4.9 启动系统任务❤❤❤

有一些特殊的任务需要在系统启动时执行&#xff0c;例如配置文件加载、数据库初始化等操作。 Spring Boot对此提供了两种解决方案&#xff1a;CommandLineRunner和ApplicationRunner。 CommandLineRunner和ApplicationRunner基本一致&#xff0c;差别主要体现在参数上。 1. Co…

FastChat启动与部署通义千问大模型

FastChat简介 FastChat is an open platform for training, serving, and evaluating large language model based chatbots. FastChat powers Chatbot Arena, serving over 10 million chat requests for 70 LLMs.Chatbot Arena has collected over 500K human votes from sid…

[SWPUCTF 2022 新生赛]android

安卓题第一次写 先解压&#xff0c;改apk后缀为zip再次解压用dex2jar反编译得到jar文件&#xff0c;再用jd-gui查看即可得到flag

AI大模型日报#0418:Stable Diffusion 3开放API、Meta新研究让AI Agent理解物理世界

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 微软刚发布了VASA-1 这个人工智能可以让单张图像具有生动的说话和歌唱能力 摘要: 微软发布了VASA-1人工智能&#xff0c;它能使单…

Webstorm 24.1 复制、剪切卡死问题官方回复

Webstorm 24.1 复制、剪切卡死问题官方回复 https://youtrack.jetbrains.com/issue/WEB-65787/WebStorm-2024.1-UI-was-frozen-for-N-ms-after-copy-paste 2024-04-20 更新&#xff1a; UI 卡死问题已于 2024-04-20。发布的 24.1.1 版本解决

Spark集群的搭建

1.1搭建Spark集群 Spark集群环境可分为单机版环境、单机伪分布式环境和完全分布式环境。本节任务是学习如何搭建不同模式的Spark集群&#xff0c;并查看Spark的服务监控。读者可从官网下载Spark安装包&#xff0c;本文使用的是spark-2.0.0-bin-hadoop2.7.gz。 1.1.1搭建单机版…

Linux——进程基本概念中篇

Linux——进程基本概念中篇 文章目录 Linux——进程基本概念中篇一、通过系统调用创建进程——fork1.1 fork的理解1.2 fork的返回值 二、进程状态2.1 运行状态2.2 睡眠状态和休眠状态2.3 停止状态和死亡状态2.4 僵尸进程2.5 孤儿进程2.6 前台和后台进程 三、进程优先级3.1 查看…

一文读懂Partisia Blockhain:兼顾去中心化、安全性与可扩展性

“Partisia Blockhain 解决了区块链领域长期存在的问题&#xff0c;其兼顾了去中心化、安全性以及可扩展性” Partisia Blockchain 是一个具有独特零知识证明预言机以及分片解决方案的 Layer1&#xff0c;解决了困扰整个区块链行业的问题。 目前&#xff0c;多样化的区块链层出…

个人开发微信小程序?我来劝退!

为什么小程序那么受欢迎&#xff1f; 相比传统app&#xff0c;小程序即点即用&#xff0c;免下载安装&#xff0c;这是小程序最明显的优势 但使得小程序真正能火爆&#xff0c;让众多开发者喜欢的原因&#xff0c;还是其强大的分享能力和多端互通能力。寄生与微信这么一个聊天…

SRIO系列-基本概念及IP核使用

参考&#xff1a;串行RapidIO: 高性能嵌入式互连技术 | 德州仪器 SRIO协议技术分析 - 知乎 PG007 目录 一、SRIO介绍 1.1 概要 1.2 SRIO与传统互联方式的比较 1.3 串行SRIO标准 1.4 SRIO层次结构&#xff1a; 1.4.1 逻辑层 1.4.2 传输层协议 1.4.3 物理层 二、Xilinx…

BADI-AC_DOCUMENT-交货单过账科目替代

BADI-AC_DOCUMENT-交货单过账科目替代 一、业务场景 事务代码VL02N/VL22N及其他交货单过账事务&#xff0c;在交货单过账生成会计凭证的时候对科目进行替代 二、BADI增强&#xff1a;AC_DOCUMENT 这个BADI理论上可以处理很多的会计凭证科目替代&#xff0c;不止是交货单过账…

服务注册与发现Eureka、Zookeeper、Consul 三个注册中心的异同点(CAP理论)

Eureka Eureka是由Netflix开源的一个服务注册和发现组件&#xff0c;它主要用于构建高可用、分布式系统的基础设施中。Eureka的服务器端被称为Eureka Server&#xff0c;客户端则是那些需要注册的服务。Eureka具有以下特点&#xff1a; 高可用性&#xff1a;Eureka支持多节点…

探索通过GPT和云平台搭建网安实战培训环境

项目背景 网络安全是一个不断演变的领域&#xff0c;面临着日益复杂的挑战和不断扩大的威胁。数字化时代&#xff0c;随着勒索攻击、数据窃取、网络钓鱼等频频出现&#xff0c;网络攻击的威胁指数和影响范围进一步增加&#xff0c;如何防范网络攻击&#xff0c;确保数据安全&a…

HTML5+CSS3小实例:菜单按钮的三种切换动画

实例:菜单按钮的三种切换动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initia…