EDAFPGAVHDLi2c读写Word文档格式.docx
- 文档编号:21674327
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:28
- 大小:18.59KB
EDAFPGAVHDLi2c读写Word文档格式.docx
《EDAFPGAVHDLi2c读写Word文档格式.docx》由会员分享,可在线阅读,更多相关《EDAFPGAVHDLi2c读写Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
--I2C时钟线
sda:
INOUTstd_logic;
--I2C数据线
wr_input:
--拨码开关输入想写入EEPROM的数据
rd_input:
--要求写的输入
lowbit:
--要求读的输入
en:
OUTstd_logic_vector(1DOWNTO0);
--输出一个低电平给矩阵键盘的某一行
seg_data:
OUTstd_logic_vector(7DOWNTO0));
--数码管使能
ENDi2c;
ARCHITECTUREtranslatedOFi2cIS
SIGNALseg_data_buf:
std_logic_vector(7DOWNTO0);
SIGNALcnt_scan:
std_logic_vector(11DOWNTO0);
SIGNALsda_buf:
std_logic;
--sda输入输出数据缓存
SIGNALlink:
--sda输出标志
--一个scl时钟周期的四个相位阶段,将一个scl周期分为4段
--phase0对应scl的上升沿时刻,phase2对应scl的下降沿时刻,phase1对应从scl高电平的中间时刻,phase2对应从scl低电平的中间时刻,
SIGNALphase0:
SIGNALphase1:
SIGNALphase2:
SIGNALphase3:
SIGNALclk_div:
--分频计数器
SIGNALmain_state:
std_logic_vector(1DOWNTO0);
SIGNALi2c_state:
std_logic_vector(2DOWNTO0);
--对i2c操作的状态
SIGNALinner_state:
std_logic_vector(3DOWNTO0);
--i2c每一操作阶段内部状态
SIGNALcnt_delay:
std_logic_vector(19DOWNTO0);
--按键延时计数器
SIGNALstart_delaycnt:
--按键延时开始
SIGNALwriteData_reg:
--要写的数据的寄存器
SIGNALreadData_reg:
--读回数据的寄存器
SIGNALaddr:
--被操作的EEPROM字节的地址
CONSTANTdiv_parameter:
std_logic_vector(7DOWNTO0):
="
01100100"
;
--分频系数,AT24C02最大支持400K时钟速率
CONSTANTstart:
std_logic_vector(3DOWNTO0):
0000"
--开始
CONSTANTfirst:
0001"
--第1位
CONSTANTsecond:
0010"
--第2位
CONSTANTthird:
0011"
--第3位
CONSTANTfourth:
0100"
--第4位
CONSTANTfifth:
0101"
--第5位
CONSTANTsixth:
0110"
--第6位
CONSTANTseventh:
0111"
--第7位
CONSTANTeighth:
1000"
--第8位
CONSTANTack:
1001"
--确认位
CONSTANTstop:
1010"
--结束位
CONSTANTini:
std_logic_vector(2DOWNTO0):
000"
--初始化EEPROM状态
CONSTANTsendaddr:
001"
--发送地址状态
CONSTANTwrite_data:
010"
--写数据状态?
CONSTANTread_data:
011"
--读数据状态
CONSTANTread_ini:
100"
SIGNALtemp_xhdl6:
SIGNALscl_xhdl1:
SIGNALlowbit_xhdl2:
SIGNALen_xhdl3:
SIGNALseg_data_xhdl4:
BEGIN
scl<
=scl_xhdl1;
lowbit<
=lowbit_xhdl2;
en<
=en_xhdl3;
seg_data<
=seg_data_xhdl4;
lowbit_xhdl2<
='
0'
;
temp_xhdl6<
=sda_bufWHEN(link)='
1'
ELSE'
Z'
sda<
=temp_xhdl6;
PROCESS(clk,rst)
BEGIN
IF(NOTrst='
)THEN
cnt_delay<
00000000000000000000"
ELSIF(clk'
eventandclk='
)THEN
IF(start_delaycnt='
IF(cnt_delay/="
11000011010100000000"
cnt_delay<
=cnt_delay+"
00000000000000000001"
ELSE
ENDIF;
ENDPROCESS;
clk_div<
00000000"
phase0<
phase1<
phase2<
phase3<
IF(clk_div/=div_parameter-1)THEN
=clk_div+"
00000001"
IF(phase0='
IF(clk_div="
01100011"
phase0<
IF(phase1='
00011000"
ENDIF;
IF(phase2='
00110001"
IF(phase3='
phase3<
01001010"
--///////////////////////////EEPROM操作部分/////////////
start_delaycnt<
main_state<
00"
i2c_state<
=ini;
inner_state<
=start;
scl_xhdl1<
sda_buf<
link<
writeData_reg<
00000101"
readData_reg<
addr<
00001010"
CASEmain_stateIS
WHEN"
=>
--等待读写要求
writeData_reg<
&
data_in;
IF(cnt_delay="
AND(NOT(wr_input='
)ORNOT(rd_input='
)))THEN
IF(NOTwr_input='
01"
IF(NOTrd_input='
10"
--向EEPROM写入数据
CASEi2c_stateIS
WHENini=>
--初始化EEPROM
CASEinner_stateIS
WHENstart=>
IF(phase1='
IF((phase3ANDlink)='
=first;
WHENfirst=>
link<
=second;
WHENsecond=>
IF(phase3='
=third;
WHENthird=>
=fourth;
WHENfourth=>
=fifth;
WHENfifth=>
=sixth;
WHENsixth=>
=seventh;
WHENseventh=>
=eighth;
WHENeighth=>
=ack;
WHENack=>
=sda;
IF(sda_buf='
=addr(7);
=sendaddr;
WHENOTHERS=>
NULL;
ENDCASE;
WHENsendaddr=>
--送相应字节的地址
=addr(6);
=addr(5);
=addr(4);
=addr(3);
sda_buf<
=addr
(2);
=addr
(1);
=addr(0);
WHENack=>
=writeData_reg(7);
inner_state<
=write_data;
NULL;
WHENwrite_data=>
---写入数据
WHENfirst=>
=writeData_reg(6);
=writeData_reg(5);
=writeData_reg(4);
=writeData_reg(3);
=writeData_reg
(2);
=writeData_reg
(1);
=writeData_reg(0);
=stop;
WHENstop=>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDAFPGAVHDLi2c 读写