您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于fpga的eeprom设计
二线制I2CCMOS串行EEPROM的FPGA设计姓名:钱大成学号:080230114院系:物理院电子系2011年1月1日河南大学物理与电子学院钱大成2一、课程设计摘要:(1)背景知识:A、基本介绍:二线制I2CCMOS串行EEPROMAT24C02/4/8/16是一种采用CMOS工艺制成的串行可用电擦除可编程只读存储器。B、I2C(InterIntegratedCircuit)总线特征介绍:I2C双向二线制串行总线协议定义如下:只有在总线处于“非忙”状态时,数据传输才能被初始化。在数据传输期间,只要时钟线为高电平,数据线都必须保持稳定,否则数据线上的任何变化都被当作“启动”或“停止”信号。图1是被定义的总线状态。①总线非忙状态(A段)数据线SDA和时钟线SCL都保持高电平。②启动数据传输(B段)当时钟线(SCL)为高电平状态时,数据线(SDA)由高电平变为低电平的下降沿被认为是“启动”信号。只有出现“启动”信号后,其它的命令才有效。河南大学物理与电子学院钱大成3③停止数据传输(C段)当时钟线(SCL)为高电平状态时,数据线(SDA)由低电平变为高电平的上升沿被认为是“停止”信号。随着“停在”信号出现,所有的外部操作都结束。④数据有效(D段)在出现“启动”信号以后,在时钟线(SCL)为高电平状态时数据线是稳定的,这时数据线的状态就要传送的数据。数据线(SDA)上的数据的改变必须在时钟线为低电平期间完成,每位数据占用一个时钟脉冲。每个数传输都是由“启动”信号开始,结束于“停止”信号。⑤应答信号每个正在接收数据的EEPROM在接到一个字节的数据后,通常需要发出一个应答信号。而每个正在发送数据的EEPROM在发出一个字节的数据后,通常需要接收一个应答信号。EEPROM读写控制器必须产生一个与这个应答位相联系的额外的时钟脉冲。在EEPROM的读操作中,EEPROM读写控制器对EEPROM完成的最后一个字节不产生应答位,但是应该给EEPROM一个结束信号。C、3.二线制I2CCMOS串行EEPROM读写操作①EEPROM的写操作(字节编程方式)所谓EEPROM的写操作(字节编程方式)就是通过读写控制器把一个字节数据发送到EEPROM中指定地址的存储单元。其过程如下:EEPROM读写控制器发出“启动”信号后,紧跟着送4位I2C总线器件特征编码1010和3位EEPROM芯片地址/页地址XXX以及写状态的R/W位(=0),到总线上。这一字节表示在接收到被寻址的EEPROM产生的一个应答位后,读写控制器将跟着发河南大学物理与电子学院钱大成4送1个字节的EEPROM存储单元地址和要写入的1个字节数据。EEPROM在接收到存储单元地址后又一次产生应答位以后,读写控制器才发送数据字节,并把数据写入被寻址的存储单元。EEPROM再一次发出应答信号,读写控制器收到此应答信号后,便产生“停止”信号。字节写入帧格式如图2所示:②二线制I2CCMOS串行EEPROM的读操作所谓EEPROM的读操作即通过读写控制器读取EEPROM中指定地址的存储单元中的一个字节数据。串行EEPROM的读操作分两步进行:读写器首先发送一个“启动”信号和控制字节(包括页面地址和写控制位)到EEPROM,再通过写操作设置EEPROM存储单元地址(注意:虽然这是读操作,但需要先写入地址指针的值),在此期间EEPROM会产生必要的应答位。接着读写器重新发送另一个“启动”信号和控制字节(包括页面地址和读控制位R/W=1),EEPROM收到后发出应答信号,然后,要寻址存储单元的数据就从SDA线上输出。读操作有三种:读当前地址存储单元的数据、读指定地址存储单元的数据、读连续存储单元的数据。在这里只介绍读指定地址存储单元数据的操作。读指定地址存储单元数据的帧格式如图3:河南大学物理与电子学院钱大成5(2)实现功能及设计思路:EEPROM是要实现接收来自信号源模型产生的读信号、写信号、并行地址信号、并行数据信号,并把它们转换为相应的串行信号发送到串行EEPROM(AT24C02/4/8/16)的行为模型中去的功能,同时它还发送应答信号(ACK)到信号源模型,以便让信号源来调节发送或接收数据的速度以配合EEPROM模型的接收(写)和发送(读)数据。其基本设计思路是利用同步有限状态机的设计方法实现,根据串行EEPROM的读写特性,用五个状态时钟完成写操作,用七个状态时钟完成读操作,通过编写EEPROM读写器的模块以及随机读写数据模块,再加上信号产生模块,最终封装在一块完成初步的设计。河南大学物理与电子学院钱大成6二、系统设计部分(1)整体设计的组织结构(2)子单元设计结构:①EEPROM的行为模型为了设计这样一个电路我们首先要设计一个EEPROM的VerilogHDL模型,而设计这样一个模型我们需要仔细地阅读和分析EEPROM器件的说明书,因为EEPROM不是我们要设计的对象,而是我们验证设计对象所需要的器件,所以只需设计一个EEPROM的行为模型,而不需要可综合风格的模型,这就大大简化了设计过程。下面的VerilogHDL程序就是这个EEPROM(AT24C02/4/8/16)能完成一个字节数据读写的部分行为模型。这里只对在操作中用到的信号线进行模拟,对于没有用到的信号线就略去了。对EEPROM用于基本总线操作的引脚SCL和SDA说明如下:SCL,串行时钟端,这个信号用于对输入和输出数据的同步,写入串行EEPROM的数据用其上升沿同步,输出数据用其下降沿同步;SDA,串行数据(/地址)输入/输出端。EEPROM的行为模型如下:河南大学物理与电子学院钱大成7//---------------eeprom.v文件开始-----------------`definetimeslice100moduleEEPROM(scl,sda);inputscl;inoutsda;regout_flag;reg[7:0]memory[2047:0];reg[10:0]address;reg[7:0]memory_buf;reg[7:0]sda_buf;reg[7:0]shift;reg[7:0]addr_byte;reg[7:0]ctrl_byte;reg[7:0]State;integeri;//------------------------------------------parameterr7=8'b10101111,w7=8'b10101110,//main7r6=8'b10101101,w6=8'b10101100,//main6r5=8'b10101011,w5=8'b10101010,//main5r4=8'b10101001,w4=8'b10101000,//main4r3=8'b10100111,w3=8'b10100110,//main3r2=8'b10100101,w2=8'b10100100,//main2r1=8'b10100011,w1=8'b10100010,//main1r0=8'b10100001,w0=8'b10100000;//main0//---------------------------------------------assignsda=(out_flag==1)?sda_buf[7]:1'bz;//---------------------寄存器和存储器初始化--------initialbeginaddr_byte=0;ctrl_byte=0;out_flag=0;sda_buf=0;State=2'b00;memory_buf=0;address=0;shift=0;for(i=0;i2047;i=i+1)memory[i]=0;end//--------------启动信号-----------------------always@(negedgesda)河南大学物理与电子学院钱大成8if(scl==1)beginState=State+1;if(State==2'b11)disablewrite_to_eeprm;end//----------------主状态机----------------------always@(posedgesda)if(scl==1)stop_W_R;elsebegincasex(State)2'b01:/******************************************************************************************************/Beginread_in;if(ctrl_byte==w7||ctrl_byte==w6||ctrl_byte==w5||ctrl_byte==w4||ctrl_byte==w3||ctrl_byte==w2||ctrl_byte==w1||ctrl_byte==w0)beginState=2'b10;write_to_eeprm;endelseState=2'b00;end2'b11:read_from_eeprm;default:State=2'b00;endcaseend//------------------------操作停止----------------------taskstop_W_R;begin河南大学物理与电子学院钱大成9State=2'b00;addr_byte=0;ctrl_byte=0;out_flag=0;sda_buf=0;endendtask//--------------------读进控制字和存储单元地址--------------taskread_in;beginshift_in(ctrl_byte);shift_in(addr_byte);endendtask//--------------------EEPROM的写操作-----------------------taskwrite_to_eeprm;beginshift_in(memory_buf);address={ctrl_byte[3:1],addr_byte};memory[address]=memory_buf;$display(eeprm-----memory[%0h]=%0h,address,memory[address]);State=2'b00;endendtask//----------------------EEPROM的读操作--------------------taskread_from_eeprm;beginshift_in(ctrl_byte);if(ctrl_byte==r7||ctrl_byte==r6||ctrl_byte==r5||ctrl_byte==r4||ctrl_byte==r3||ctrl_byte==r2||ctrl_byte==r1||ctrl_byte==r0)beginaddress={ctrl_byte[3:1],addr_byte};sda_buf=memory[address];shift_out;State=2'b00;endendendtask//---SDA数据线上的数据存入寄存器,数据在SCL的高电平有效----------河南大学物理与电子学院钱大成10taskshift_in;output[7:0]shift;begin@(posedgescl)shift[7]=sda;@(posedgescl)shift[6]=sda;@(posedgescl)shift[5]=sda;@(posedgescl)shift[4]=sda;@(posedgescl)shift[3]=sda;@(posedgescl)shift[2]=sda;@(posedgescl)shift[1]=sda;@(posedgescl)shift[0]=sda;@(negedgescl)begin#`timeslice;out_flag=1;sda_buf=0;en
本文标题:基于fpga的eeprom设计
链接地址:https://www.777doc.com/doc-2533875 .html