?? i2c.v
字號:
/*
I2C總線是一種非常常用的串行總線,它操作簡便,占用接口少。本程序介紹操作一個I2C總線接口的EEPROM AT24C02
的方法,使用戶了解I2C總線協議和讀寫方法。
實驗過程是:按動開發板鍵盤某個鍵CPLD將撥碼開關的數據寫入EEPROM的某個地址,按動另外一個鍵,將剛寫入的數據
讀回CPLD,并在數碼管上顯示。(sw0為寫入,sw1為讀出)
為了更好的理解程序,用戶應該仔細閱讀光盤中的AT24C02的手冊
*/
module i2c(clk,rst,data_in,scl,sda,wr_input,rd_input,lowbit,en,seg_data);
input clk,rst;
output scl;//I2C時鐘線
inout sda;//I2C數據線
input[3:0] data_in;//撥碼開關輸入想寫入EEPROM的數據
input wr_input;//要求寫的輸入
input rd_input;//要求讀的輸入
output lowbit; //輸出一個低電平給矩陣鍵盤的某一行
output[1:0] en;//數碼管使能
output[7:0] seg_data;//數碼管段數據
reg[7:0] seg_data;
reg scl;
reg[1:0] en;
reg[7:0] seg_data_buf;
reg[11:0] cnt_scan;
reg sda_buf;//sda輸入輸出數據緩存
reg link; //sda輸出標志
reg phase0,phase1,phase2,phase3;//一個scl時鐘周期的四個相位階段,將一個scl周期分為4段
//phase0對應scl的上升沿時刻,phase2對應scl的下降沿時刻,phase1對應從scl高電平的中間時刻,phase2對應從scl低電平的中間時刻,
reg[7:0] clk_div;//分頻計數器
reg[1:0] main_state;
reg[2:0] i2c_state;//對i2c操作的狀態
reg[3:0] inner_state;//i2c每一操作階段內部狀態
reg[19:0] cnt_delay;//按鍵延時計數器
reg start_delaycnt;//按鍵延時開始
reg[7:0] writeData_reg,readData_reg;//要寫的數據的寄存器和讀回數據的寄存器
reg[7:0] addr;//被操作的EEPROM字節的地址
parameter div_parameter=100;// 分頻系數,AT24C02最大支持400K時鐘速率
parameter start=4'b0000, //開始
first=4'b0001, //第1位
second=4'b0010,//第2位
third=4'b0011, //第3位
fourth=4'b0100, //第4位
fifth=4'b0101, //第5位
sixth=4'b0110, //第6位
seventh=4'b0111, //第7位
eighth=4'b1000, //第8位
ack=4'b1001, //確認位
stop=4'b1010; //結束位
parameter ini=3'b000, //初始化EEPROM狀態
sendaddr=3'b001, //發送地址狀態
write_data=3'b010, //寫數據狀態
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -