m0_65900767 2024-06-25 19:22 采纳率: 33.3%
浏览 4

关于#fpga开发#的问题:uart串口通信

连板子之后发送144位数据,只收到了1位,请问是哪里出错了


`timescale 1ns / 1ps


module uart_loop(
    input i_clk_sys,    // 时钟
    input i_rst_n,      // 复位
    input i_uart_rx,    // 输入
    output o_uart_tx,   // 输出
    output o_ld_parity  // 校验位检验
    );
    
    localparam DATA_WIDTH = 8;      //有效数据位
    localparam BAUD_RATE = 115200;  //波特率
    localparam PARITY_ON = 0;       //无校验位
    localparam PARITY_TYPE = 0;     //偶校验
    
    wire w_rx_done;                //UART数据接收完成标志
    wire[DATA_WIDTH-1 : 0] w_data; //UART接收数据
    
    reg [143:0] buffer;            //缓冲区
    reg [4:0] index = 5'b00000;    //缓冲区下标
    reg [63:0] plaintext;          //明文
    reg [79:0] key;                //密钥
    reg [7:0] rs;                  //每8位输出
    reg [3:0] rs_index = 4'b0000;  //输出第几个8位
    
    reg [0:0] a_done = 1'b0;       //接收完成标志
    wire [0:0] b_done;             //加密完成标志
    wire [63:0] ciphertext;        //密文
    reg [0:0] c_done = 1'b0;       //可以输出标志
    
    uart_rx 
    #(
            .CLK_FRE(10),               //时钟频率,默认时钟频率为50MHz
            .DATA_WIDTH(DATA_WIDTH),    //有效数据位,缺省为8位
            .PARITY_ON(PARITY_ON),      //校验位,1为有校验位,0为无校验位,缺省为0
            .PARITY_TYPE(PARITY_TYPE),  //校验类型,1为奇校验,0为偶校验,缺省为偶校验
            .BAUD_RATE(BAUD_RATE)       //波特率,缺省为9600
    ) u_uart_rx
    (
        .i_clk_sys(i_clk_sys),      //系统时钟
        .i_rst_n(i_rst_n),          //全局异步复位,低电平有效
        .i_uart_rx(i_uart_rx),      //UART输入
        .o_uart_data(w_data),       //UART接收数据
        .o_ld_parity(o_ld_parity),  //校验位检验LED,高电平位为校验正确
        .o_rx_done(w_rx_done)       //UART数据接收完成标志
    );
    
    PRESENT_ENCRYPT dut(b_done, ciphertext, plaintext, key, i_clk_sys, i_rst_n, a_done);  //加密
    
    always@(posedge i_clk_sys or negedge i_rst_n) begin
        if (!i_rst_n) begin  //复位
            index <= 5'b00000;
            rs_index <= 4'b0000;
            a_done <= 1'b0;
            c_done <= 1'b0;
        end
        else if (b_done) begin  //加密完成
            if (rs_index == 8) begin  //输出完成
                c_done <= 1'b0;
            end
            else begin  //每8位输出
                rs <= ciphertext[63 - rs_index * 8 +: 8];
                rs_index <= rs_index + 1;
                c_done <= 1'b1;
            end
        end
        else if (w_rx_done) begin
            // 接收到一个字节的数据
            buffer[143 - index * 8 +: 8] <= w_data; // 存储数据到缓冲区
            index <= index + 1;     // 增加索引,指向下一个存储位置
            if (index == 18) begin  //64位明文和80位密钥接收完毕
                plaintext <= buffer[143:80];
                key <= buffer[79:0];
                index <= 5'b00000;
                a_done <= 1'b1;
            end
        end
    end
    
    uart_tx
    #(
        .CLK_FRE(10),              //时钟频率,默认时钟频率为50MHz
        .DATA_WIDTH(DATA_WIDTH),   //有效数据位,缺省为8位
        .PARITY_ON(PARITY_ON),     //校验位,1为有校验位,0为无校验位,缺省为0
        .PARITY_TYPE(PARITY_TYPE), //校验类型,1为奇校验,0为偶校验,缺省为偶校验
        .BAUD_RATE(BAUD_RATE)      //波特率,缺省为9600
    ) u_uart_tx
    (   .i_clk_sys(i_clk_sys),   //系统时钟
        .i_rst_n(i_rst_n),       //全局异步复位
        .i_data_tx(rs),          //传输数据输入
        .i_data_valid(c_done),   //传输数据有效
        .o_uart_tx(o_uart_tx)    //UART输出
        );
endmodule


  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-25 19:22
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在FPGA开发中,UART串口通信问题通常可以通过以下几个步骤来排查:

    1. 检查UART配置:确保UART接收和发送模块的配置正确,包括波特率、数据位、停止位、校验位等。在代码中,你已经设置了波特率BAUD_RATE为115200,并且选择了无校验位PARITY_ON和偶校验PARITY_TYPE

    2. 数据缓冲区索引:检查buffer数组的索引index和数据存储逻辑。从代码来看,你使用了一个5位的索引index来存储144位数据,这看起来是合理的,因为144位数据需要18个字节来存储,5位索引足以表示18个不同的状态。但是,你需要确保index的递增和数据存储逻辑是正确的。

    3. 接收完成标志处理:检查w_rx_done标志的处理逻辑。这个标志应该在接收到一个完整的数据帧后被设置。在代码中,当w_rx_done为高时,你将一个字节的数据存储到buffer中,并递增index。如果index达到18,表示接收完毕,然后重置index并设置a_done标志。

    4. 加密模块同步:检查PRESENT_ENCRYPT模块的接口和数据流是否与UART通信同步。确保加密模块的输入和输出与UART模块的接收和发送逻辑相匹配。

    5. 时钟频率和波特率匹配:检查时钟频率和波特率设置是否匹配。在代码中,你使用了CLK_FRE参数来设置时钟频率,但这个参数似乎没有在模块内部使用。确保时钟频率和波特率的设置能够支持你的通信需求。

    6. 调试和测试:使用逻辑分析仪或仿真工具来观察UART的接收和发送信号,检查数据是否正确发送和接收。

    7. 硬件连接:确保硬件连接正确,包括TX和RX引脚的连接。

    8. 串口终端设置:确保你的串口终端软件设置正确,与FPGA的设置相匹配。

    如果你需要进一步的帮助,可以提供更多的信息,比如UART模块的实现细节,或者使用逻辑分析仪捕获的波形图。此外,以下是一些可能有用的参考链接:

    请注意,由于我无法访问外部链接,上述链接仅为示例,你需要自行搜索相关内容。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月25日

悬赏问题

  • ¥15 ansys electronics 2021 R1安装报错,错误代码2,如图
  • ¥30 搭建面包板由NE555N和SN74LS90N组成的计时电路时出了问题
  • ¥15 无源定位系统的时差估计误差标准差
  • ¥15 请问这个代码哪里有问题啊
  • ¥20 python--version在命令端输入结果Python is not defined怎么办?还有pip不是exe格式是不是没安装成功?
  • ¥15 通过GaussianView进行结构微调消除虚频
  • ¥15 调用transformers库
  • ¥15 由于导出的数据名字中带有/,导致Matlab打不开,怎么办?
  • ¥15 新硬盘安装的程序总是崩溃,提示遇到错误
  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同