当前位置: 首页 > news >正文

FPGA-结合协议时序实现UART收发器(五):串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive

FPGA-结合协议时序实现UART收发器(五):串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive

串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive,功能实现。


文章目录

  • FPGA-结合协议时序实现UART收发器(五):串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive
  • 一、功能实现
  • 一、UART_TOP代码
  • 总结


一、功能实现

对照代码,串口发送模块UART_TOP实现功能包括:

  • PLL锁相环,实现稳定系统输入时钟功能
  • UART_FIFO,数据先进先出,实现数据缓存功能,防止出现数据错乱
  • w_clk_rst = ~w_system_pll_locked;保证复位电平是先高位再地位
  • r_user_tx_ready,用户输出ready信号慢一拍,用于判断数据是否发送完毕,是否为结束状态
  • r_rden_lock,fifo使能锁控制
  • r_fifo_rden,fifo读使能情况
  • r_uart_tx_vaild比FIFO中的读使能r_fifo_rden慢一拍,为实现有效信号和数据能够匹配上,所以对有效信号进行打一拍来延迟一个周期,从而实现信号和数据匹配,正确获取数据

一、UART_TOP代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/09/09 13:13:15
// Design Name: 
// Module Name: UART_TOP
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//不要直接用系统时钟!!!
//要添加一个pll锁相环,进行滤波稳定时钟,方便后续处理
//module UART_TOP(//模块输入输出input       i_clk       ,input       i_uart_rx   ,output      o_uart_tx   );wire                    w_clk_50Mhz;
wire                    w_clk_rst;
wire                    w_system_pll_locked;wire    [7:0]           w_user_tx_data;
wire                    w_user_tx_ready;
wire    [7:0]           w_user_rx_data;
wire                    w_user_rx_vaild;
wire                    w_user_clk;
wire                    w_user_rst;
wire                    w_fifo_empty;
reg                     r_fifo_rden;
reg                     r_uart_tx_vaild;
reg                     r_rden_lock;//fifo使能锁
reg                     r_user_tx_ready;//pll锁存器在时钟不稳定的时候是低电平,在稳定后是高电平,即先低电平后高电平
//系统中习惯使用复位信号先高后低,即上电先高电平进行复位,然后再低电平,故需进行取反
assign w_clk_rst = ~w_system_pll_locked;system_pll system_pll_u0
(.clk_in1                        (i_clk),      // input clk_in1.clk_out1                       (w_clk_50Mhz),     // output clk_out1.locked                         (w_system_pll_locked)       // output locked
);uart_drive#(//串口可调参数.P_SYSTEM_CLK                  (50_000_000),.P_UART_BUADRATE               (115200),.P_UART_DATA_WIDTH             (8),.P_UART_STOP_WIDTH             (1),.P_UART_CHECK                  (0)
)
uart_drive_u0( //串口驱动输入输出.i_clk                         (w_clk_50Mhz),.i_rst                         (w_clk_rst),.i_uart_rx                     (i_uart_rx),.o_uart_tx                     (o_uart_tx),.i_user_tx_data                (w_user_tx_data),//用户输出数据,作为驱动的输入,即先输入到驱动处理再输出.i_user_tx_vaild               (r_uart_tx_vaild),//握手.o_user_tx_ready               (w_user_tx_ready),.o_user_rx_data                (w_user_rx_data),//用户输入数据,作为驱动的输出,即先经过驱动输出再输入到用户.o_user_rx_vaild               (w_user_rx_vaild),.o_user_clk                    (w_user_clk),.o_user_rst                    (w_user_rst));UART_FIFO UART_FIFO_U0 (.clk          (w_user_clk),      // input wire clk.srst         (w_user_rst),    // input wire srst.din          (w_user_rx_data),      // input wire [7 : 0] din.wr_en        (w_user_rx_vaild),  // input wire wr_en.rd_en        (r_fifo_rden),  // input wire rd_en.dout         (w_user_tx_data),    // output wire [7 : 0] dout.full         (),    // output wire full.empty        (w_fifo_empty)  // output wire empty
);//处理用户输出ready信号慢一拍
//用于判断数据是否发送完毕,是否为结束状态
always @(posedge w_user_clk or posedge w_user_rst)
beginif(w_user_rst)r_user_tx_ready <= 'd0;elser_user_tx_ready <= w_user_tx_ready;end//处理fifo使能控制,使能锁r_rden_lock
//防止fifo使能持续两个周期,导致读取两个数据,但握手只会读取一个数据,就会导致数据丢失,故需要使能锁控制来fifo只持续一个周期
always @(posedge w_user_clk or posedge w_user_rst)
beginif(w_user_rst)                                      //初始状态r_rden_lock <= 'd0;else if(w_user_tx_ready && !r_user_tx_ready)        //结束状态,当前为高电平1,前一拍为低电平,即上升沿判断为结束状态r_rden_lock <= 'd0;else if(~w_fifo_empty && w_user_tx_ready)           //变化状态,即fifo内有数据+ready好了r_rden_lock <= 'd1;elser_rden_lock <= r_rden_lock;end//处理fifo读使能情况,r_fifo_rden
always @(posedge w_user_clk or posedge w_user_rst) 
beginif(w_user_rst)r_fifo_rden <= 'd0;else if(~w_fifo_empty && w_user_tx_ready)r_fifo_rden <= 'd1;elser_fifo_rden <= 'd0;
end//因为发送的数据是比FIFO中的读使能r_fifo_rden满一个周期
//为实现有效信号和数据能够匹配上,所以对有效信号进行打一拍来延迟一个周期,从而实现信号和数据匹配,正确获取数据
always @(posedge w_user_clk or posedge w_user_rst) 
beginif(w_user_rst)r_uart_tx_vaild <= 'd0;elser_uart_tx_vaild <= r_fifo_rden;
endendmodule

