m0_65900767 2024-06-25 12:26 采纳率: 33.3%
浏览 3

关于#fpga开发#的问题:uart串行传输


`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 = 1;
    
    wire w_rx_done;
    wire[DATA_WIDTH-1 : 0] w_data;
    
    reg [143:0] buffer;
    reg [4:0] index = 5'b00000;
    reg [63:0] plaintext;
    reg [63:0] ciphertext;
    reg [79:0] key;
    reg [7:0] rs;
    reg [3:0] rs_index = 4'b0000;
    
    reg [0:0] a_done = 1'b0;
    reg [0:0] b_done = 1'b0;
    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数据接收完成标志
    );
    
    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;
            b_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
                rs <= ciphertext[63 - rs_index * 8 +: 8];
                rs_index <= rs_index + 1;
                c_done <= 1'b1;
            end
        end
        else if (a_done) begin
             ciphertext <= plaintext;
             b_done <= 1'b1;
        end
        else if (w_rx_done) begin
            // 接收到一个字节的数据
            buffer[143 - index * 8 +: 8] <= w_data; // 存储数据到缓冲区
            index <= index + 1;     // 增加索引,指向下一个存储位置
            if (index == 18) begin
                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


请问这哪里出错了,我输入了144位,输出只有1位

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-25 12:26
    关注

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


    在您提供的代码中,我注意到了几个可能影响数据传输的点,让我们一起来分析并找出可能的问题所在:

    1. 数据缓冲区大小:您使用了一个reg [143:0] buffer;来存储接收到的数据。这个缓冲区的大小是144位,理论上足够存储您提到的144位数据。但是,您需要确保数据在缓冲区中正确地存储和读取。

    2. 数据索引管理:您的代码中使用了一个reg [4:0] index = 5'b00000;来作为数据索引。在接收数据时,您使用index来更新缓冲区的位置。如果index没有正确地递增或者递增逻辑有误,可能会导致数据写入错误的位置。

    3. 接收完成标志w_rx_done信号表明一次数据接收完成。在您的代码中,当w_rx_done为高电平时,您将数据写入buffer。如果这个信号没有正确地触发,或者数据写入逻辑有误,也可能导致数据丢失。

    4. 数据传输逻辑:在uart_tx模块中,您使用rs寄存器来存储要发送的数据,并且使用c_done作为数据有效标志。您需要确保c_done在正确的时机被设置为高电平,并且rs寄存器中的数据是您想要发送的数据。

    5. 数据长度和传输:您的代码中,当index达到18时,您将plaintextkey分别赋值为缓冲区的前64位和后80位。然后,您将a_done设置为高电平,这似乎意味着您已经准备好发送数据。但是,您需要确保c_done在数据准备好发送时被正确设置,并且rs寄存器中的数据是连续的,没有被截断。

    6. uart_tx模块的实现:您没有提供uart_tx模块的实现代码,因此我们无法确定是否存在问题。确保uart_tx模块能够正确地处理数据传输,包括数据的加载、发送以及校验位的生成。

    7. 测试和调试:在FPGA开发中,测试和调试是非常重要的。您可以使用仿真工具来模拟您的设计,并检查数据在各个阶段的流动是否如预期。

    8. 参考链接:虽然您要求提供参考链接,但是在这里我建议首先检查和调试您的代码。如果需要进一步的帮助,您可以查找UART通信协议的相关资料,或者使用FPGA开发板的官方文档和社区论坛来获取帮助。

    最后,我建议您使用仿真工具(如ModelSim)来逐步跟踪您的设计,查看数据在各个阶段的流动,并确保所有信号和寄存器的值都是正确的。这将帮助您找到问题所在并进行修复。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 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精度相同