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核进行在线逻辑分析:

相关推荐
Eloudy13 小时前
FPGA (QSFP28 + CMAC US+ RoCEv2) 与 Ubuntu22 + Mellanox 网卡直连分析
fpga开发
szxinmai主板定制专家14 小时前
RK3568+FPGA高速并行采集|半导体探针测试设备多通道同步数据采集系统设计
人工智能·嵌入式硬件·计算机视觉·fpga开发
ARM|X86+FPGA工业主板厂家2 天前
RK3588+FPGA+EtherCAT异构架构解析|工业场景如何同时保住AI算力与微秒级运动实时性
人工智能·fpga开发·架构
zlinear数据采集卡2 天前
从“脏信号”到“纳伏级纯净”:硬核拆解DABL7606的多级抗混叠滤波与24位过采样算法
arm开发·科技·嵌入式硬件·fpga开发·开源
尤老师FPGA2 天前
HDMI数据的接收发送实验(二十)
fpga开发
千寻xun3 天前
三、实战篇-NVME SSD控制之FPGA实现(一)
fpga开发·nvme ssd·nvme协议
XMAIPC_Robot3 天前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
upper20203 天前
从零开始设计riscv cpu记录之七
fpga开发·riscv·riscv设计·btb·分支预测
ARM|X86+FPGA工业主板厂家3 天前
AI视觉跟随运动控制实战|RK3588 NPU检测+FPGA EtherCAT多轴联动精准跟随方案,适用于半导体视觉对位等
人工智能·fpga开发·硬件工程·ethercat·实时系统
XMAIPC_Robot3 天前
RK3588+FPGA半导体设备量产踩坑大全|发热、时序漂移、推理抖动、成像干扰、EMC干扰方案
人工智能·嵌入式硬件·fpga开发·arm+fpga