总结

串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive,功能实现,数据缓存先进先出fifo实现,fifo使能控制等功能实现。

相关文章:

FPGA-结合协议时序实现UART收发器(五):串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive

FPGA-结合协议时序实现UART收发器&#xff08;五&#xff09;&#xff1a;串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive 串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive&#xff0c;功能实现。 文章目录 FPGA-结合协议时序实现UART收发器&#xff08;五&…...

我学编程全靠B站了,真香-国外篇(第三期)

你好&#xff0c;我是Martin。 今天来点猛料&#xff0c;给大家推荐点我的压箱收藏-国外知名大学的公开课。 我推荐的不多&#xff0c;本着少就是多的原则&#xff0c;只给大家推荐我看过最好的五门视频&#xff0c;主要是来自两所国外高校&#xff1a;MIT美国麻省理工、CMU卡…...

c++ 变量常量指针练习题

Q1:在win32 x86模式下&#xff0c;int *p; int **pp; double *q; 请说明p、pp、q各占几个字节的内存单元。 p 占 4 个字节 pp 占 4 个字节 q 占 4 个字节 Q2常量1、1.0、“1”的数据类型是什么&#xff1f; 1 是 整形 int 1.0 是 浮点型 double “1” 是 const char * Q3 语句&…...

Linux底层基础知识

一.汇编&#xff0c;C语言&#xff0c;C&#xff0c;JAVA之间的关系 汇编&#xff0c;C语言&#xff0c;C可以通过不同的编译器&#xff0c;编译成机器码。而java只能由Java虚拟机识别。Java虚拟机可以看成一个操作系统&#xff0c;Java虚拟机是由汇编&#xff0c;C&#xff0c…...

JUC并发编程--------线程安全篇

目录 什么是线程安全性问题&#xff1f; 如何实现线程安全&#xff1f; 1、线程封闭 2、无状态的类 3、让类不可变 4、加锁和CAS 并发环境下的线程安全问题有哪些&#xff1f; 1、死锁 2、活锁 3、线程饥饿 什么是线程安全性问题&#xff1f; 我们可以这么理解&#…...

机器视觉之Basler工业相机使用和配置方法(C++)

basler工业相机做双目视觉用&#xff0c;出现很多问题记录一下&#xff1a; 首先是多看手册&#xff1a;https://zh.docs.baslerweb.com/software 手册内有所有的源码和参考示例&#xff0c;实际上在使用过程中&#xff0c;大部分都是这些源码&#xff0c;具体项目选择对应的…...

Centos nginx配置文档

1、安装nginx: yum install nginx 2、Nginx常用命令 查看版本:nginx -v 启动:nginx -c /etc/nginx/nginx.conf 重新加载配置:nginx -s reload 停止:nginx -s stop 3、Nginx反向代理配置 nginx配置详解 1、Nginx配置图 详情可以查看:http://nginx.org/ru/docs/example…...

2023/9/14 -- C++/QT

