Uart串口收发回环验证

本文介绍了基于FPGA的UART IP核设计,包括接收、发送、波特率设置模块,采用回环验证方法。在Modelsim仿真成功后,板级验证遇到问题,如波特率设置错误和代码bug。通过调试和学习,理解了代码复位的重要性以及EDA工具的限制,总结了设计和验证过程中应注意的事项。
摘要由CSDN通过智能技术生成

本次所做的项目比较复杂(对我本人来讲),设计一个Uart IP核,在其基础,封装axi接口,使其成为面向AXI口的IP,再例化个microblaze作为主机,使microblaze与Uart之间通过AXI总线进行通信。具体模块图如下,包含主机microblaze,主接口模块,从接口模块,从机Uart。

在这里插入图片描述
本文首先介绍Uart基本模块。该顶层模块包含接受模块、发送模块、发送波特率设置模块、接受波特率设置模块。为了方便验证,我们将接受模块与发送模块连接,采用回环的形式。

接受模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2019/05/24 16:58:41
// Design Name: 
// Module Name: uart_rx
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module uart_rx(
    clk,
    rst_n,
    Rs232_rx,
    bps_clk,
    rx_data,
    rx_int,
    bps_start
    );
    input clk;
    input rst_n;
    input bps_clk;
    input Rs232_rx;
    output [7:0] rx_data;
    output reg rx_int;
    output reg bps_start;
    
    reg Rs232_rx0,Rs232_rx1,Rs232_rx2,Rs232_rx3;
    wire neg_edge;
    reg [3:0] num;
    
    reg [7:0] rx_data_t1; 
    reg [7:0] rx_data_t2;
     
    always@(posedge clk or negedge rst_n)
        if(!rst_n) begin 
            Rs232_rx0 <= 1'b1;
            Rs232_rx1 <= 1'b1;
            Rs232_rx2 <= 1'b1;
            Rs232_rx3 <= 1'b1;
        end
        else begin
            Rs232_rx0 <= Rs232_rx;
            Rs232_rx1 <= Rs232_rx0;
            Rs232_rx2 <= Rs232_rx1;
            Rs232_rx3 <= Rs232_rx2;    
        end
    assign neg_edge = Rs232_rx3 & Rs232_rx2 & ~Rs232_rx1 & ~Rs232_rx0;
    
    always@(posedge clk or negedge rst_n)
    if(!rst_n) begin
        bps_start <= 1'b0;
        rx_int <= 1'b0;
    end
    else if (neg_edge) begin 
        bps_start <= 1'b1;
        rx_int <= 1'b1;
    end
    else if (num == 4'd10) begin
        bps_start <= 1'b0;
        rx_int <= 1'b0;  
    end 
   
   always@(posedge clk or negedge rst_n)
   if(!rst_n) begin
        rx_data_t1 <= 8'd0; 
        rx_data_t2 <=8'd0;
        num <= 4'd0;
   end
   else if(rx_int) begin 
    if (bps_clk) begin 
        num <= num+1'b1;
        case(num)
            4'd1: rx_data_t1[0] <= Rs232_rx
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在FPGA中实现UART串口,需要设计两个模块,分别是uart_rx和uart_tx模块。其中,uart_rx模块负责接收串口数据,而uart_tx模块负责发送串口数据。在uart_rx模块中,可以使用线性序列机的设计方法,通过时序图来描述其功能。时序图中可以清楚地看到数据的传输过程,包括起始位、数据位和结束位的发送和接收。具体的代码实现可以参考引用\[1\]和引用\[2\]中的内容。在设计FPGA时,养成良好的设计习惯非常重要,可以先画出实验的框图,然后对每个小模块进行时序设计。这样可以避免在复杂项目中茫然无措。引用\[3\]中提供了一个实验框图的例子,可以作为参考。 #### 引用[.reference_title] - *1* *3* [基于FPGA的UART设计(1)](https://blog.csdn.net/zhangningning1996/article/details/103836599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基于FPGA实现uart串口模块(Verilog)--------接收模块及思路总结](https://blog.csdn.net/qq_41467882/article/details/87027577)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值