文档详情

FPGA读写i2c_verilog.doc

发布:2016-12-27约字共9页下载文档
文本预览下载声明
`timescale 1ns / 1ps //////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: // Design Name: // Module Name: iic_top // Project Name: // Target Device: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // //////////////////////////////////////////////////////////////////////////////// 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) if(!rst_n) cnt_20ms = 20d0; else cnt_20ms = cnt_20ms+1b1; //不断计数 always @ (posedge clk or negedge rst_n) if(!rst_n) begin sw1_r = 1b1; //键值寄存鞲次唬挥屑贪聪率奔刀嘉? sw2_r = 1b1; end else if(cnt_20ms == 20hfffff) begin sw1_r = sw1; //按键1值锁存 sw2_r = sw2; //按键2值锁存 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) if(!rst_n) cnt_delay = 9d0; else if(cnt_delay == 9d499) cnt_delay = 9d0; //计数到10us为scl的周期,即100KHz else cnt_delay = cnt_delay+1b1; //时蛹剖? always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt = 3d5; else begin case (cnt_delay) 9d124: cnt = 3d1; //cnt=1:scl高电平中间,用于数据采样 9d249: cnt = 3d2; //cnt=2:scl下降沿 9d374: cnt = 3d3; //cnt=3:scl低电平中间,用于数据变化 9d499: cnt = 3d0; //cnt=0:scl上升沿 default: cnt = 3d5; endcase end end `define SCL_POS (cnt==3d0) //cnt=0:scl上升沿 `define SCL_HIG (cnt==3d1) //cnt=1:scl高电平中间,用于数据采样 `define SCL_NEG (cnt==3d2) //cnt=2:scl下笛?`define SCL_LOW (cnt==3d
显示全部
相似文档