FPGA开发——UART回环实现之接收模块的设计
一、简介
因为我们本次进行串口回环的实验的对象是FPGA开发板和PC端,所以在接收和发送模块中先编写接收模块,这样可以在后面更好的进行发送模块的验证。(其实这里先编写哪个模块)都不影响,这里看自己心情,反正都可以独立进行仿真。)
在上一篇文章中,我们对于UART回环实现的总体系统框架做了一盒简单的构建,所以在实现时我们也按照那个框架来。这里就先对于接收模块进行一个设计。
二、接收模块的基本设计
本次设计我们采用状态机的实现方式,将状态机划分为四个,第一个就是空闲状态,表示设备没有接收数据,第二个是开始状态,表示设备接收到起始位,第三个接收数据过程状态,用于表示设备接收数据的过程,最后一个就是停止位,表示设备接受数据完成。

三、接收模块的波形图绘制
根据上面的状态机,我们可以据此展开波形图的绘制,分别就是对于信号进行打拍,下降沿检测,两个状态,以及bit和波特率、输出数据等的表示。
使用三级打拍,利用后两拍信号实现下降沿检测,当检测到下降沿,状态机由IDLE进入到START,然后利用波特率计数器计数1bit的起始位,来到DATA,利用波特率计数器和bit计数器用于接收数据,接收完数据之后进入STOP,最后利用波特率计数器计数1bit的停止位,状态又回到初始的IDLE状态。

