FPGA-EEPROM仿真成功,但上板无法读写

eeprom仿真能正确读写,但上板测试后无法写入;

最近写的按键读写eeprom实验,定义按键Key[0][1][2][3],分别对应按键1234;
8段数码管,按键2(Key[1])时显示00,进入准备读写状态;
按3时将此事是第几次在按键2的状态下按3的数值写入eeprom,并将该要写入的值显示在数码管上,这段没有问题;
按4时按地址顺序读出此时eeprom的值并将其传输到数码管上进行显示,这里我用S2_DATA来代表按3和按4时候应该显示的值,top仿真都没有任何问题,iic的rddata端口能收到正确读的数,且S2_DATA也显示正常;
但上板后在按键2按下的状态下按4,会一直显示FF,我的理解就是根本没有成功写入器件,求各位指点。
开发板型号:小梅哥ACX720 可直接移植

源码链接:
链接:https://pan.baidu.com/s/13tatjKuaIvlOnY3xPFvwjA?pwd=chhc
提取码:chhc

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这个问题可能有很多原因导致。下面是一些常见的问题和解决方法,您可以尝试:

  1. 确认 EEPROM 是否被正确连接:检查 EEPROM 的电源和地线是否正确连接,同时检查 SDA 和 SCL 线是否正确连接。可以使用示波器来检查信号线是否正常工作。

  2. 确认 I2C 总线是否正确工作:检查 I2C 总线是否工作正常。可以使用示波器来检查信号线是否正常工作,同时确保总线上没有其他设备干扰。

  3. 确认写操作是否正确:检查写操作是否正确。确保将写操作发送到正确的地址,并检查写操作是否已经完成。可以使用示波器来检查写操作是否正确。

  4. 确认读操作是否正确:检查读操作是否正确。确保将读操作发送到正确的地址,并检查读操作是否已经完成。可以使用示波器来检查读操作是否正确。

  5. 确认编程是否正确:检查程序是否正确编写。您可以使用调试器来检查程序执行时的变量值,以确保程序中没有错误。

  6. 确认 EEPROM 是否正确初始化:检查 EEPROM 是否正确初始化。EEPROM 可能需要初始化才能正确写入数据。请查看 EEPROM 的规格书以获取有关如何初始化 EEPROM 的信息。

  7. 确认电压是否正确:检查电压是否正确。EEPROM 可能需要特定的电压才能正常工作。请查看 EEPROM 的规格书以获取有关电压要求的信息。

您好,有关于您提出的FPGA-EEPROM的在开发板上无法读写的问题:
首先:检查下EEPROM仿真中的数据变化是否正确,如果仿真显示的数据正确的话那就说明不是输出数据的问题。
其次:检查下是不是你的输出信号和移位缓存器的输入时序什么的搞错了。
再次,在实例化时的参数是否有问题,比如本应该在其它地方设置的参数,结果放到顶层模块中去了等等。
最后,实测不行,仿真可以,大概率还是功能有问题,在仿真的时候没有考虑到,建议对代码一步步核查。保证功能没有问题的情况下,再考虑下时序问题

参考GPT和自己的思路,这个问题可能有多种原因,以下是一些可能的解决方案:

1 确认电路连接是否正确:检查电路板上连接eeprom的引脚是否正确连接,以及eeprom芯片本身是否插好。

2 确认时序是否正确:eeprom的读写操作需要正确的时序信号来进行,时序不正确可能导致eeprom无法读写。可以使用示波器检查时序信号是否正确。

3 确认地址是否正确:读写eeprom需要正确的地址,如果地址不正确,将无法读写eeprom。可以检查代码中的地址设置是否正确。

4 确认写入操作是否成功:在写入eeprom时,需要等待写入操作完成。如果写入操作失败,可以尝试重新写入或更换eeprom芯片。

5 确认电源是否稳定:电源波动可能导致eeprom无法正常读写。可以使用示波器检查电源信号是否稳定。

上题中的问题还可能涉及到FPGA代码的问题,具体需要根据实际情况分析。下面给出一个简单的示例代码,来演示如何在FPGA中读写EEPROM。
以下代码演示的是读取EEPROM中地址为0x00的数据:

module top (
    input wire clk,
    input wire rst_n,
    input wire [7:0] iic_addr,
    input wire iic_wr,
    input wire iic_rd,
    input wire [7:0] iic_data_in,
    output wire [7:0] iic_data_out
);

reg [7:0] eeprom_data;

// 定义EEPROM读写状态
localparam EEPROM_IDLE = 2'b00;
localparam EEPROM_WRITE = 2'b01;
localparam EEPROM_READ = 2'b10;

reg [1:0] eeprom_state;
reg [7:0] eeprom_addr;
reg [7:0] eeprom_data_out;
reg [7:0] iic_data;

// 定义时钟计数器
reg [3:0] clk_count;

always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        clk_count <= 4'b0000;
        eeprom_state <= EEPROM_IDLE;
        eeprom_addr <= 8'h00;
        eeprom_data <= 8'h00;
    end else begin
        // 增加时钟计数器
        clk_count <= clk_count + 1;

        // 根据时钟计数器确定EEPROM读写状态
        case (eeprom_state)
            EEPROM_IDLE: begin
                if (Key[1] == 1'b1) begin
                    // 进入准备读写状态
                    eeprom_state <= EEPROM_WRITE;
                end else begin
                    eeprom_state <= EEPROM_IDLE;
                end
            end

            EEPROM_WRITE: begin
                if (Key[3] == 1'b1) begin
                    // 写入数据到EEPROM
                    eeprom_data <= S2_DATA;
                    eeprom_state <= EEPROM_READ;
                end else begin
                    eeprom_state <= EEPROM_WRITE;
                end
            end

            EEPROM_READ: begin
                if (Key[4] == 1'b1) begin
                    // 读取EEPROM数据
                    iic_data <= 8'hA0;
                    iic_data_out <= eeprom_data;
                    eeprom_state <= EEPROM_IDLE;
                end else begin
                    eeprom_state <= EEPROM_READ;
                end
            end

            default: begin
                eeprom_state <= EEPROM_IDLE;
            end
        endcase
    end
end

endmodule

这段代码中,我们使用了一个状态机来管理EEPROM的读写操作。在状态机中,根据按键状态和时钟计数器的值,确定了EEPROM的读写状态。在读取EEPROM数据时,我们使用了I2C协议,将数据从EEPROM读取到输出端口。

请注意,这只是一个简单的示例代码,可能需要根据具体的电路设计进行修改。同时,这段代码中没有包含完整的I2C协议实现,需要根据实际情况进行修改。

https://www.baidu.com/link?url=5F4cG9ji0SAd1xpL4cNsSNXL2zbAarMS3A27x8SNPl5OBsqq9tADjmssRPW26ClBseuNvUlSUNrOF0fE1nmvtK9owv7qAsGuV3a0aXk2MUG&wd=&eqid=a0379519000805d70000000263fdda74