【FPGA】FPGA实现IIC协议读写EEPROM(一) ----- IIC接口驱动实现

【FPGA】FPGA基于i2c的eeprom读写 文章目录一、i2c协议二、看i2c--eeprom手册找关键1.设别型号选择2.描述3.总线时序图4.总线开始和停止5.数据在总线上传输6.设备地址(控制命令)7.写操作8.读操作三、状态机设计1.i2c协议接口的状态图2.eeprom读写的状态图四、代码部分1.==i2c_interface.v==2.==master_ctrl.v==3.==top.v==4.其他模块五、仿真验证六、上板验证七、总结 一、i2c协议 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即 阅读详情
AI摘要

本文介绍IIC读写接口驱动模块的实现。先进行功能分析,阐述单字节写、单字节读、随机读和顺序读操作过程;接着说明输入/输出信号;再介绍IIC接口驱动状态机各状态;给出IIC接口驱动的Verilog代码;最后进行写数据和读数据的仿真测试。

写在前面
FPGA实现IIC协议读写EEPROM相关文章:

IIC通信协议
【FPGA】FPGA实现IIC协议读写EEPROM(一) ----- IIC接口驱动实现
【FPGA】FPGA实现IIC协议读写EEPROM(二) -----EEPROM读写控制模块实现
【FPGA】FPGA实现IIC协议读写EEPROM(三) ----- 汇总篇

在上篇文章中已经对IIC协议进行了详细介绍,本文介绍IIC读写接口驱动模块的实现。

一、功能分析

IIC接口驱动模块功能是按照IIC协议时序将数据写入EEPROM或者从EEPROM读取数据。根据上一篇IIC协议文章介绍我们不难分析出通过IIC协议单字节读写EEPROM的过程。
1、单字节写操作
(1)SDA总线拉低发送起始信号,开始传输数据。
(2)发送写控制字(4位器件地址+3位片选位+写标志0),接收从机应答ACK。
(3)发送寄存器地址,接收从机应答ACK。
(4)发送数据字节,接收从机应答ACK。
(5)SDA总线拉高,发送停止位,数据传输结束。
在这里插入图片描述

2、单字节读操作(当前地址读)
(1)SDA总线拉低发送起始信号,开始传输数据。
(2)发送读控制字(4位器件地址+3位片选位+读标志1),接收从机应答ACK。
(3)接收读回的单字节数据,发送非应答信号NACK。
(4)SDA总线拉高,发送停止位,数据传输结束。
在这里插入图片描述

3、随机读
(1)SDA总线拉低发送起始信号,开始传输数据。
(2)虚写:发送写控制字(4位器件地址+3位片选位+写标志0),接收从机应答ACK。
(3)发送寄存器地址,接收从机应答ACK。
(4)SDA总线拉低发送起始信号,开始传输数据。
(5)实际读操作:发送读控制字(4位器件地址+3位片选位+读标志1),接收从机应答ACK。
(6)接收读回的单字节数据,发送非应答信号NACK。
(7)SDA总线拉高,发送停止位,数据传输结束。
在这里插入图片描述

4、顺序读
顺序读操作是在随机读的操作之后进行的,当收到读回的数据时,主机发送应答信号ACK给从机,表示正确接收到了该字节数据,然后进行下一字节数据的接收、发送ACK,当不需要接收数据时,发送非应答信号NACK,SDA总线拉高,发送停止位,数据传输结束。
在这里插入图片描述

二、输入/输出信号

IIC接口驱动模块如下:
在这里插入图片描述

信号说明:

信号I/O类型说明
clkinput50MHz系统时钟
rdout[7:0]ouput读回的数据
rdout_vldouput读回的数据有效标志
rw_doneouput读写一字节数据完成标志
sclouputIIC时钟总线,最大400KHz,本工程使用200KHz
sdainoutIIC双向数据总线
reqinput读写请求
cmd[3:0]input传输操作控制命令组合(写、读、起始、停止、应答、非应答)
wr_din[7:0]input发送一字节数据

