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

这篇具有很好参考价值的文章主要介绍了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,功能实现。



一、功能实现

对照代码,串口发送模块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使能控制等功能实现。文章来源地址https://www.toymoban.com/news/detail-709589.html

到了这里,关于FPGA-结合协议时序实现UART收发器(五):串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 赛灵思7系列FPGA GT收发器中的RX均衡器

            串行信号经过传输媒介时,必然伴随着衰减或者扭曲。为了减少信号衰减带来的串行误码率,并且兼顾功耗与性能,GT收发器提供了两种信号改善方法:一种是LPM模式(low-power mode),另一种是DFE模式(判决反馈均衡器 Decision Feedback Equalizer )。         DFE模式

    2024年02月03日
    浏览(32)
  • STM32+收发器实现CAN和485总线

    RS485总线是一种常见的(Recommended Standard)串行总线标准(485是它的标识号),采用平衡发送与差分接收的方式,因此具有抑制共模干扰的能力。CAN是控制器局域网络(Controller Area Network, CAN)的简称,是一种能够实现分布式实时控制的串行通信网络,属于CSMA(多路载波侦听)/CD(冲突检测

    2024年02月05日
    浏览(38)
  • UIOTOS前端零代码 第7节:(实践)利用嵌套+收发器组件,零代码实现简单计算器功能

    通过嵌套容器嵌套底层页面,再利用收发器组件和工具函数之间的转换,真正做到零代码实现简单计算器功能。 底层页面             步骤1: 打开编辑器,在右边页面中,选择合适的页面路径 新建页面 。 步骤2: 把当前页面命名“按钮”,并缩放至合适的大小,在右边属

    2024年04月14日
    浏览(34)
  • GT高速收发器

    GT高速收发器概述 10G以太网子系统通过AXI4-Stream接口提供10gb /s以太网MAC、物理编码子层(PCS)和物理介质附件(PMA)传输和接收功能。该子系统还提供了可选的高精度时间戳功能,兼容IEEE Std 1588-2008(也称为IEEE1588v2)。这适用于10GBASE-R标准。10G以太网MAC子系统框图如图所示。 Xilinx

    2024年02月05日
    浏览(25)
  • PowerBUS 双总线收发器

    随着智能化的发展,人的需求变高,在一个环境内,如果子设备较多,距离适中,大多数是布置485总线加电源地需要4根线。这样就会导致走线复杂,线的成本也较高;如果用BLE或者wifi无线连接时也需要电源地2根线,成本更高。 而powerbus双总线就解决了以上的布线复杂的问题

    2024年02月16日
    浏览(34)
  • AD9361收发器中文手册

    因最近公司需要,借此机会和大家一起学习AD9361 制作不易,记得三连哦,给我动力,持续更新! 工程文件下载: 纯硬件SPI配置AD9361    提取码:g9jy ----------------------------------------------------------------------------------------         接收RF信号,并将其转换成可供BBP使用的数字数据

    2023年04月19日
    浏览(31)
  • Xilinx Artix-7【XC7A35T-2CSG324I】【XC7A35T-1CSG324I】成本与收发器优化的FPGA器件

    产品介绍: Xilinx® Artix -7系列 FPGA 重新定义了成本敏感型解决方案,功耗比上一代产品降低了一半,同时为高带宽应用提供一流的收发器和信号处理能力。这些设备基于 28 纳米 HPL 工艺构建,提供一流的性能功耗比。与 MicroBlaze™ 软处理器一起,Artix-7 FPGA 非常适用于便携式医

    2024年02月09日
    浏览(45)
  • CAN收发器与CAN控制器

    CAN收发器是一种用于CAN总线通信的专用芯片,主要用于将CAN控制器和CAN总线物理层之间的信号进行转换和调节。它的主要作用是将CAN控制器输出的数字信号转换为CAN总线所需要的物理信号,同时将CAN总线上接收到的物理信号转换为数字信号,并将其传递给CAN控制器进行处理。

    2024年01月24日
    浏览(35)
  • 缓冲器/驱动器/收发器IC

    记录学习未使用过的IC,开发使用新的IC,哎,就是玩 本编文章主要介绍缓冲器/驱动器/收发器 FPGA或MCU低驱动能力引脚 单向长距离信号 1.SN74HCT245NSR DIR高电平,A到B可控制,B到A不可控制 DIR低电平,B到A可控制,A到B不可控制 OE高电平,所有通道端口高阻 OE低电平,所有通道端

    2024年02月09日
    浏览(31)
  • ARINC429总线收发器 -- HI-3593调试记录

    ​ HI-3593是一款ARINC429协议收发器芯片,和之前介绍的HI-3582芯片功能一样,该芯片支持两路接收和一路发送,其中每个接收机具有标签识别、32×32 FIFO和模拟线路接收机。不同的是HI-3593通信接口为SPI总线,可以减少MCU的硬件管脚负担,而且HI-3593片内集成DC/DC 转换器用于产生双

    2024年02月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包