FPGA(Verilog)实现uart传输协议传输数据(含仿真)

目录

实现功能:

1.接收uart串行数据,输出并行数据(1byte)。

2.输入并行数据(1byte),输出uart串行数据。

3.完成uart传输的1次环回。

uart协议的1帧数据传输

模块封装-port设置

Verilog代码实现

1.uart接收模块:接收串行数据,输出并行数据和其有效标志。

仿真结果:

2.uart发送模块:接收并行数据,发送串行数据。

仿真结果:

3.uart环回测试。

仿真验证:

仿真结果:

FPGA系统集成-RTL框图


实现功能:

1.接收uart串行数据,输出并行数据(1byte)。

2.输入并行数据(1byte),输出uart串行数据。

3.完成uart传输的1次环回。

uart协议的1帧数据传输

模块封装-port设置

Verilog代码实现
1.uart接收模块:接收串行数据,输出并行数据和其有效标志。
module uart_rx#(parameter	UART_BPS='d9600			,	//波特率:1s传输9600个bitparameter	CLK_FREQ='d50_000_000		//时钟频率:50MHz
)(input 	wire			clk			,input 	wire			rst_n		,input 	wire			rx			,	//接收的串行数据output 	reg		[7:0]	po_data		,	//输出并行数据output 	reg				po_flag			//输出有效并行数据的标志信号
);

首先对rx进行时钟同步,消除亚稳态,以及打拍处理提取下降沿;

always@(posedge clk or negedge rst_n)if(!rst_n) beginrx_d1<=1'b1;rx_d2<=1'b1;rx_d3<=1'b1;endelse beginrx_d1<=rx;		//时钟同步,消除亚稳态rx_d2<=rx_d1;	//时钟同步,消除亚稳态rx_d3<=rx_d2;	//打拍处理endassign rx_fall = ~rx_d2 & rx_d3 ;	//提取rx下降沿

然后需要数据帧的有效信号,以便知道什么时候计数;

always@(posedge clk or negedge rst_n)if(!rst_n) frame_val<=1'b0;else if((bit_cnt==BIT_CNT_MAX-1'b1) && bit_flag)	//接收完1帧数据frame_val<=1'b0;else if(rx_fall)frame_val<=1'b1;elseframe_val<=frame_val;

1码元符号(1bit)所需的计数器;

always@(posedge clk or negedge rst_n)if(!rst_n) baud_cnt<=16'd0;else if(frame_val==1'b0)	//数据帧无效baud_cnt<=16'd0;else if(baud_cnt==BAUD_CNT_MAX-1'b1)baud_cnt<=16'd0;elsebaud_cnt<=baud_cnt+1'b1;

1bit稳定数据的采样标志信号;

always@(posedge clk or negedge rst_n)if(!rst_n) bit_flag<=1'b0;else if(baud_cnt==BAUD_CNT_MAX_HALF-1'b1)	//采样需要在中间数据才稳定bit_flag<=1'b1;elsebit_flag<=1'b0;

对采样到的bit数据进行计数;

always@(posedge clk or negedge rst_n)if(!rst_n) bit_cnt<=4'd0;else if((bit_cnt==BIT_CNT_MAX-1'b1) && bit_flag)	//10bit数据采样完毕bit_cnt<=4'd0;else if(bit_flag)	//采样到1bit数据bit_cnt<=bit_cnt+1'b1;elsebit_cnt<=bit_cnt;

将接收到的串行数据rx转化为并行数据po_data_t;

always@(posedge clk or negedge rst_n)if(!rst_n) po_data_t<=8'b0;else if((bit_cnt>=4'd1) && (bit_cnt<BIT_CNT_MAX-1'b1) && bit_flag)	//8bit数据po_data_t<={rx_d3,po_data_t[7:1]};	//起始位后接的是低位elsepo_data_t<=po_data_t;

并行数据全部拼接完成的标志信号;

always@(posedge clk or negedge rst_n)if(!rst_n) po_flag_t<=1'b0;else if((bit_cnt==BIT_CNT_MAX-1'b1) && bit_flag)po_flag_t<=1'b1;elsepo_flag_t<=1'b0;

输出并行数据和输出有效并行数据的标志信号。

