57.基于IIC协议的EEPROM驱动控制(4)

(1)顶层代码:

复制代码
module IIC_EEPROM(
    
    input   wire                clk         ,
    input   wire                reset_n     ,
    input   wire                key_r       ,
    input   wire                key_w       ,
    
    output  wire                IIC_SCL     ,
    inout   wire                IIC_SDA     

);

wire                    key_rd      ;
wire                    key_wr      ;
wire    [7:0]           fifo_rd_data;
wire                    IIC_start   ;
wire                    wr_en       ;
wire                    rd_en       ;
wire    [15:0]          byte_addr   ;
wire    [7:0]           wr_data     ;
wire                    IIC_clk     ;
wire                    IIC_end     ;
wire    [7:0]           rd_data     ;



key_filter  key_w_filter(
        .clk                (   clk         ),
        .reset_n            (   reset_n     ),
        .key_in             (   key_w       ),
        .key_p_flag         (   key_wr      ),
        .key_r_flag         (               ),
        .key_state          (               )
);

key_filter  key_r_filter(
        .clk                (   clk         ),
        .reset_n            (   reset_n     ),
        .key_in             (   key_r       ),
        .key_p_flag         (   key_rd      ),
        .key_r_flag         (               ),
        .key_state          (               )
);

IIC_rw_data IIC_rw_data_inst(

    .clk                (clk            ),
    .reset_n            (reset_n        ),
    .key_rd             (key_rd         ),
    .key_wr             (key_wr         ),
    .IIC_clk            (IIC_clk        ),
    .IIC_end            (IIC_end        ),
    .rd_data            (rd_data        ),

    .fifo_rd_data       (fifo_rd_data   ),
    .IIC_start          (IIC_start      ),
    .wr_en              (wr_en          ),
    .rd_en              (rd_en          ),
    .byte_addr          (byte_addr      ),
    .wr_data            (wr_data        )
    
);

IIC_ctrl    IIC_ctrl_inst(

    .clk                (clk            ),
    .reset_n            (reset_n        ),
    .IIC_start          (IIC_start      ),
    .wr_en              (wr_en          ),
    .rd_en              (rd_en          ),
    .byte_addr          (byte_addr      ),
    .wr_data            (wr_data        ),
    .addr_num           (1'd1           ),

    .IIC_SCL            (IIC_SCL        ),
    .IIC_SDA            (IIC_SDA        ),
    .IIC_clk            (IIC_clk        ),
    .IIC_end            (IIC_end        ),
    .rd_data            (rd_data        )
    
);

endmodule

(2)顶层RTL视图:

(3)仿真代码:

复制代码
`timescale 1ns / 1ps

module IIC_EEPROM_tb;

reg         clk     ;
reg         reset_n ;
reg         key_r   ;
reg         key_w   ;

wire        IIC_SCL ;
wire        IIC_SDA ;  

initial clk = 1'd1;
always #10 clk = ~ clk;

defparam IIC_EEPROM_inst.key_w_filter.CNT_MAX = 5;
defparam IIC_EEPROM_inst.key_r_filter.CNT_MAX = 5;
defparam IIC_EEPROM_inst.IIC_rw_data_inst.CNT_WAIT_MAX = 10_000;

initial begin
    reset_n <= 1'd0;
    key_r   <= 1'd1;
    key_w   <= 1'd1;
    #21;
    reset_n <= 1'd1;
    #1000;
    key_r   <= 1'd1;
    key_w   <= 1'd0;
    #400;
    key_r   <= 1'd1;
    key_w   <= 1'd1;
    #200_000_000;
    key_r   <= 1'd0;
    key_w   <= 1'd1;
    #400;
    key_r   <= 1'd1;
    key_w   <= 1'd1;
    #400_000_000;
    $stop;
end
    
IIC_EEPROM  IIC_EEPROM_inst(
    
    .clk            ( clk       ),
    .reset_n        ( reset_n   ),
    .key_r          ( key_r     ),
    .key_w          ( key_w     ),

    .IIC_SCL        (IIC_SCL    ),
    .IIC_SDA        (IIC_SDA    )

);

M24LC64     M24LC64_inst(
    .A0              (1'd1       ), 
    .A1              (1'd1       ), 
    .A2              (1'd0       ), 
    .WP              (1'd0       ), 
    .SDA             (IIC_SDA    ),    
    .SCL             (IIC_SCL    ),
    .RESET           (~reset_n   )
);

endmodule

(4)仿真波形(官网提供的仿真模型不太理想,没有读取理想的数据):

(5)顶层加入ILA ip核进行在线逻辑分析:

相关推荐
Hello-FPGA2 小时前
AI 如何自动通过 PDF 原理图生成管脚映射
人工智能·fpga开发·pdf
zlinear数据采集卡3 小时前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
鬼手点金18 小时前
FPGA常用型号参考
fpga开发·verilog·vivado·xilinx·vhdl·altera·lattice
Kong_19942 天前
芯片开发学习笔记·二十九——大模型基础知识与 KV Cache 详解
fpga开发·芯片开发
m0_46644103詹湛2 天前
FPGA 定点数、小数与负数的加减乘除原理
fpga开发
zlinear数据采集卡2 天前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
zlinear数据采集卡2 天前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
FPGA小迷弟2 天前
Vivado中高速收发器GTX/GTH的配置与调试实战
fpga开发·fpga·硬件开发
minglie12 天前
简易寄存器接口SMMR---iic控制器
fpga开发
FPGA小迷弟2 天前
Vivado ILA与VIO调试工具实战指南:从入门到精通
fpga开发·fpga·硬件开发