FPGA零基础学习之Vivado-EEPROM驱动设计

原创 FPGA技术江湖 2023-08-24 07:52

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。“煮酒言欢”进入IC技术圈,这里有近100个IC技术公众号。


大侠好,欢迎来到FPGA技术江湖。本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。

系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,EEPROM驱动设计。话不多说,上货。


EEPROM驱动设计


作者:李西锐  校对:陆辉


EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电数据不丢失的存储芯片。EEPROM可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。

EEPROM(带电可擦可编程只读存储器)是用户可更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。在一个EEPROM中,当计算机在使用的时候可频繁地反复编程,因此EEPROM的寿命是一个很重要的设计考虑参数。EEPROM是一种特殊形式的闪存,其应用通常是个人电脑中的电压来擦写和重编程。我们以SANXIN-B04板卡上的EEPROM为例,向大家介绍一下其驱动方式。EEPROM型号为24LC64。


从特征中我们可以看出一些信息:

1、两线串行总线,使用IIC接口协议。

2、有自擦除/写循环时间。

3、有32字节页写和单字节写模式。

4、最大5ms的写循环时间。

知道了以上信息之后,那么我们继续往下看手册。


在这段描述中,我们可以看出,24LC64是一个8K*8的一个存储器,总共64K bit的容量。因为存储深度为8K,也就意味着芯片的地址有需要有8K个,也就是有8192个,从0开始到8191,那么地址线的位宽就是13位。这也就是我们在写时序图中展示的高字节地址和低字节地址。此外,芯片的供电范围是1.8V到5.5V。芯片有页写功能,最多可写32字节。允许最多有8个芯片连接到相同的总线上。

管脚及功能介绍:


A0、A1、A2三个端口为片选输入,当这三个端口的电平与从机地址相同时,该芯片被选中,这些管脚必须接电源或者地。


SDA是一个双向总线用于传输地址和数据,在SCL为低电平的时候,正常的数据传输SDA是允许被改变的,如果在SCL为高电平期间改变就会被认为是开始和停止条件。


SCL为串行时钟,用于同步数据的传输,由主机发出。


写保护管脚,这个管脚可以连接地、电源或悬空。如果悬空,这个管脚上的下拉电阻会让芯片保持不被保护的状态。如果连接到了地或者悬空,正常的存储器操作是有效地,如果连接到了电源,写操作是禁止的,读操作不受影响。


在SCL为高电平时,SDA由高变低被视为开始条件,所有的命令必须在开始条件之后。

在SCL为高电平时,SDA由低变高被视为停止条件,所有的操作必须以停止条件结束。


端口介绍完,这里要着重说明一下应答信号。每次接收完8bit数据,从机需要产生一个应答信号,主机必须产生一个额外的时钟周期伴随着应答信号。注释:芯片如果有内部循环在进程中的话,是不会产生应答信号的。在时钟为高电平的时候,芯片的应答信号必须拉低SDA,并且在SCL低电平期间保持稳定。


上图为IIC总线的示意图,其中开始条件与停止条件在上文已经描述过。其次是数据的读写,在图中,SCL为高电平时,地址或应答有效,那么我们就在数据有效的时候进行采数;在SCL为低电平时,数据允许被改变,那么我们发送数据就在此时间段。

在了解了端口的作用及功能之后,我们做一个总结:

1、起始条件:SCL为高电平,SDA由高变低。

2、停止条件:SCL为低电平,SDA由低变高。

3、数据接收在SCL高电平期间。

4、数据发送在SCL低电平期间。

5、A0、A1、A2、WP在电路图中已经全部接地,在代码中我们不需要关注。


电路图中可以看出,我们的EEPROM的控制管脚只有SCL和SDA。


设计框架


按照上面的框架,完成各部分代码,最后在此框架的基础上,再加上数码管模块,用来显示从EEPROM里面读出的数据。

新建工程:

新建好工程后,新建文件,开始写代码,首先是写模块。

写时序如下图。


我们以单字节写为例,因为在写的工程中,没写8bit,就要读一次ACK,所以在此我得做法是,读模块只写8bit的线性序列机,代码如下:

