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

2023-11-01

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

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



一、功能实现

对照代码,串口发送模块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)
begin
    if(w_user_rst)
        r_user_tx_ready <= 'd0;
    else
        r_user_tx_ready <= w_user_tx_ready;

end

//处理fifo使能控制,使能锁r_rden_lock
//防止fifo使能持续两个周期,导致读取两个数据,但握手只会读取一个数据,就会导致数据丢失,故需要使能锁控制来fifo只持续一个周期
always @(posedge w_user_clk or posedge w_user_rst)
begin
    if(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;
    else
        r_rden_lock <= r_rden_lock;
        
end


//处理fifo读使能情况,r_fifo_rden
always @(posedge w_user_clk or posedge w_user_rst) 
begin
    if(w_user_rst)
        r_fifo_rden <= 'd0;
    else if(~w_fifo_empty && w_user_tx_ready)
        r_fifo_rden <= 'd1;
    else
        r_fifo_rden <= 'd0;
end


//因为发送的数据是比FIFO中的读使能r_fifo_rden满一个周期
//为实现有效信号和数据能够匹配上,所以对有效信号进行打一拍来延迟一个周期,从而实现信号和数据匹配,正确获取数据
always @(posedge w_user_clk or posedge w_user_rst) 
begin
    if(w_user_rst)
        r_uart_tx_vaild <= 'd0;
    else
        r_uart_tx_vaild <= r_fifo_rden;
end

endmodule


总结

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • FPGA零基础学习之Vivado-ROM使用教程

    FPGA零基础学习之Vivado ROM使用教程 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业开发者都
  • 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

    目录 源同步FPGA输入时序分析的模型 input delay约束 极限input delay 往期系列博客 源同步FPGA输入时序分析的模型 以下为源同步FPGA输入时序分析的模型的示意图 在之前的文章中介绍过 在此介绍一下各个时钟延时的
  • 8x8LED点阵

    点量这个只需要把9高电平 13低电平就可以了 共阳极点阵 行线是led的正极 列线是led的列线 左上角点亮 显示多个灯是动态扫描的 一个一个显示的 然后间隔速度要快就可以造成显示 点阵由两篇74Hc595级联在一起驱动的 只需要三个io口
  • Verilog:【1】时钟分频电路(clk_divider.sv)

    碎碎念 作为Basic Verilog的第一个学习笔记 打算用这种命名方式来对博客进行命名 应该有助于检索 简单阅览了部分工程的代码 发现里面有很多嵌套关系 因此决定先从基础模块开始 也是为了整个博客内容的流畅性 读者朋友有问题的话 也可以
  • modelsim 关联 notepad++

    modelsim 控制窗口敲入 1 proc external editor filename linenumber exec I notepad notepad exe filename 2 set PrefSource altEdito
  • Verilog实例-AMBA(AHB)协议

    目录 一 简介 1 1 AHB 1 2 signal list 1 3 Bus interconnection 总线互联 1 4 Overview of AMBA AHB operation 1 4 1 Basic transfer 1 4
  • 笔试

    文章目录 前言 40 复位电路设计 1 recovery time和removal time 2 同步复位和异步复位 3 异步复位同步释放 本文参考 往期精彩 前言 嗨 今天来学习复位电路设计相关问题 微信关注 FPGA学习者 获取更多精彩
  • 【FPGA】:频率测量

    转载 1 FPGA频率测量的三种方法 直接测量法 间接测量法 等精度测量法
  • 小梅哥Xilinx FPGA学习笔记9——语法(阻塞与非阻塞赋值)

    阻塞赋值与非阻塞赋值详解 注意 阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 非阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 注意 阻塞赋值与非阻塞赋值 只有在时序逻辑中才有 不是阻塞赋值 也不是非阻塞赋值
  • 握手2倍速率进,一倍速率出[verilog]

    module two to one parameter WORD LEN 33 input clk input arst input 2 WORD LEN 1 0 i din input i din valid output o din r
  • 【DDR3 控制器设计】(3)DDR3 的写操作设计

    写在前面 本系列为 DDR3 控制器设计总结 此系列包含 DDR3 控制器相关设计 认识 MIG 初始化 读写操作 FIFO 接口等 通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等 附上汇总博客直达链接 DD
  • 【Xilinx Vivado时序分析/约束系列4】FPGA开发时序分析/约束-实验工程上手实操

    目录 建立工程 添加顶层 模块1 模块2 添加约束文件 编辑时钟约束 打开布线设计 代码代表的含义 时序报告 进行时序分析 Summary 包含了汇总的信息量 Source Clock Path 这部分是表示Tclk1的延时细节 Data
  • PAJ7620U2手势识别——配置0x00寄存器(3)

    文章目录 前言 一 为啥要配置0x00寄存器 二 配置步骤 1 单个读操作步骤图 2 模块状态转移图绘制 3 模块波形图绘制 4 上板验证 5 参考代码 总结 前言 在前面的教程中 小编带领各位读者学习了如何通过I2C协议去唤醒PAJ762
  • 基于FPGA的AHT10传感器温湿度读取

    文章目录 一 系统框架 二 i2c接口 三 i2c控制模块 状态机设计 状态转移图 START INIT CHECK INIT IDLE TRIGGER WAIT READ 代码 四 数据处理模块 串口 代码 五 仿真 testbench设
  • ALLEGRO等长时如何将PIN DELAY和VIA长度计算在内

    在PCB设计中 对于时序要求严格的线路 Via和IC pin delay的长度必须得到重视 通过下面的操作 可将Via和Pin delay加入到线路长度的计算中 1st 计算Pin delay 打开Constraint Manager 选择
  • [从零开始学习FPGA编程-24]:进阶篇 - 基本组合电路-编码器与译码器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 125247358 目录 前言 Veri
  • 硬核 | 从零制作一个激光雷达需要多久?

    编辑 ADS智库 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 硬件交流 技术交流群 本文只做学术分享 如有侵权 联系删文 激光雷达 LiDAR 是激光探测及测距系统的简称 目前广泛应用在无
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573

随机推荐

  • mysql 把select结果保存为临时表,mysql中把查询结果输出到临时表

    mysql 把select结果保存为临时表 有2种方法 第一种 建立正式的表 此表可供你反复查询 drop table if exists a temp create table a temp as select 表字段名称 from 表名
  • 微信小程序直播插件live-player-plugin使用

    1 在你的小程序中 app json这个文件中引入直播组件 plugins live player plugin version 1 1 1 注意填写该直播组件最新版本号 微信开发者工具调试时可获取最新版本号 复制时请去掉注释 provid
  • IP地址与DNS之间的关系——真正理解DNS

    1 IP地址 容易理解而又不太准确的说 IP地址是电脑在网络中的唯一标识 局域网IP是限于局域网内可以相互访问的电脑 公网中的固定IP 可以说是电脑在公网网络中的唯一标识 2 DNS Domain Name System 域名服务系统 简单
  • qt当通过子进程的方式嵌入窗口后,键盘按键响应不了怎么办?

    案例问题 当通过QProcess类 创建了一个子线程后 再将该子线程中的窗口封装到QWidget后嵌入当前主窗口中后 当在操作主进程窗口后 再去操作子进程窗口时 这时出现子进程窗口无法获取到键盘消息 或者先操作子进程中的窗口后 再切换到主进
  • linux重启nginx脚本

    Nginx 启动 重启 停止脚本 第一步 先运行命令关闭nginx ps ef grep nginx 查看状态 sudo kill 9 进程号 第二步 sudo vi etc init d nginx 输入以下内容 bin bash ngi
  • Qt的信号与槽

    依旧是根据 C GUI QT4 这本书继续学习 槽函数是普通C 成员函数几乎是一样的 可以为虚函数 可以被重载 可以为公有 可以为私有 也可以被其他C 成员函数直接调用 同时 他们的参数可以为任意类型 唯一不同的是 槽函数可以和信号连接在一
  • Unable to cast object of type 'System.Object[]' to type 'Employee[]'

    错误 Unable to cast object of type System Object to type Employee public class Employee public int id public string firstN
  • spring boot 使用spring-boot-starter-mail发送邮件

    1 引入依赖
  • 小窗帘

    anjiula 给你的小情书 就像起风了 扯着飘飘摇摇的衣角 拉长简简单单的街道 轻轻浅浅的步伐 那时公交站台的星光 裹挟着被吹散的温度 一边冷 一边暖 还有我们傻傻的脑袋 思绪穿透黑夜里的 小窗帘 挡不住光线 也挡不住念想
  • MPC5643L单片机——CAN通信FIFO接收使用笔记

    一 一个FIFO最多可存储几组CAN数据 手册里介绍了RX FIFO的寄存器数据结构 0x90 0xDC保留用作存储FIFO引擎 它里面的结构和上面0x80 0x90完全一样吗 也是16个字节吗 好像没有说明 根据大小计算0xDC 0x90
  • MS Learn 宝藏资源库 - 学习经验分享

    点击蓝字 关注我们 作者 刘轶民 大家好 我是东北电力大学的一名在校学生 我叫刘轶民 很高兴能以 MS Learn 的受益者的身份 来分享一些经验与看法 作为正在上学的我来讲 很多时候我可能更多的去面临着新技术的学习而不是基于一套熟悉的框架
  • 如何快速爬取国内985大学学术学报pdf文件

    背景 最近 在爬取关于国内985大学的学报时 我注意到大部分大学学报站点格式都采用相似的形式 并且PDF链接都使用自增的ID 然而 我也发现了一个问题 即大多数PDF链接的ID并不是连续的 现在我将向你分享一些方法 以快速获取所有的大学学报
  • MATLAB二维绘图(二)向图中添加标题,坐标轴,图标和文字信息

    MATLAB二维绘图 二 向图中添加标题 坐标轴 图标和文字信息 1 添加标题 图例 x轴信息和y轴信息 示例 添加标题 clear clc close all x 0 0 1 2 pi y1 sin x y2 exp x plot x y
  • BUUCTF Misc杂项前十二道题的思路和感悟

    title BUUCTF Misc date 2021年8月18日 17点27分 tags MISC categories MISC 1 BUUCTF 签到题 直接告诉了flag 2 BUUCTF 第二道题 Stegsolve 下载附件之后
  • gdb

    gdb一般命令 1 gdb l 从第一行开始例出原码 2 gdb break 1 设置断点 在源程序第1行处 3 gdb info break 查看断点信息 4 gdb r 运行程序 run命令简写 5 gdb n 单条语句执行 next命
  • 【Linux】如何创建daemon进程&fork一次和fork两次有什么区别

    前言 本文适合对Linux进程有了解过的读者 Linux中有一种进程叫做守护进程 又称精灵进程 它运行在后台 很重要 Linux下大多数服务器就是用守护进程实现的 因为它独立于终端运行 也就是说它的运行不受当前登录或者注销的影响 自成会话
  • HJ96:表示数字

    题目描述 将一个字符中所有出现的数字前后加上符号 其他字符保持不变 public static String MarkNum String pInStr return null 注意 输入数据可能有多行 输入描述 输入一个字符串 输出描述
  • Python应用程序自动化:提升效率的简易指南

    前言 自动化操作 是一门可以 提高工作效率 和 简化工作流程 的重要手段 而使用 Python 编程语言进行自动化操作应用程序 是极其方便的 Python 为我们提供了许多强大的工具和库 使得我们能够轻松地控制桌面应用程序或Windows上
  • javascript 怎么实现一行输出5个字符之后换行

    js源码
  • 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 功能实现 文章目录 FPG