四、代码实现
1、设计文件的编写
新建一个uart_rx.v文件,如下:在代码编写的过程中我们还需要注意的就是UART在进行通信时是串行通信,二我们的设备中数据时并行的,所以在代码中我们还要实现数据串并型的转换。
//---------<模块及端口声名>-------------------------------------------
module uart_rx( input clk ,input rst_n ,input din_rx ,output [7:0] dout_data,output dout_flag
);
//---------<参数定义>------------------------------------------------
parameter CLK_CLY=50_000_000;
parameter BAUD_115200=115200;
parameter BPS_CNT_MAX=CLK_CLY/BAUD_115200;
parameter IDLE =4'b0001,START =4'b0010,DATA =4'b0100,STOP =4'b1000;
//---------<内部信号定义>--------------------------------------------
reg uart_rx_d1;//对异步信号进行同步处理
reg uart_rx_d2;
reg uart_rx_d3;reg [3:0] state_c;
reg [3:0] state_n;
wire nedge;//起始位下降沿检测
reg [8:0] cnt_bps;//波特率计数器
wire add_cnt_bps;
wire end_cnt_bps;reg [2:0] cnt_bit;//bit数据计数器
wire add_cnt_bit;
wire end_cnt_bit;reg [7:0] uart_rx_r;//用于存储接收到的数据
reg rx_flag;//接收数据完成标志位
//第一段:同步时序描述状态转移
always @(posedge clk or negedge rst_n)begin if(!rst_n)beginstate_c <=IDLE ;end else begin state_c <= state_n;end
end//第二段:组合逻辑判断状态转移条件,描述状态转移规律
always @(*) begincase(state_c)IDLE : beginif (nedge) state_n=START ;elsestate_n=IDLE ;endSTART : beginif (end_cnt_bps) state_n=DATA ;elsestate_n=START ;endDATA : beginif (end_cnt_bit) state_n=STOP ;elsestate_n=DATA ;endSTOP : beginif (end_cnt_bps) state_n=IDLE ;elsestate_n=STOP ;enddefault : state_n=IDLE ;endcase
end
//对uart_rx进行打拍同步处理
always @(posedge clk or negedge rst_n)begin if(!rst_n)beginuart_rx_d1 <= 1'b1;uart_rx_d2 <= 1'b1;uart_rx_d3 <= 1'b1;end else begin uart_rx_d1 <=din_rx;uart_rx_d2 <=uart_rx_d1;uart_rx_d3 <=uart_rx_d2;end
end
//nedge下降沿检测
assign nedge=~uart_rx_d2 & uart_rx_d3;//波特率计数器
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_bps <= 9'd0;end else if(add_cnt_bps)begin if(end_cnt_bps)begin cnt_bps <= 'd0;endelse begin cnt_bps <= cnt_bps + 1'b1;end end
end assign add_cnt_bps =(state_c != IDLE) ;
assign end_cnt_bps = add_cnt_bps && (cnt_bps ==(BPS_CNT_MAX-1)) ;//bit计数器
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_bit <= 9'd0;end else if(add_cnt_bit)begin if(end_cnt_bit)begin cnt_bit <= 'd0;endelse begin cnt_bit <= cnt_bit + 1'b1;end end
end assign add_cnt_bit =(state_c == DATA)&& end_cnt_bps ;
assign end_cnt_bit = add_cnt_bit && (cnt_bit ==(8-1)) ;//将串行数据变为并行数据
always @(posedge clk or negedge rst_n)begin if(!rst_n)beginuart_rx_r <= 1'b0;end else if((state_c==DATA)&&(cnt_bps==BPS_CNT_MAX/2-1))begin uart_rx_r<={uart_rx_d3,uart_rx_r[7:1]};//uart_rx_r[cnt_bit]<=uart_rx_d3;end
end//接收数据完成标志wei
always @(posedge clk or negedge rst_n)begin if(!rst_n)beginrx_flag <= 1'b0;end else if(end_cnt_bit)begin rx_flag<= 1'b1;end else begin rx_flag<= 1'b0;end
end
assign dout_data = uart_rx_r;
assign dout_flag = rx_flag;
endmodule
2、测试文件的编写
`timescale 1us/1us
module uart_rx_tb();//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
//reg define
reg clk ;
reg rst_n ;
reg din_rx ;
wire [7:0] dout_data ;
wire dout_flag ;uart_rx uart_rx_inst(/*input */ .clk (clk ),/*input */ .rst_n (rst_n ), /*input */ .din_rx (din_rx ),/*output reg */ .dout_data (dout_data ),/*output reg [7:0]*/ .dout_flag (dout_flag )
);
parameter CLOCK_CYCLE=20;
//产生时钟initial clk = 1'b0;always #10 clk = ~clk;//产生激励initial begin rst_n = 1'b1;din_rx = 1;//空闲为高电平#(CLOCK_CYCLE*2);rst_n = 1'b0;#(CLOCK_CYCLE*20);rst_n = 1'b1;#1002;//模拟UART接收模块的串行输入//起始位din_rx = 0;#(434*CLOCK_CYCLE);//数据位:8'b1011_0011din_rx = 1;//LSB#(434*CLOCK_CYCLE);din_rx = 1;#(434*CLOCK_CYCLE);din_rx = 0;#(434*CLOCK_CYCLE);din_rx = 0;#(434*CLOCK_CYCLE);din_rx = 1;#(434*CLOCK_CYCLE);din_rx = 1;#(434*CLOCK_CYCLE);din_rx = 0;#(434*CLOCK_CYCLE);din_rx = 1;#(434*CLOCK_CYCLE);//停止位din_rx = 1;#(434*CLOCK_CYCLE);#(CLOCK_CYCLE*100);$stop;endendmodule
五、波形图仿真

在波形图中我们观察到dout_data的数据和发送数据不一样,这是因为UART是低位先发,所以在波形图中我们看到的输入和输出数据时相反的,这里需要我们注意一下。
相关文章:
FPGA开发——UART回环实现之接收模块的设计
一、简介 因为我们本次进行串口回环的实验的对象是FPGA开发板和PC端,所以在接收和发送模块中先编写接收模块,这样可以在后面更好的进行发送模块的验证。(其实这里先编写哪个模块)都不影响,这里看自己心情,反…...
Debezium系列之:记录一次SQLServer数据库数据不采集,恢复采集造成下游承压的情况,以及相对应的详细解决方案
Debezium系列之:记录一次SQLServer数据库数据不采集,恢复采集造成下游承压的情况,以及相对应的详细解决方案 一、背景二、查看CDC表情况三、 排查数据库是否开启代理四、排查表是否开启CDC五、下游承压情况六、解决方案一、背景 Connector状态正常,但几十台SQLServer数据库…...
Linux线程基础学习记录
0.线程特点 (1).线程共享资源:一个进程下的多个线程共享以下资源 可执行的指令 静态数据 进程中打开的文件描述符 当前工作目录 用户ID 用户组ID (2).线程私有资源: 线程ID PC(程序计数器)和相…...
【Python学习-UI界面】PyQt5 小部件12-QStackedWidget 多页显示
功能和 QTabWidget 类似,它也有助于高效利用窗口的客户区域。 QStackedWidget 提供了一个窗口堆栈,每次只能查看一个窗口。它是建立在 QStackedLayout 之上的一个有用的布局。 样式如下: 右键可以变型为QTabWidget...
Mybatis中好用的元对象反射工具类 - MetaObject
一、前言 在获取map对象或者是其他深层嵌套对象,如果你的做法是挨个取出判空然后继续再向下查找,那么可以看看本文的方案,它或许能让你打开新的思路。 作为一名java开发人员,Mybatis几乎是我们无法避开的ORM框架,如果你…...
javaEE WebServlet、SpringWebMVC、SpringBoot实现跨域访问的4种方式及优先级,nginx配置跨域
文章目录 1. 前置知识2. 原理和解决方案总结2.1. 跨域不通过原理流程图2.2. 实现原理:添加以下http响应头2.3. 四种跨域实现方式及优先级(从高到低) 3. 具体实现代码3.1. 跨域全局配置方式-Filter(全适用)3.2. 跨域全局配置方式-SpringMvc3.3…...
深入理解JavaScript性能优化:从基础到高级
引言 在当今快速发展的Web世界中,性能已经成为衡量应用质量的关键指标。随着Web应用复杂度的不断提升,JavaScript作为前端开发的核心语言,其性能优化变得尤为重要。本文旨在全面深入地探讨JavaScript性能优化的各个方面,从基础概念到高级技巧,帮助开发者构建高效、流畅的Web应用…...
java+springboot实现定时任务
由于是初级程序员,基于注解的形式实现了一个简单的定时任务; 1. 使用Scheduled注解 Spring的Scheduled注解是一种非常简单和便捷的实现定时任务的方式。通过在方法上添加Scheduled注解,我们可以指定方法在特定的时间间隔或固定的时间点执行…...
1.3 数据库的发展历史与演变
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...
The field file exceeds its maximum permitted size of 1048576 bytes
场景: 再系统后台上传解析对账文件时大小超过1M就会报错 分析: 排查错误时了解MultipartFile默认上传大小就是1M,但是发现项目配置文件配置了上传大小100M,但是这个大小没有生效 因为项目启动并没有使用到这个配置大小并把他应用到file配置里面,经过测试发现只需要增加配置…...
【Es】python es操作
表 因为es是集群所以es_hosts是列表 from elasticsearch import Elasticsearch ES_HOSTS ["127.0.0.1:9200"] ES_HTTP_AUTH "******************"# 连接Es es Elasticsearch(hostsES_HOSTS ,http_authES_HTTP_AUTH ,maxsize60,timeout30,max_retries3…...
吃透前端文件上传与文件相关操作 多文件上传 大文件切片上传 拖拽上传 后续还会更新 断点续传等等
最近在学文件上传的操作,所以想把学习到东西写成一文章 这片文章是我以小白视角 慢慢学习并熟悉前端文件相关操作的流程总结出来的 前端文件上传 我首先想到是 <input type"file">**选择文件**</input>如果我们想限制上传文件的格式,大小或进行裁剪分片…...
用python制作88键赛博钢琴(能用鼠标键盘进行弹奏)
用python制作88键赛博钢琴 前言 恭喜这位博主终于想起了自己的账号密码! 时光荏苒,转眼间已逾一年未曾在此留下墨香。尽管这一年间,博主投身于无尽的忙碌与挑战之中,但令人欣慰的是,那份初心与热情似乎并未因岁月的流…...
zdpgo_gin_login 框架20240815更新,增加注册路由的功能,一个方法自动拥有注册和登录两个API接口
zdpgo_gin_login 适配gin框架的登录注册功能组件,通过本框架轻松拥有登录注册相关的API接口 特性: 自动生成注册接口,具备密码加密的功能自动生成登录接口,具备JWT Token生成的功能 安装 go get github.com/zhangdapeng520/z…...
搭配Intel第13代酷睿处理器
高性能内存硬盘这么买 intel第13代酷睿已经于2022年10月底正式上市。相比于第12代酷睿性能大涨,内置20条PCle通道(16条PCle 5.0和4条PCle 4.0)、可最多支持128GB DDR5 5600/DDR4 3200双通道内存,搭配Z790系列主板组建高端性能平台,满足未来设计、游戏、专业应用等需求。如…...
uniapp快速回顾,新学websocket连接和BLE连接
Uni APP的学习 官方文档 uni-app官网 (dcloud.net.cn) 任何的博客都不如官方文档 一、快速复习 文件结构 main.js 功能:项目的入口文件,初始化 Vue 实例。 App.vue功能:根组件,包含应用的基本结构和全局样式。 manifest.js…...
激光测距传感器
系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、产品原理:二、产品介绍:三、应用特点四、应用案例:1.冶金钢铁板卷材开卷工…...
从数据分析到智能生产:AI在工业中的应用与未来
导语 | 人工智能技术的迅猛发展,正在引领第四次工业革命悄然而至。尽管 AI 技术在工业领域的部署仍有诸多难题亟待解决,但这并不能阻挡历史趋势的车轮滚滚向前,AI 正在为工业领域带来新的变革。今天,我们特邀了上海腾展长融董事 &…...
讲讲android art虚拟机的内存
Android 的 ART(Android Runtime)虚拟机的内存管理是一个复杂但重要的部分。 ART 虚拟机的内存主要包括以下几个关键区域: Java 堆(Java Heap): 这是存储 Java 对象实例的主要区域。堆内存被进一步划分为不…...
构建高效社群生态:探索社群系统的力量与未来
在数字化时代的大潮中,社群系统作为连接人与人、促进信息交流与资源共享的重要平台,正日益成为企业、组织乃至个人不可或缺的一部分。它不仅为成员提供了展示自我、学习成长的舞台,更为社群管理者创造了高效管理、精准运营的工具。今天&#…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...
JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...