三、IIC接口驱动状态机

IIC接口驱动模块状态转移图如下:
在这里插入图片描述
状态说明:
IDLE:空闲状态,等待读写请求。
START:发送起始位。当控制命令cmd[5:0]中含有起始命令时,进行该状态发送起始位。
WR_DATA:写数据状态。在写数据状态期间,将wr_din[7:0]按照IIC协议时序写入EEPROM。
RD_DATA:读数据状态。在读数据状态期间,按照IIC协议时序从EEPROM中读取数据。
REC_ACK:接收从机发送的ACK应答信号。
SEND_ACK:发送ACK或者NACK信号。
STOP:发送停止位。当控制命令cmd[5:0]中含有停止命令时,进行该状态发送停止位。

四、IIC接口驱动实现

i2c_interface接口驱动verilog代码如下:

//  **************************************************************
//  Author: Zhang JunYi
//  Create Date: 2022.11.13                        
//  Design Name: i2c_eeprom    
//  Module Name: i2c_interface         
//  Target Device: Cyclone IV E (EP4CE6F17C8)             
//  Tool versions: Quartus Prime 18.1             
//  Description: I2C接口驱动模块
//  **************************************************************
`include "param.v"

module i2c_interface (
    input               clk                 ,
    input               rst_n               ,

    //  eeprom_ctrl
    input               req                 ,       //  读写请求
    input   [7:0]       wr_din              ,       //  需要发送的一字节数据
    input   [3:0]       cmd                 ,       //  控制命令组合
    output  [7:0]       rdout               ,       //  读取的数据
    output              rdout_vld           ,       //  读取数据有效标志
    output              rw_done             ,       //  读写一字节完成标志
    //  EEPROM
    input               sda_in              ,
    output              sda_out             ,
    output              sda_out_en          ,
    output              scl
);
    //  参数定义
    localparam  IDLE    =   7'b000_0001 ,
                START   =   7'b000_0010 ,
                WR_DATA =   7'b000_0100 ,
                RD_DATA =   7'b000_1000 ,
                REC_ACK =   7'b001_0000 ,
                SEND_ACK=   7'b010_0000 ,
                STOP    =   7'b100_0000 ;

    //  信号定义
    reg     [6:0]       state_c         ;
    reg     [6:0]       state_n         ;

    reg     [7:0]       cnt_scl         ;       //  scl周期计数器
    wire                add_cnt_scl     ;
    wire                end_cnt_scl     ;

    reg     [3:0]       bit_num         ;       //  bit数
    reg     [3:0]       cnt_bit         ;       //  bit计数器
    wire                add_cnt_bit     ;
    wire                end_cnt_bit     ;

    reg     [7:0]       dout_data       ;       //  发送数据寄存
    reg     [3:0]       command         ;       //  控制命令寄存

    reg                 scl_dout         ;       //  SDA寄存     
    reg                 sda_dout        ;
    reg                 sda_dout_en     ;

    reg     [7:0]       rx_data         ;       //  接收读回的数据
    reg                 ack_flag        ;       //  ack响应标志


    //  状态转移条件
    wire                idle2start      ;
    wire                idle2wrdata     ;
    wire                idle2rddata     ;
    wire                start2wrdata    ;
    wire                start2rddata    ;
    wire                wrdata2recack   ;
    wire                rddata2sendack  ;
    wire                recack2idle     ;
    wire                recack2stop     ;
    wire                sendack2idle    ;
    wire                sendack2stop    ;
    wire                stop2idle       ;

    //  状态机
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            state_c <= IDLE ;
        end
        else begin
            state_c <= state_n ;
        end
    end

    always @(*)begin
        case (state_c)
            IDLE: begin
                if(idle2start)
                    state_n = START ;
                else if(idle2wrdata)
                    state_n = WR_DATA ;
                else if(idle2rddata)
                    state_n = RD_DATA ;
                else
                    state_n = state_c ;
            end
            START: begin
                if(start2wrdata)
                    state_n = WR_DATA ;
                else if(start2rddata)
                    state_n = RD_DATA ;
                else
                    state_n = state_c ;
            end
            WR_DATA: begin
                if(wrdata2recack)
                    state_n = REC_ACK ;
                else
                    state_n = state_c ;
            end
            RD_DATA: begin
                if(rddata2sendack)
                    state_n = SEND_ACK ;
                else
                    state_n = state_c ;
            end
            REC_ACK: begin
                if(recack2idle)
                    state_n = IDLE ;
                else if(recack2stop)
                    state_n = STOP ;
                else
                    state_n = state_c ;
            end
            REC_ACK: begin
                if(sendack2idle)
                    state_n = IDLE ;
                else if(sendack2stop)
                    state_n = STOP ;
                else
                    state_n = state_c ;
            end
            STOP: begin
                if(stop2idle)
                    state_n = IDLE ;
                else
                    state_n = state_c ;
            end
            default: state_n = IDLE ;
        endcase
    end

    //  状态转移条件
    assign  idle2start      = state_c == IDLE       && req && (cmd & `STA)                      ;
    assign  idle2wrdata     = state_c == IDLE       && req && (cmd & `WRITE)                    ;
    assign  idle2rddata     = state_c == IDLE       && req && (cmd & `READ)                     ;
    assign  start2wrdata    = state_c == START      && end_cnt_bit && (command & `WRITE)        ;   
    assign  start2rddata    = state_c == START      && end_cnt_bit && (command & `READ)         ;   
    assign  wrdata2recack   = state_c == WR_DATA    && end_cnt_bit                              ;
    assign  rddata2sendack  = state_c == RD_DATA    && end_cnt_bit                              ;
    assign  recack2idle     = state_c == REC_ACK    && end_cnt_bit && (command & `STO) == 0     ;
    assign  recack2stop     = state_c == REC_ACK    && end_cnt_bit && (command & `STO)          ;
    assign  sendack2idle    = state_c == SEND_ACK   && end_cnt_bit && (command & `STO) == 0     ;
    assign  sendack2stop    = state_c == SEND_ACK   && end_cnt_bit && (command & `STO)          ;
    assign  stop2idle       = state_c == STOP       && end_cnt_bit                              ;

    //  cnt_scl  200KHz  一个SCL周期为250个系统时钟周期
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_scl <= 0 ;
        end
        else if(add_cnt_scl)begin
            if(end_cnt_scl)begin
                cnt_scl <= 0 ;
            end				
            else begin	    
                cnt_scl <= cnt_scl + 1 ;
            end 		    
        end
    end                 
    assign	add_cnt_scl	= state_c != IDLE ;
    assign	end_cnt_scl	= add_cnt_scl && (cnt_scl == `SCL_PERIOD - 1) ;

    //  bit_num
    always @(*)begin
        if(state_c == RD_DATA || state_c == WR_DATA)begin
            bit_num = 8 ;
        end
        else begin
            bit_num = 1 ;
        end
    end

    //  cnt_bit
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_bit <= 0 ;
        end
        else if(add_cnt_bit)begin
            if(end_cnt_bit)begin
                cnt_bit <= 0 ;
            end				
            else begin	    
                cnt_bit <= cnt_bit + 1 ;
            end 		    
        end
    end           
    assign	add_cnt_bit	= end_cnt_scl ;
    assign	end_cnt_bit	= add_cnt_bit && (cnt_bit == bit_num - 1) ;

    //  dout_data
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            dout_data <= 0 ;
        end
        else if(req)begin
            dout_data <= wr_din ;
        end
    end

    //  command
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            command <= 0 ;
        end
        else if(req)begin
            command <= cmd ;
        end
    end

    //  scl_dout
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            scl_dout <= 1'b1 ;
        end
        else if(idle2start | idle2wrdata | idle2rddata)begin
            scl_dout <= 1'b0 ;
        end
        else if(add_cnt_scl && cnt_scl == `SCL_HALF)begin
            scl_dout <= 1'b1 ;
        end
        else if(end_cnt_scl && ~stop2idle)begin
            scl_dout <= 1'b0 ;
        end
    end

    //  sda_dout_en
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            sda_dout_en <= 1'b0 ;
        end
        else if(idle2start || idle2wrdata || rddata2sendack || sendack2stop || recack2stop)begin
            sda_dout_en <= 1'b1 ;
        end
        else if(idle2rddata || start2rddata || wrdata2recack || stop2idle)begin
            sda_dout_en <= 1'b0 ;
        end
    end

    //  sda_dout
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            sda_dout <= 1'b1 ;
        end
        else if(state_c == START)begin
            if(cnt_scl == `HIGH_HALF)begin
                sda_dout <= 1'b0 ;
            end
            else if(cnt_scl == `LOW_HALF)begin
                sda_dout <= 1'b1 ;
            end
        end
        else if(state_c == WR_DATA && cnt_scl == `LOW_HALF)begin
            sda_dout <= dout_data[7 - cnt_bit] ;
        end
        else if(state_c == SEND_ACK && cnt_scl == `LOW_HALF)begin
            sda_dout <= (command & `STO) ? 1'b1 : 1'b0 ;
        end
        else if(state_c == STOP)begin
            if(cnt_scl == `LOW_HALF)begin       
                sda_dout <= 1'b0;
            end
            else if(cnt_scl == `HIGH_HALF)begin    
                sda_dout <= 1'b1;               
            end 
        end
        else if(wrdata2recack | rddata2sendack)begin
            sda_dout <= 1'b1;  
        end
    end
    //  rx_data
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            rx_data <= 0 ;
        end
        else if(state_c == RD_DATA && cnt_scl == `HIGH_HALF)begin
            rx_data[7 - cnt_bit] <= sda_in ;
        end
    end

    //  ack_flag
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            ack_flag <= 1'b0 ;
        end
        else if(state_c == REC_ACK && cnt_scl == `HIGH_HALF)begin
            ack_flag <= ~sda_in ;
        end
        else begin
            ack_flag <= 1'b0 ;
        end
    end

    //  输出
    assign rdout = rx_data ;   
    assign rdout_vld = rddata2sendack ;
    assign rw_done = stop2idle | sendack2idle | recack2idle ;
    assign sda_out = sda_dout ; 
    assign sda_out_en = sda_dout_en ;
    assign scl = scl_dout ;
    
endmodule     

param.v参数:

//  IIC时钟参数
`define  SCL_PERIOD  250
`define  SCL_HALF    125
`define  LOW_HALF    65 
`define  HIGH_HALF   190

//  控制命令
`define  WRITE    4'b1000     //  写
`define  READ     4'b0100     //  读
`define  STA      4'b0010     //  起始位
`define  STO      4'b0001     //  停止位

五、仿真测试

写数据:
在这里插入图片描述
读数据:
在这里插入图片描述
注意:
1. 这里仿真使用的是24LC04B的仿真模型,读数据的时候只能读0,读1显示的是高阻态。
2. 写周期是5ms,写完数据之后需要延时一段时间才能发送读请求,否则无法读回数据,这里我仿真延时300000个时钟周期。

I2C连续读写实现 上文的 i2c_bit_shift 模块说完了,我们发现实现一个字节的写操作还是可以实现的,实际的应用中我们不可能只写一个字节的数据,那么此时这个 i2c_bit_shift 模块用来连续写就有些不方便了,从上面的仿真代码就能看出来,这时就需要一个上层模块来控制这个i2c_bit_shift 模块去连续写,这样就方便一些。 阅读详情

相关推荐

FPGA实现IIC通信(读写EEPROM)

FPGA实现iic通信(读写EEPROM) 实验平台:正点原子ALIENTEK开拓者FPGA开发板 1. IIC协议简介 1.1 什么是IIC协议 IIC即为Inter-Inegrated Circuit(集成电路总线),在上世纪八十年代左右由Philips公司(即现做的NXP半导体公司)设计出来的一种简单、双向、二进制总线标准。其只需要两根线(SDA数据线和SCL时钟线)即可实现总线连接的器件间的通信。SDA和SCL都是双向I/O线,所以主要适用于数据量小,距离短的主从通信,数据的传输速率在标准模式下可达

xs_sd的博客 6845

FPGA——I2C仿真介绍与仿真模型使用

(没看我之前I2C的原理和代码骗的小伙伴,请先关注浏览观看)既然要通过仿真来验证,就要先明白一点,仿真要达到怎么样的效果才算是验证了设计的正确性,所以这里,仿真的思路也是需要先理清的。 作为一个I2C控制器,其首要目的自然是要能够按照I2C协议进行数据传输,而本实验在设计I2C控制器时,为了让控制器更加的通俗易懂理解,采用了底层传输逻辑和上层读写控制分开的设计方法,所以验证时,主要验证控制器根据Cmd端口不同的命令组合能否正确驱动SCLK和SDA信号产生传输时序。 例如,对于本...

weixin_44448586的博客 3385

Verilog实现IIC协议读写EEPROM

在FPGA设计中,IIC协议是一个十分常见的协议,因为几乎所有的EEPROM都是用这个协议进行配置。

mikusic的博客 4750

【FPGA】FPGA实现IIC协议读写EEPROM(三) ----- 汇总篇

FPGA实现IIC协议读写EEPROM工程汇总介绍

白码王子小张的博客 3559

FPGA实现IIC接口(2)--IIC接口芯片的实际使用

通过本文您会学到:如何用EEPROM来实现IIC接口。

孤独的单刀 4万+

基于FPGA的IIC协议实现EEPROM数据写入设计与实战

IIC(Inter-Integrated Circuit)总线是一种广泛应用的串行同步通信协议,由飞利浦公司于1980年代提出,旨在实现集成电路之间的低成本、低速通信。其核心物理结构依赖于两条信号线:SCL(Serial Clock Line)和SDA(Serial Data Line)。这两条线构成了整个IIC通信的基础骨架。SCL为时钟线,由主设备(Master)驱动,用于提供同步时钟信号。所有数据在SDA上的传输都必须与时钟边沿对齐。

weixin_35516624的博客 883

FPGA常用通信协议之IIC

目录 1、概述 2、IIC时序 2.1数据位的有效性规定 2.2起始/终止/应答/非应答信号 2.3数据传送格式 2.4总线的寻址 3 FPGA读写EEPROM 3.1EEPROM芯片手册 3.1.1写时序: 3.1.2读时序 3.1.3硬件原理图: 3.2RTL设计 3.2.1项目需求分析 3.2.2架构设计 4.IIC 工程Verilog代码下载 1...

青春易逝,愿不负昭华,期待梦与远方 1万+

433M无线遥控器EV1527协议解码实战:从逻辑分析到代码优化

本文详细解析了433M无线遥控器EV1527协议的实战解码过程。从使用逻辑分析仪抓取波形、理解同步头与数据位编码原理开始,逐步深入代码实现。文章重点对比了原始定时器轮询法的痛点,并提出了基于“边沿捕获+时间戳”的优化方案,构建了高效、可移植且具备抗干扰能力的解码引擎,最后分享了跨平台移植的核心技巧。

weixin_29168813的博客 927

详解IIC通信协议以及FPGA实现

I2C通信协议使用两根线(串行数据线SDA和串行时钟线SCL)进行通信,其中SDA用于传输数据,SCL用于传输时钟信号;支持多主设备和多从设备的通信,通过地址来识别不同的设备,并支持数据的读取和写入操作。

主要分享学习中的知识和遇到的问题 6202

PVE 9.0 保姆级安装及优化教程(换源、网络配置、远程唤醒等)【基础篇】

最近,Proxmox VE 推出了基于 Debian 13 的 9.0 版本。正巧我手头有一台闲置的老电脑,与其闲置,不如装上 PVE,让它化身 All in One,继续发挥它的余热。G4560 算是一颗 NAS 神 U,十几元的售价就能有双核四线程,比起什么 J1900 不知道强到哪里去了,尽管定位上是奔腾处理器,但性能甚至能和同代的酷睿 i3-7100 掰掰手腕,并且它还自带 HD 610 的核显,对于解码的支持也还不错。

zc_mk的博客 7511

NIDS——suricata(一)

NIDS——suricata环境安装和规则编写

weixin_58666006的博客 1273

IIC协议驱动EEPROM的Verilog实现与竞争冒险与下降沿触发、多重驱动

文章目录一、前言二、软硬件平台软件平台硬件平台三、IIC与EEPROMIIC简介1. 写操作大致步骤2. 读操作大致步骤3. IIC总线有以下几种状态1. 空闲状态2. 起始信号和结束信号3. 数据传输状态4. 应答信号/非应答信号4. 从机地址EEPROM简介EEPROM从机地址EEPROM数据地址EEPROM的五访问方式1. 字节写(BYTE WRITE)2. 页写(PAGE WRITE)3....

传承双龙的博客 7444

Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框架构思

最近因为工作原因需要使用Qt开发一个类似于Visio的流程图组件,需满足基本的流程图功能,图元类型可自定义扩展,不同图元存有各类自定义数据,可以保存为xml文件,可以读取xml文件生成流程图等等。

qq_43793182的博客 1万+

FPGA实现IIC协议(二)之IIC总线的FPGA实现(单次读写驱动)

FPGA实现IIC协议(二)之IIC总线的FPGA实现(单次读写驱动)

qq_44985628的博客 2933

Java炫酷烟花③(完整代码)

Java语言实现炫酷烟花动画的完整代码。 下载代码 下载链接:我是一只有趣的兔子,感谢你的喜欢。

AIGC 784

基于加速科技ST2500的SN74HC00N芯片测试计划

实际上随着工艺的进步,器件内部和引脚间的绝缘氧化膜越来越薄,导致漏电流发生的概率更大,另外制造过程中的工艺缺陷导致的桥接,异物或封装过程中造成的芯片划伤、引裂,都会造成IC的漏电流偏大,有部分产品可能会表现出漏电流偏大,但功能正常,此类产品具有潜在的可靠性问题,漏电流测试的目的就是把具有此类缺陷的产品筛选出来,避免其流到最终产品造成更大的损失。漏电流的测试方法相对简单,就是根据产品手册或测试规范对被测引脚施加额定的电压,然后测量其输入或流出的电流是否符合相应的设计规范。74HC00引脚功能如表所示。

weixin_68288412的博客 1439

【FPGA】FPGA实现IIC协议读写EEPROM(二) -----EEPROM读写控制模块实现

FPGA实现IIC协议读写EEPROM控制模块实现

白码王子小张的博客 2578

大数据领域数据产品的交通运输行业应用

您是否经历过早高峰被堵在桥上,看着导航显示“前方5公里缓行”却无能为力?是否见过货车司机绕远路导致成本飙升?这些“交通痛点”的背后,是传统交通管理依赖经验决策的局限。本文将聚焦“大数据数据产品”这一核心工具,从技术原理到实际应用,全面解析它如何为交通运输行业“开天眼”,解决从城市拥堵到物流效率的一系列难题。本文将按照“问题引入→概念拆解→技术原理→实战案例→应用场景→未来趋势”的逻辑展开,用生活化比喻降低理解门槛,用代码和数学模型提升专业性,最终帮您建立“大数据+交通”的完整认知框架。交通数据。

操作系统内核探秘的博客 237

基于FPGA的EEPROM读写测试项目(IIC驱动)

基于FPGA的EEPROM读写测试项目(IIC驱动)

weixin_47563272的博客 1979

SAP SD模块定价过程后台配置简介

只有手工输入定价时(例如,在定价中的定价浏览屏幕中),或者只有从外部处理转移这些定价时(例如,成本核算),才将这些定价包括在确定(价格确定、输出确定,批次确定)之中。定价过程的定义和分配是SD模块中最核心的配置,包含了条件表、条件类型、存取顺序、发票类型、客户定价过程等,确定了销售订单已什么价格销售、税率、附加折扣等多个条件行程有一个定价过程。12、小计:记录该条件类型在VBAP表中是否存储,以及其后续用途,如记入信贷,占用信贷额度,记入成本等,如果需要金额暂用信贷额度的话,在小计这里选择A即可。

我小时候很黑的博客 3783

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

EEPROM读写--IIC协议

文章目录1. EEPROM简介2. IIC通信协议2.1 AT24C64单次写时序2.2 AT24C64当前地址读时序2.3 AT24C64随机地址读时序3. 程序设计 1. EEPROM简介 EEPROM即电可擦除可编程只读存储器,是一种常用的非易失性存储器(掉电后,数据不丢失)。AT24C64内部分成256页,一页32个字节,总容量是8K(64K/8)个字节。接口:IIC 上图中A0/A1/A2时地址控制位,WP写保护,当WP=1时,只能读,当WP=0时,既能读也能写;SCL、SDA是IIC接口,SD

gemengxia的博客 8354

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

通过eeprom验证FPGA实现的单字节/页读写IIC接口时序

本文档介绍了基于FPGA的I2C EEPROM读写模块的设计和验证。通过使用两个按键控制,实现了对24C02 EEPROM的前64个地址的读写操作。文档详细描述了EEPROM的原理图、单字节和页读写时序,并展示了顶层模块的RTL视图。通过仿真和实际硬件测试,验证了I2C接口模块的设计正确性,包括单字节读写和页读写功能。资源消耗分析显示了模块的高效性。文档还提供了获取工程文件的方法,以便读者可以进一步研究和使用。

详解FPGA及硬件电路开发 1809

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【FPGA】基于IIC协议实现FPGA对EEPROM(24LC04B)的读写控制【附源码】

24LC04B是一种4kbit(2*256*8)容量的电可擦除PROM,该设备有两个256 x 8bit的存储块,具有2线串行接口(兼容IIC),支持最多写入16字节数据的页写功能, 兼容100kHz和400kHz的时钟速率,有16字节的页面写入缓冲区。

qq_46166093的博客 1508

ZYNQ-FPGA-IIC协议及eeprom读写

IIC协议是传输中常见的协议,其包括了SCL 和SDA 两个引脚,它是一种半双工协议即可以收可以发但是不能同时进行。传输速度不高但较为简单。如上图,SCL与SDA 都连接着上拉电阻,因此当SCL、SDA空闲时候被上拉为高电平1,因此我们通常用0来表示有效。在SDA线上挂着许多元器件,这些元器件有自己的器件地址,因此主机可以通过器件地址找到设备。IIC协议的状态:1.空闲,SCL与SDA被上拉为高电平2.开始,当SCL为高电平时候,SDA 出现第一个下降沿表示起始信号。

weixin_48444982的博客 1648

FPGA——基于IIC协议的EEPROM功能实现

关于EEPROM学习的小结。其中相关代码来自正点原子、相关资料来自米联客。

zhu1289的博客 3569

FPGA驱动IIC协议实现EEPROM高效读写与状态机优化实践

本文详细介绍了FPGA驱动IIC协议实现EEPROM高效读写的实践方法,重点解析了状态机设计、Verilog代码实现与优化技巧。通过分层架构和可复用驱动框架,提升了IIC控制器的效率和可靠性,并分享了仿真验证、上板调试及性能优化的实战经验,为FPGA开发者提供了一套完整的EEPROM存储控制解决方案。

mm9012的博客 874
上一篇: 【FPGA】FPGA实现UART串口通信回环
下一篇: 【FPGA】FPGA实现IIC协议读写EEPROM(二) -----EEPROM读写控制模块实现
白码王子小张
博客等级 码龄7年 6665粉丝 121原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值