EEPROM的verilog HDL程序

抄了一下《Verilog数字系统设计教程》模拟MCU通过IIC随机读写EEPROM的程序。

程序说明:

本程序用于模拟IIC,对EEPROM采取字节写和字节读的方式进行操作。

协议内容:

1.只有在总线处于“非忙”状态时,数据传输才能开始。在数据传输期间,只要时钟线为高电平,数据线都必须保持稳定,否则数据线上的任何变化都会被当作“启动”或“停止”信号。

2.1总线“非忙”状态:该段内数据线SDA和时钟线SCL都保持高电平;

2.2启动数据传输:当时钟线为高电平时,数据线由高电平变为低电平的下降沿被认为是“启动”信号。只有出现“启动”信号之后,其他的命令才有效。

2.3数据有效:在出现“启动”信号以后,在时钟线SCL为高电平状态时,数据线是稳定的,这时数据线的状态就是要传输数据。数据线SDA上数据的改变必须在时钟线为低电平期间完成,每位数据占用一个时钟脉冲。每个数据传输都是有“启动”信号开始,结束于“停止”信号。

2.4停止数据传输:当时钟线为高电平时,数据线由低电平变为高电平的上升沿被认为是“停止”信号。随着“停止”的产生,所有的外部操作结束。

2.5应答信号:每个正在接收数据的EEPROM在接到一个字节的数据后,通常需要发出一个应答信号。而每个正在发送数据的EEPROM在发出一个字节的数据后,通常需要接收一个应答信号。EEPROM读写控制器必须产生一个与这个应答位相联系的额外的时钟脉冲。在EEPROM的读操作中,EEPROM读写控制器对EEPROM完成的最后一个字节不产生应答位,但是应该给EEPROM一个结束信号。


EEPROM的verilog HDL程序_第1张图片

程序是抄的,就不贴了。主要记录一下运行程序中出现的问题及解决办法。

1.程序中涉及到文件的读写,地址文件和数据文件都是存在.dat文件中的,开始总是报warning,说在路径下找不到文件。

将相对路径改成绝对路径也不行。最后发现是斜杠和反斜杠的问题。windows的文件系统使用的是反斜杠\,如D:\fpga\example16_4,但是vivado识别的是斜杠“/”。最终绝对路径的/是好使的,其他软件和相对路径没试。

2.模拟eeprom的文件总是报disable task要task在该语句附近,但是把对应的task...endtask放到之前、之后都没用。最后发现因为该文件不可综合,所以应该把它移到仿真文件中,因为disable是不可综合的。

3.DATA并行线是双向线,两个方向都出现了问题。思路:如果总线上该有输出的时候却是Z,查下该有输出时刻的控制线是否打开,因为这个时候说明没人驱动总线。如果总线上该有输出的时候却有X等异常信号,确认下该时刻接收方向是否已经通过控制线把总线释放。定位的时候首先找到assign语句,发现释放总线的语句位宽和赋值都写错了,解决了一个方向。另一个方向看不出来。因为输出到总线上的数据是从寄存器中来的,时刻变化,没办法确认是寄存器里就是Z还是控制线的时序有问题。所以把寄存器的内容固定死,发现输出正常了,说明控制线没问题,是该输出的数据没有正确的写到寄存器中。

查了好久,看到夏老师的注释,他没说清楚,蛋疼。

最后把他可能的意思都试了一下,发现先综合后仿真,不对;先综合再实现再仿真,对了。与他注释写的情况可以圆上。

结论:不同的仿真工具在处理高阻和不定态时有所不同。具体到这个程序,就是vivado对高阻态到1,RTL仿真时认为是负跳变,布线后仿真又认为不是。

夏老师注释说的是,RTL仿真时,ModelSim6.0以下不认为是,6.1以上认为是。布线后仿真6.1以上又认为不是。

4.仿真加断点是定位问题的好办法。


你可能感兴趣的:(逻辑)