1   module iic_wr(2 3     input   wire        clk,4     input   wire        rst_n,5     6     input   wire        wr_en,7     input   wire  [7:0] wr_data,8     9     output  reg         wr_scl,10    output  reg         wr_sda,11    output  wire        wr_done12  );1314    parameter f_clk = 50_000_000;15    parameter f = 100_000;16    parameter t = f_clk / f / 4;17    18    reg   [11:0]    cnt;19    20    always @ (posedge clk, negedge rst_n)21    begin22    if(rst_n == 1'b0)23      cnt <= 12'd0;24    else if(wr_en)25      begin26      if(cnt == 32 * t - 1)27        cnt <= 12'd0;28      else29        cnt <= cnt + 1'b1;30      end31    else32      cnt <= 12'd0;33    end34    35    always @ (posedge clk, negedge rst_n)36    begin37    if(rst_n == 1'b0)38      begin39      wr_scl <= 1'b0;40      wr_sda <= 1'b0;41      end42    else if(wr_en)43      case(cnt)44      0         : begin wr_scl <= 1'b0; wr_sda <= wr_data[7]; end45      1 * t - 1 : begin wr_scl <= 1'b1; end46      3 * t - 1 : begin wr_scl <= 1'b0; end47      4 * t - 1 : begin wr_sda <= wr_data[6]; end48      5 * t - 1 : begin wr_scl <= 1'b1; end49      7 * t - 1 : begin wr_scl <= 1'b0; end50      8 * t - 1 : begin wr_sda <= wr_data[5]; end51      9 * t - 1 : begin wr_scl <= 1'b1; end52      11* t - 1 : begin wr_scl <= 1'b0; end53      12* t - 1 : begin wr_sda <= wr_data[4]; end54      13* t - 1 : begin wr_scl <= 1'b1; end55      15* t - 1 : begin wr_scl <= 1'b0; end56      16* t - 1 : begin wr_sda <= wr_data[3]; end57      17* t - 1 : begin wr_scl <= 1'b1; end58      19* t - 1 : begin wr_scl <= 1'b0; end59      20* t - 1 : begin wr_sda <= wr_data[2]; end60      21* t - 1 : begin wr_scl <= 1'b1; end61      23* t - 1 : begin wr_scl <= 1'b0; end62      24* t - 1 : begin wr_sda <= wr_data[1]; end63      25* t - 1 : begin wr_scl <= 1'b1; end64      27* t - 1 : begin wr_scl <= 1'b0; end65      28* t - 1 : begin wr_sda <= wr_data[0]; end66      29* t - 1 : begin wr_scl <= 1'b1; end67      31* t - 1 : begin wr_scl <= 1'b0; end68      default : ;69      endcase70    end 71    72    assign wr_done = (cnt == 32 * t - 1) ? 1'b1 : 1'b0;7374  endmodule


在写模块中,我们选择在SCL低电平中心位置发送数据,那么为了方便我们写线性序列机,我们将四分之一SCL周期看做是一个单位时间T,总共8bit时间,所以计数器需要计数32个T。

读模块代码如下:

1   module iic_rd(2 3     input   wire          clk,4     input   wire          rst_n,5     6     input   wire          rd_sda,7     input   wire          rd_en,8     9     output  reg           rd_scl,10    output  reg   [7:0]   rd_data,11    output  wire          rd_done12  );1314    parameter f_clk = 50_000_000;15    parameter f = 100_000;16    parameter t = f_clk / f / 4;17    18    reg   [11:0]    cnt;19    20    always @ (posedge clk, negedge rst_n)21    begin22    if(rst_n == 1'b0)23      cnt <= 12'd0;24    else if(rd_en)25      begin26      if(cnt == 32 * t - 1)27        cnt <= 12'd0;28      else29        cnt <= cnt + 1'b1;30      end31    else32      cnt <= 12'd0;33    end3435    always @ (posedge clk, negedge rst_n)36    begin37    if(rst_n == 1'b0)38      begin39      rd_scl <= 1'b0;40      rd_data <= 8'd0;41      end42    else if(rd_en)43      case(cnt)44      0         : begin rd_scl <= 1'b0; end45      1 * t - 1 : begin rd_scl <= 1'b1; end46      2 * t - 1 : begin rd_data[7] <= rd_sda; end47      3 * t - 1 : begin rd_scl <= 1'b0; end48      5 * t - 1 : begin rd_scl <= 1'b1; end49      6 * t - 1 : begin rd_data[6] <= rd_sda; end50      7 * t - 1 : begin rd_scl <= 1'b0; end51      9 * t - 1 : begin rd_scl <= 1'b1; end52      10* t - 1 : begin rd_data[5] <= rd_sda; end53      11* t - 1 : begin rd_scl <= 1'b0; end54      13* t - 1 : begin rd_scl <= 1'b1; end55      14* t - 1 : begin rd_data[4] <= rd_sda; end56      15* t - 1 : begin rd_scl <= 1'b0; end57      17* t - 1 : begin rd_scl <= 1'b1; end58      18* t - 1 : begin rd_data[3] <= rd_sda; end59      19* t - 1 : begin rd_scl <= 1'b0; end60      21* t - 1 : begin rd_scl <= 1'b1; end61      22* t - 1 : begin rd_data[2] <= rd_sda; end62      23* t - 1 : begin rd_scl <= 1'b0; end63      25* t - 1 : begin rd_scl <= 1'b1; end64      26* t - 1 : begin rd_data[1] <= rd_sda; end65      27* t - 1 : begin rd_scl <= 1'b0; end66      29* t - 1 : begin rd_scl <= 1'b1; end67      30* t - 1 : begin rd_data[0] <= rd_sda; end68      31* t - 1 : begin rd_scl <= 1'b0; end69      default : ;70      endcase71    end72    73    assign rd_done = (cnt == 32 * t - 1) ? 1'b1 : 1'b0;7475  endmodule