always@(posedge clk or negedge rst_n)if(!rst_n) po_data<=8'b0;else if(po_flag_t)po_data<=po_data_t;elsepo_data<=po_data;//po_flag_t延迟1拍与po_data同步
always@(posedge clk or negedge rst_n)if(!rst_n) po_flag<=1'b0;elsepo_flag<=po_flag_t;
仿真结果:

2.uart发送模块:接收并行数据,发送串行数据。
module uart_tx#(parameter	UART_BPS='d9600			,	//波特率:1s传输9600个bitparameter	CLK_FREQ='d50_000_000		//时钟频率:50MHz
)(input 	wire			clk			,input 	wire			rst_n		,input	wire			pi_flag		,	//输入并行数据input	wire	[7:0]	pi_data		,	//输入有效并行数据的标志信号output 	reg 			tx				//输出串行数据
);

首先同样是uart 1帧数据的有效信号;

always@(posedge clk or negedge rst_n)if(!rst_n) frame_val<=1'b0;else if((bit_cnt==BIT_CNT_MAX-1'b1) && bit_flag)	//发送完1帧数据frame_val<=1'b0;else if(pi_flag)	//接收到有效的并行数据frame_val<=1'b1;elseframe_val<=frame_val;

1码元符号(1bit)所需的计数器;

always@(posedge clk or negedge rst_n)if(!rst_n) baud_cnt<=16'd0;else if(frame_val==1'b0)	//数据帧无效baud_cnt<=16'd0;else if(baud_cnt==BAUD_CNT_MAX-1'b1)baud_cnt<=16'd0;elsebaud_cnt<=baud_cnt+1'b1;

1bit数据的发送标志信号;

always@(posedge clk or negedge rst_n)if(!rst_n) bit_flag<=1'b0;else if(frame_val && !baud_cnt)bit_flag<=1'b1;elsebit_flag<=1'b0;

对bit数据的发送进行计数;

always@(posedge clk or negedge rst_n)if(!rst_n) bit_cnt<=4'd0;else if((bit_cnt==BIT_CNT_MAX-1'b1) && bit_flag)	//10bit数据计数完毕bit_cnt<=4'd0;else if(bit_flag)	//发送完1bit数据bit_cnt<=bit_cnt+1'b1;elsebit_cnt<=bit_cnt;

输出串行数据。

