FPGA上实现24C02存储器IIC通信的Verilog设计源码

版权申诉
5星 · 超过95%的资源 1 下载量 6 浏览量 更新于2024-11-03 收藏 363KB ZIP 举报
资源摘要信息:"本资源包含了使用Verilog语言编写的IIC协议与24C02 EEPROM存储器通信的Quartus 9.1工程源码。该工程可作为学习和设计参考,适用于FPGA开发板。工程中包含了两个主要的模块:iic_top顶层模块和iic_com IIC通信模块。此外,还包括了led_seg7模块,用于将数据通过7段数码管显示。整个系统设计用于通过IIC协议实现24C02存储器的读写操作,并且可以通过按键控制执行写入或读取存储器数据。该工程源码通过提供顶层模块的端口定义、模块间的接口连接以及内部模块的逻辑功能,详细展现了如何在FPGA上实现IIC总线协议,以及如何控制外部24C02存储器的读写过程。" 知识点详细说明: 1. FPGA与Verilog基础 - FPGA(Field-Programmable Gate Array)是一种可以通过编程来配置的集成电路,它允许工程师根据需要定制硬件功能。 - Verilog是一种硬件描述语言(HDL),用于模拟电子系统,并在FPGA和ASIC设计中广泛使用。 2. IIC协议原理 - IIC(Inter-Integrated Circuit)协议是一种串行通信协议,广泛应用于微控制器和各种外围设备之间的通信。 - IIC使用两条线进行通信:一条是串行数据线(SDA),另一条是串行时钟线(SCL)。 - 它支持多主机和多从机操作,通过地址识别和应答机制进行通信。 3. Quartus II软件 - Quartus II是Altera(现为Intel旗下公司)开发的一款FPGA设计软件,广泛用于设计、模拟和编程FPGA器件。 - 本资源中的工程源码是在Quartus II 9.1版本中创建的,用于实现Verilog模块的编译、仿真和下载到FPGA开发板。 4. 24C02 EEPROM存储器 - 24C02是一款基于IIC协议的串行EEPROM存储器,具有2K位存储容量。 - 它在多种电子设备中用于存储配置参数或小量数据,通常具有写保护功能。 5. 顶层模块iic_top - iic_top模块是整个工程的入口点,定义了与外部设备(如24C02和按键)连接的端口。 - 它包含了IIC通信模块iic_com和数码管显示模块led_seg7的实例化。 6. IIC通信模块iic_com - iic_com模块实现了与24C02存储器进行IIC通信的核心逻辑。 - 它包含了按键检测逻辑、分频逻辑和IIC通信逻辑。 - 按键检测逻辑用于识别按键按下事件,并触发写入或读取操作。 - 分频逻辑用于生成适合IIC协议的时钟信号,这里产生的是100kHz的时钟频率。 7. 数码管显示模块led_seg7 - led_seg7模块用于将读取到的数据在7段数码管上显示。 - 它接收来自iic_com模块的数据,并将其转换为数码管能显示的格式。 8. 信号定义 - clk:提供给模块的时钟信号,通常为FPGA开发板上的固定频率时钟。 - rst_n:复位信号,通常用于初始化系统或模块状态。 - sw1, sw2:控制读写操作的按键输入信号。 - scl:IIC时钟信号,连接至24C02的SCL引脚。 - sda:IIC数据信号,连接至24C02的SDA引脚。 - sm_cs1_n, sm_cs2_n:数码管的片选信号,用于选择激活的数码管。 - sm_db:7段数码管的数据输入,用于显示数据。 9. Verilog代码结构 - 使用模块化设计,将复杂系统分解为可管理的小模块。 - 使用参数化和模块化编程技术,便于代码的重用和维护。 10. 实验与设计参考 - 本资源不仅可以作为学习IIC通信和FPGA编程的实验资料,还可以作为进行相关设计工作的参考。 该资源的源码包文件名称为"verilogiic1121",包含了上述所有模块的Verilog代码文件,通过这些文件,用户可以进一步深入理解FPGA与Verilog编程,以及如何通过FPGA实现IIC协议与外部设备通信。
2021-08-20 上传
FPGA读写EEPROM芯片AT24C02实验Verilog逻辑源码Quartus11.0工程文件, FPGA型号为CYCLONE4E系列中的EP4CE6E22C8,可以做为你的学习设计参考。 module iic_com( clk,rst_n, sw1,sw2, scl,sda, dis_data ); input clk; // 50MHz input rst_n; //复位信号,低有效 input sw1,sw2; //按键1、2,(1按下执行写入操作,2按下执行读操作) output scl; // 24C02的时钟端口 inout sda; // 24C02的数据端口 output[7:0] dis_data; //数码管显示的数据 //按键检测 reg sw1_r,sw2_r; //键值锁存寄存器,每20ms检测一次键值 reg[19:0] cnt_20ms; //20ms计数寄存器 always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt_20ms <= 20'd0; else cnt_20ms <= cnt_20ms+1'b1; //不断计数 end always @ (posedge clk or negedge rst_n) begin if(!rst_n) begin sw1_r <= 1'b1; //键值寄存器复位,没有键盘按下时键值都为1 sw2_r <= 1'b1; end else if(cnt_20ms == 20'hfffff) begin sw1_r <= sw1; //按键1值锁存 sw2_r <= sw2; //按键2值锁存 end end //--------------------------------------------- //分频部分 reg[2:0] cnt; // cnt=0:scl上升沿,cnt=1:scl高电平中间,cnt=2:scl下降沿,cnt=3:scl低电平中间 reg[8:0] cnt_delay; //500循环计数,产生iic所需要的时钟 reg scl_r; //时钟脉冲寄存器 always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt_delay <= 9'd0; else if(cnt_delay == 9'd499) cnt_delay <= 9'd0; //计数到10us为scl的周期,即100KHz else cnt_delay <= cnt_delay+1'b1; //时钟计数 end always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 3'd5; else begin case (cnt_delay) 9'd124: cnt <= 3'd1; //cnt=1:scl高电平中间,用于数据采样 9'd249: cnt <= 3'd2; //cnt=2:scl下降沿 9'd374: cnt <= 3'd3; //cnt=3:scl低电平中间,用于数据变化 9'd499: cnt <= 3'd0; //cnt=0:scl上升沿 default: cnt <= 3'd5; endcase end end `define SCL_POS (cnt==3'd0) //cnt=0:scl上升沿 `define SCL_HIG (cnt==3'd1) //cnt=1:scl高电平中间,用于数据采样 `define SCL_NEG (cnt==3'd2) //cnt=2:scl下降沿 `define SCL_LOW (cnt==3'd3) //cnt=3:scl低电平中间,用于数据变化 always @ (posedge clk or negedge rst_n) begin if(!rst_n) scl_r <= 1'b0; else if(cnt==3'd0) scl_r <= 1'b1; //scl信号上升沿