作业&#xff1a; 仿照Vector实现MyVector&#xff0c;最主要实现二倍扩容 #include <iostream>using namespace std;template <typename T> class MyVector { private:T *data;size_t size;size_t V_capacity; public://无参构造MyVector():data(nullptr),size(…...

golang在goland编译时获取环境变量失效

在golang中&#xff0c; 我们通常使用os包来获取环境变量&#xff0c;如&#xff1a; os.Getenv() os.LookupEnv() 等。 但如果我们使用goland编译器&#xff0c;在编译是&#xff0c;这时操作环境变量&#xff0c;会发现os包读取到的环境变量值不变&#xff1a; 新增后&am…...

一款非常容易上手的报表工具,简单操作实现BI炫酷界面数据展示,驱动支持众多不同类型的数据库,可视化神器,免开源了

一款非常容易上手的报表工具&#xff0c;简单操作实现BI炫酷界面数据展示&#xff0c;驱动支持众多不同类型的数据库&#xff0c;可视化神器&#xff0c;免开源了。 在互联网数据大爆炸的这几年&#xff0c;各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的…...

蓝桥杯 题库 简单 每日十题 day3

01 约数个数 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 1200000 有多少个约数&#xff08;只计算正约数&#xff09;。 解题思路 枚举&#xff0c;从1开始一直到1200000本身都作为1200000的除数&#xff0c;…...

基于SSM+Vue的高校实验室管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

C语言天花板——指针(初阶)

&#x1f320;&#x1f320;&#x1f320; 大家在刚刚接触C语言的时候就肯定听说过&#xff0c;指针的重要性以及难度等级&#xff0c;以至于经常“谈虎色变”&#xff0c;但是今天我来带大家走进指针的奇妙世界。&#x1f387;&#x1f387;&#x1f387; 一、什么是指针&…...

关于第一届全球电子纸创新应用金奖征集评选及报名指南

重要通知 &#xff5c;关于第一届全球电子纸创新应用金奖征集评选及报名指南https://mp.weixin.qq.com/s/RWsZtmJ20-NZXMG0k0rwPA?wxwork_useridEPIA 从2004年&#xff0c;Sony推出全球首款电纸书阅读器至今20载&#xff0c;这期间&#xff0c;到底诞生了多少种创新产品&#…...

idea搭建项目找不到Tomcat

idea搭建项目找不到Tomcat_idea没有tomcat配置项_ZYRL的博客-CSDN博客...

类和对象三大特性之继承

全文目录 继承的概念定义格式继承关系和访问限定符final 基类和派生类对象赋值转换继承中的作用域派生类的六个默认成员函数构造函数拷贝构造函数operator析构函数 友元和静态成员友元静态成员 各种继承形式菱形继承虚继承菱形虚拟继承对象模型 继承和组合 继承的概念 通过继承…...

Debian 12安装Docker

1.更新系统包 #apt update 2.安装依赖包 #apt install apt-transport-https ca-certificates curl gnupg lsb-release 3.添加Docker源 &#xff08;1&#xff09;添加Docker 官方GPG密钥 #curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/s…...

小谈设计模式(4)—单一职责原则

小谈设计模式&#xff08;4&#xff09;—单一职责原则 专栏介绍专栏地址专栏介绍 单一职责原则核心思想职责的划分单一变化原则高内聚性低耦合性核心总结 举例图书类&#xff08;Book&#xff09;用户类&#xff08;User&#xff09;图书管理类&#xff08;Library&#xff09…...

ATF(TF-A) EL3 SPMC威胁模型-安全检测与评估

安全之安全(security)博客目录导读 ATF(TF-A) 威胁模型汇总 目录 一、简介 二、评估目标 1、数据流图 三、威胁分析 1、信任边界 2、资产 3、威胁代理 4、威胁类型 5、威胁评估 5.1 端点在直接请求/响应调用中模拟发送方FF-A ID 5.2 端点在直接请求/响应调用中模拟…...

AI绘画Stable Diffusion原理之扩散模型DDPM

前言 传送门&#xff1a; stable diffusion&#xff1a;Git&#xff5c;论文 stable-diffusion-webui&#xff1a;Git Google Colab Notebook部署stable-diffusion-webui&#xff1a;Git kaggle Notebook部署stable-diffusion-webui&#xff1a;Git AI绘画&#xff0c;输入一段…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

深度解析云存储:概念、架构与应用实践

在数据爆炸式增长的时代&#xff0c;传统本地存储因容量限制、管理复杂等问题&#xff0c;已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性&#xff0c;成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理&#xff0c;云存储正重塑数据存储与…...