always@(posedge clk or negedge rst_n)if(rst_n==1'b0) tx<=1'b1;	//空闲else if(bit_flag)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
仿真结果:

3.uart环回测试。
module uart_test#(parameter	UART_BPS='d9600			,	//波特率:1s传输9600个bitparameter	CLK_FREQ='d50_000_000		//时钟频率:50MHz
)(input 	wire clk	,input 	wire rst_n	,input 	wire rx		,	//接收的串行数据output 	wire tx			//发送的串行数据
);wire [7:0] 	data		;
wire 		data_flag	;uart_rx#(.UART_BPS(UART_BPS),.CLK_FREQ(CLK_FREQ)
)u_uart_rx(.clk	(clk	),.rst_n	(rst_n	),.rx		(rx		),.po_data(data),.po_flag(data_flag)
);uart_tx#(.UART_BPS(UART_BPS),.CLK_FREQ(CLK_FREQ)
)u_uart_tx(.clk	(clk	),.rst_n	(rst_n	),.pi_data(data),.pi_flag(data_flag),.tx(tx)
);endmodule
仿真验证:
`timescale 1ns/1ns
module tb_uart_test();parameter	UART_BPS='d9600			;	//波特率:1s传输9600个bit
parameter	CLK_FREQ='d50_000_000	;	//时钟频率:50MHzreg clk;
reg rst_n;
reg rx;wire tx;initial
beginclk=1'b0;rst_n<=1'b0;rx<=1'b1;#20rst_n<=1'b1;
endalways #10 clk=~clk;initial
begin#200	//空闲状态rx_test();#(5208*10*20*3)#200$stop;
end//输出uart数据帧(10-13)
task rx_test();	//任务函数,类似C语言integer j;for(j=10;j<13;j=j+1)rx_8bit(j);
endtask//输入8bit并行数据,输出uart数据帧
task rx_8bit(input [7:0] data
);
integer i;for(i=0;i<10;i=i+1)
begincase(i)0:rx<=1'b0;		//1帧数据1:rx<=data[0];2:rx<=data[1];3:rx<=data[2];4:rx<=data[3];5:rx<=data[4];6:rx<=data[5];7:rx<=data[6];8:rx<=data[7];9:rx<=1'b1;endcase#(5208*20);		//9600波特率
end
endtaskuart_test#(.UART_BPS(UART_BPS),.CLK_FREQ(CLK_FREQ)
)u_uart_test(.clk	(clk	),.rst_n	(rst_n	),.rx		(rx		),.tx(tx)
);endmodule
仿真结果:

FPGA系统集成-RTL框图

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

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

相关文章

开源区块链系统/技术 总结(欢迎补充,最新)

1. FISCO BCOS FISCO BCOS 2.0 技术文档 — FISCO BCOS 2.0 v2.9.0 文档https://fisco-bcos-documentation.readthedocs.io/ 2. ChainMaker&#xff08;长安链&#xff09; 文档导航 — chainmaker-docs v2.3.2 documentationhttps://docs.chainmaker.org.cn/v2.3.2/html/in…

Java事件处理机制

一、介绍 java事件处理是采取“委派事件模型”。当事件发生时&#xff0c;产生事件的对象&#xff0c;会把此“信息”传递给"事件的监听者"处理&#xff0c;这里所说的"信息"实际上就是java.awt.event事件类库里某个类所创建的对象&#xff0c;把它称为&q…

以XX大学学生公寓为例的安科瑞远程抄表与配电能效系统解决方案【AcrelEMS-EDU校园综合能效管理】

建设背景 随着我国经济的高速发展&#xff0c;建筑能耗特别是国家机关办公建筑和大型公共建筑高耗能的问题日益突出。学校作为大型公共机构建筑的重要组成部分之一&#xff0c;其特点是占地面积大、建筑分布广、数量多、类型多样、用能情况复杂&#xff1b; 高校用能普遍问题…

【linux】拓展知识-linux图形界面(GUI 程序)、X11介绍

linux图形界面 Linux 本身是没有图形化界面的&#xff0c;linux只是一个基于命令行的操作系统&#xff0c;所谓的图形化界面系统只不过中 Linux 下的应用程序。没有图形界面linux还是linux&#xff0c;很多装linux的WEB服务器就根本不装X服务器。 这一点和 Windows 不一样。W…

Linux C柔性数组(零长数组)

零长数组&#xff0c;大小为0&#xff0c;一般用在结构体中&#xff08;网络通信&#xff0c;省流&#xff09;&#xff0c;节省空间&#xff0c;方便善后&#xff08;相对于指针类型&#xff09;&#xff0c;我们通过具体例子进行理解。 常规定长数组 #include <stdio.h&…

【机器学习】深入解析机器学习基础

在本篇深入探讨中&#xff0c;我们将揭开机器学习背后的基础原理&#xff0c;这不仅包括其数学框架&#xff0c;更涵盖了从实际应用到理论探索的全方位视角。机器学习作为数据科学的重要分支&#xff0c;其力量来源于算法的能力&#xff0c;这些算法能够从数据中学习并做出预测…

CentOS下部署ftp服务

要在linux部署ftp服务首先需要安装vsftpd服务 yum install vsftpd -y 安装完成后需要启动vsftpd服务 systemctl start vsftpd 为了能够访问ftp的端口&#xff0c;需要在防火墙中开启ftp的端口21&#xff0c;否则在使用ftp连接的时候会报错No route to host. 执行如下命令为f…

纯纯python实现梯度下降、随机梯度下降

最近面试有要求手撕SGD&#xff0c;这里顺便就把梯度下降、随机梯度下降、批次梯度下降给写出来了 有几个注意点&#xff1a; 1.求梯度时注意label[i]和pred[i]不要搞反&#xff0c;否则会导致模型发散 2.如果跑了几千个epoch&#xff0c;还是没有收敛&#xff0c;可能是学习率…

基于逻辑回归和支持向量机的前馈网络进行乳腺癌组织病理学图像分类

CNN&#xff08;卷积神经网络&#xff09;通过使用反向传播方法来学习特征&#xff0c;这种方法需要大量的训练数据&#xff0c;并且存在梯度消失问题&#xff0c;从而恶化了特征学习。 CNN卷积神经网络 CNN由一个多层神经网络组成&#xff0c;该网络从标记的训练数据集中学习…

HarmonyOS实战开发-使用OpenGL实现2D图形绘制和动画。

介绍 基于XComponent组件调用Native API来创建EGL/GLES环境&#xff0c;从而使用标准OpenGL ES进行图形渲染。本项目实现了两个示例&#xff1a; 使用OpenGL实现2D的图形绘制和动画&#xff1b;使用OpenGL实现了在主页面绘制两个立方体&#xff0c;光源可以在当前场景中移动&…

从高频到低频:全面解析压控振荡器结构与应用场景

压控振荡器&#xff08;简称VCO&#xff09;是一种电子电路&#xff0c;其特点是输出的振荡频率能够随着输入电压的变化而连续改变。在VCO中&#xff0c;通过调控输入端的电压信号&#xff0c;可以相应地改变内部谐振电路的参数&#xff08;如电感、电容或者变容二极管的电容值…

【智能算法】人工电场算法(AEFA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2019年&#xff0c;A Yadav等人受库伦定律和运动定律启发&#xff0c;提出了人工电场算法&#xff08;Artificial Electric Field Algorithm&#xff0c;AEFA&#xff09;。 2.算法原理 2.1算法思…

【Spring Cloud】服务容错中间件Sentinel入门

文章目录 什么是 SentinelSentinel 具有以下特征&#xff1a;Sentinel分为两个部分: 安装 Sentinel 控制台下载jar包&#xff0c;解压到文件夹启动控制台访问了解控制台的使用原理 微服务集成 Sentinel添加依赖增加配置测试用例编写启动程序 实现接口限流总结 欢迎来到阿Q社区 …

HTML转EXE工具(HTML App Build)永久免费版:24.4.9.0

最新版本的HTML2EXE即将发布了。自从去年发布了HTML2EXE之后&#xff0c;我就正式上班了&#xff0c;一直忙于工作&#xff0c;实在没有时间更新&#xff08;上班时间不能做&#xff09;&#xff0c;很多网友下载使用&#xff0c;反应很好&#xff0c;提出了一些改进的建议&…

感知定位篇之机器人感知定位元件概述(上)

欢迎关注微信公众号 “四足机器人研习社”&#xff0c;本公众号的文章和资料和四足机器人相关&#xff0c;包括行业的经典教材、行业资料手册&#xff0c;同时会涉及到职业知识学习及思考、行业发展、学习方法等一些方面的文章。 目录 |0.概述 |1.常用传感元件 1.1视觉传感器…

750万人受影响,印度电子巨头boAt重大数据泄露事件

近日&#xff0c;印度消费电子巨头boAt遭遇重大数据泄露事件&#xff0c;超过750万客户的个人数据遭到泄露&#xff0c;泄露的个人数据包括姓名、地址、联系电话、电子邮件 ID 和客户 ID 以及其他敏感信息&#xff0c;目前这些泄露数据正在暗网上流传。 boAt Lifestyle数据库被…

【数据结构】考研真题攻克与重点知识点剖析 - 第 8 篇:排序

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

Android 包命名规范

Android包目录的命名规范会直接影响到整个APP攻城后期的开发效率和拓展性。 常用两种命名方式&#xff1a;PBL&#xff08;package by layer ) 和PBF(pakcage by Feature) layer 英/ˈleɪə(r)/ 翻译&#xff1a;层 feature 英/ˈfiːtʃə(r)/ 翻译&#xff1a;特色 1 Pac…

【吊打面试官系列】Java高并发篇 - 在 Java 中 Executor 和 Executors 的区别?

大家好&#xff0c;我是锋哥。今天分享关于 【在 Java 中 Executor 和 Executors 的区别&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 在 Java 中 Executor 和 Executors 的区别&#xff1f; Executors 工具类的不同方法按照我们的需求创建了不同的线程池&am…

探索未来的旋律:AI生成音乐的魔法(附GPT镜像站大全)

在数字化时代的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已经触及了我们生活的方方面面&#xff0c;从自动驾驶汽车到智能家居系统&#xff0c;再到高度个性化的推荐算法。然而&#xff0c;AI的魔法并不止步于此。近年来&#xff0c;AI在艺术和创造性领域的应用也…