在控制模块中,我们可以将每个bit分解开进行写,比如起始条件:


类比以上写法,停止条件也是如此。


在控制模块中我们使用状态机来完成数据的写入以及ACK的判断。我们在第一个状态中,可以加入一个按键来启动整个过程的开始。

在ACK读取的状态,我们在SCL高电平中心读取ACK的值,在此状态结束时判断ACK的值是否为0,如果为0说明响应正确,状态继续往下,否则返回起始条件状态。


在顶层代码中,我们需要加入三态门来控制双端口。


在写好代码之后,出现了一个问题,那就是我们无法仿真,因为单纯的看波形,会发现我们得不到正确的ACK,导致状态一直无法继续。因此我们将使用仿真模型来进行仿真,在仿真模型中,端口为芯片的控制端口。


在此模型中需要我们注意的一点就是,写循环时间定义的为5ms时间,如果大家觉得时间太长,可以自行修改。


仿真代码如下:

1   `timescale 1ns/1ps2 3   module iic_tb;4     5     reg            clk;6     reg            rst_n;7     reg            key;8     9     wire  [2:0]     sel;10    wire  [7:0]     seg;11    wire            SCL;12    wire            SDA;13    14    defparam iic_inst.jitter_inst.t = 10;15    16    pullup(SDA);17    18    initial begin19    clk = 0;20    rst_n = 0;21    key = 1;22    #100;23    rst_n = 1;24    #1000;25    key = 0;26    #1000;27    key = 1;28    #1000000;29    $stop;30    end31    32    always #10 clk = ~clk;33    34    iic iic_inst(3536    .clk        (clk),37    .rst_n      (rst_n),38    .key        (key),39    40    .sel        (sel),41    .seg        (seg),42    .SCL        (SCL),43    .SDA        (SDA)44  );4546    M24LC64 M24LC64_inst(47    .A0       (1'b0), 48    .A1       (1'b0), 49    .A2       (1'b0), 50    .WP       (1'b0), 51    .SDA      (SDA), 52    .SCL      (SCL)53    );5455  endmodule


写好代码之后,我们打开仿真波形进行观察。

 

在仿真波形中可以看出,我们读出来的数据跟写入的数据时一致的,即表明驱动正确。需要注意的是,在写循环时间内,我们发送的命令,芯片是不接收的,所以会出现起始条件、写控制字、ACK三个状态一直循环,直到数据写入完成,仿真模型才会返回ACK。此时,状态继续往下进行,直至结束。

我们从仿真模型中读出的数据,高电平是为高阻的,模型无法拉高,所以我们在仿真中可以自行上拉,这样才能看到完整且正确的数据。


 

至此,我们实验正确。



- End -


福利】:QQ交流群173560979,进群备注名字+学校/企业。
淘宝店铺:https://shop588964188.taobao.com
论坛网址:www.sxznfpga.com
叁芯智能FPGA课程

FPGA技术江湖广发江湖帖

无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。


FPGA技术江湖微信交流群

加群主微信,备注姓名+公司/学校+岗位/专业进群


FPGA技术江湖QQ交流群

备注姓名+公司/学校+岗位/专业进群

FPGA技术江湖 任何技术的学习就好比一个江湖,对于每一位侠客都需要不断的历练,从初入江湖的小白到归隐山林的隐世高人,需要不断的自我感悟自己修炼,让我们一起仗剑闯FPGA乃至更大的江湖。
评论 (0)
  •   定制软件开发公司推荐清单   在企业数字化转型加速的2025年,定制软件开发需求愈发多元复杂。不同行业、技术偏好与服务模式的企业,对开发公司的要求大相径庭。以下从技术赛道、服务模式及行业场景出发,为您提供适配的定制软件开发公司推荐及选择建议。   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转
    华盛恒辉l58ll334744 2025-05-12 15:55 235浏览
  •   电磁数据展示系统平台解析   北京华盛恒辉电磁数据展示系统平台是实现电磁数据高效展示、分析与管理的综合性软件体系,以下从核心功能、技术特性、应用场景及发展趋势展开解读:   应用案例   目前,已有多个电磁数据展示系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据展示系统。这些成功案例为电磁数据展示系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与预处理   智能分析处理   集成频谱分析、时频变换等信号处理算法,自动提取时域频域特征;
    华盛恒辉l58ll334744 2025-05-13 10:20 78浏览
  • 在全球供应链紧张和国产替代需求推动下,国产存储芯片产业快速发展,形成设计到封测一体化的完整生态。北京君正、兆易创新、紫光国芯、东芯股份、普冉股份和佰维存储等六大上市公司在NOR/NAND Flash、DRAM、嵌入式存储等领域布局各具特色,推动国产替代提速。贞光科技代理的品牌紫光国芯,专注DRAM技术,覆盖嵌入式存储与模组解决方案,为多领域客户提供高可靠性产品。随着AI、5G等新兴应用兴起,国产存储厂商有望迎来新一轮增长。存储芯片分类与应用易失性与非易失性存储芯片易失性存储芯片(Volatile
    贞光科技 2025-05-12 16:05 98浏览
  • 递交招股书近一年后,曹操出行 IPO 进程终于迎来关键节点。从 2024 年 4 月首次递表,到 2025 年 4 月顺利通过中国证监会境外发行上市备案,并迅速更新招股书。而通过上市备案也标志着其赴港IPO进程进入实质性推进阶段,曹操出行最快有望于2025年内完成港股上市,成为李书福商业版图中又一关键落子。行路至此,曹操出行面临的挑战依然不容忽视。当下的网约车赛道,早已不是当年群雄逐鹿的草莽时代,市场渐趋饱和,竞争近乎白热化。曹操出行此时冲刺上市,既是背水一战,也是谋篇布局。其招股书中披露的资金
    用户1742991715177 2025-05-10 21:18 86浏览
  • 在 AI 浪潮席卷下,厨电行业正经历着深刻变革。AWE 2025期间,万得厨对外首次发布了wan AiOS 1.0组织体超智能系统——通过AI技术能够帮助全球家庭实现从健康检测、膳食推荐,到食材即时配送,再到一步烹饪、营养总结的个性化健康膳食管理。这一创新之举并非偶然的个案,而是整个厨电行业大步迈向智能化、数字化转型浪潮的一个关键注脚,折射出全行业对 AI 赋能的热切渴求。前有标兵后有追兵,万得厨面临着高昂的研发成本与技术迭代压力,稍有懈怠便可能被后来者赶
    用户1742991715177 2025-05-11 22:44 133浏览
  • 【拆解】+CamFi卡菲单反无线传输器拆解 对于单反爱好者,想要通过远程控制自拍怎么办呢。一个远程连接,远程控制相机拍摄的工具再合适不过了。今天给大伙介绍的是CamFi卡菲单反无线传输器。 CamFi 是专为数码单反相机打造的无线传输控制器,自带的 WiFi 功能(无需手机流量),不但可通过手机、平板、电脑等设备远程连接操作单反相机进行拍摄,而且还可实时传输相机拍摄的照片到 iPad 和电视等大屏设备进行查看和分享。 CamFi 支持大部分佳能和尼康单反相机,内置可充电锂离子电池,无需相机供电。
    zhusx123 2025-05-11 14:14 226浏览
  •   电磁数据管理系统深度解析   北京华盛恒辉电磁数据管理系统作为专业的数据处理平台,旨在提升电磁数据的处理效率、安全性与可靠性。以下从功能架构、核心特性、应用场景及技术实现展开分析:   应用案例   目前,已有多个电磁数据管理系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据管理系统。这些成功案例为电磁数据管理系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与接入:实时接收天线、频谱仪等设备数据,兼容多协议接口,确保数据采集的全面性与实时性
    华盛恒辉l58ll334744 2025-05-13 10:59 72浏览
  • 【拆解】+自动喷香机拆解 家里之前买了从PDD买了一个小型自动喷香机放在厕所里。来增加家里的温馨感,这东西看着确实小巧,精致。可是这东西吧,耗电就是快,没过几天就没电了。今个就让我拆开看看什么在捣鬼。如下是产品的实物和宣传图: 由于螺丝孔太小和限位很深。对于我的螺丝刀套装没用。只能使用那种螺丝刀细头,同时又长的小螺丝刀进行拆解 拧下三颗螺丝钉,用一字螺丝刀撬开外壳,内部结构就呈现在眼前。 内部构造相当简单,部件没多少。就是锂电池供电,通过MCU实现按键控制,段码屏控制,LE
    zhusx123 2025-05-10 19:55 125浏览
  • 在印度与巴基斯坦的军事对峙情境下,歼10C的出色表现如同一颗投入平静湖面的巨石,激起层层涟漪,深刻印证了“质量大于数量”这一铁律。军事领域,技术优势就是决定胜负的关键钥匙。歼10C凭借先进的航电系统、强大的武器挂载能力以及卓越的机动性能,在战场上大放异彩。它能够精准捕捉目标,迅速发动攻击,以一敌多却毫不逊色。与之形成鲜明对比的是,单纯依靠数量堆砌的军事力量,在面对先进技术装备时,往往显得力不从心。这一现象绝非局限于军事范畴,在当今社会的各个领域,“质量大于数量”都已成为不可逆转的趋势。在科技行业
    curton 2025-05-11 19:09 198浏览
  •         信创产业含义的“信息技术应用创新”一词,最早公开信息见于2019年3月26日,在江苏南京召开的信息技术应用创新研讨会。本次大会主办单位为江苏省工业和信息化厅和中国电子工业标准化技术协会安全可靠工作委员会。        2019年5月16日,美国将华为列入实体清单,在未获得美国商务部许可的情况下,美国企业将无法向华为供应产品。       2019年6
    天涯书生 2025-05-11 10:41 165浏览
  •   基于 2025 年行业权威性与时效性,以下梳理国内知名软件定制开发企业,涵盖综合型、垂直领域及特色技术服务商:   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次开发,CRM等领域有很多成功案例。   五木恒润科技有限公司:是一家专业的部队信
    华盛恒辉l58ll334744 2025-05-12 16:13 186浏览
  • 体积大小:14*11*2.6CM,电气参数:输入100V-240V/10A,输出16V24A。PCB 正面如下图。PCB 背面如下图。根据实际功能可以将PCB分成几部分:EMI滤波,PFC电路,LLC电路。EMI滤波区域,两级共模电感,LN各用了保险丝加压敏电阻,继电器(HF32FV-G)用来切除NTC的,为了提高效率点,如下图。PFC电路区域,如下图。LLC电路区域,如下图。详细分析一下该电源用的主要IC还有功率器件。AC侧采用了两颗整流桥进行并联,器件增加电流应力,如下图。共模电感都有放电针
    liweicheng 2025-05-10 20:03 81浏览
  • ‌磁光克尔效应(Magneto-Optic Kerr Effect, MOKE)‌ 是指当线偏振光入射到磁性材料表面并反射后,其偏振状态(偏振面旋转角度和椭偏率)因材料的磁化强度或方向发生改变的现象。具体表现为:1、‌偏振面旋转‌:反射光的偏振方向相对于入射光发生偏转(克尔旋转角 θK)。2、‌椭偏率变化‌:反射光由线偏振变为椭圆偏振(克尔椭偏率 εK)。这一效应直接关联材料的磁化状态,是表征磁性材料(如铁磁体、反铁磁体)磁学性质的重要非接触式光学探测手段,广泛用于
    锦正茂科技 2025-05-12 11:02 204浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