2023年VerilogIIC通信實(shí)驗(yàn)筆記_第1頁(yè)
2023年VerilogIIC通信實(shí)驗(yàn)筆記_第2頁(yè)
2023年VerilogIIC通信實(shí)驗(yàn)筆記_第3頁(yè)
2023年VerilogIIC通信實(shí)驗(yàn)筆記_第4頁(yè)
2023年VerilogIIC通信實(shí)驗(yàn)筆記_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

WritebyGianttank

我實(shí)驗(yàn)的是AT24co8的單字節(jié)讀,單字節(jié)寫,頁(yè)讀和頁(yè)寫,在高于3.3V系統(tǒng)中他的通信速率最高400KHz的,我實(shí)驗(yàn)里用的是100KHZ的速

率。圖1是硬件原理圖

圖工

DeviceAddress

圖2

圖2是器件地址,我的原理圖是A2接高。

IIC通信協(xié)議中要注意的地方:

1.當(dāng)時(shí)鐘線SCL高電平時(shí),假如把數(shù)據(jù)線SDA從高電平拉到低電平,則表達(dá)通信開始(START);假如把數(shù)據(jù)線SDA從低電平拉到高電平,則表達(dá)通信

結(jié)束(STOP)、SDA數(shù)據(jù)不變,視為數(shù)據(jù)采樣。

2,前一個(gè)STOP結(jié)束后。與下一個(gè)START開始要保證5ms的間隔。

3.頁(yè)寫有字節(jié)限制,而頁(yè)讀沒有,可以一次讀出所有的數(shù)據(jù)。

4.SDA信號(hào)在FPGA為接受方時(shí)要設(shè)立為高阻態(tài)。

5.應(yīng)答信號(hào)永遠(yuǎn)是接受方發(fā)送的,這個(gè)很重要,我就是卡在這里幾天沒找到因素。FPGA在讀數(shù)據(jù)的時(shí)候,第9個(gè)周期是FPGA發(fā)低電平給EEPRO

M的。

圖3

引腳定義

信號(hào)名稱方向描述

elkinpui50M的主時(shí)鐘

rst_ninput復(fù)位信號(hào)

swlinput按鍵1低電平有效按下執(zhí)行字節(jié)寫

sw2input按鍵2低電平有效按下執(zhí)行字節(jié)讀

sw3input按鍵3低電平有效按下執(zhí)行頁(yè)寫

sw4input按鍵4低電平有效按下執(zhí)行頁(yè)寫

SDAinoutHC數(shù)據(jù)端口

SCLoutputIIC時(shí)鐘端口

1eddataoutput數(shù)碼管段選

ledcomoutput數(shù)碼管位選

代碼中分了兩個(gè)模塊,iic_com模塊除了執(zhí)行和12c通信有關(guān)的代碼設(shè)計(jì)外,尚有按鍵檢測(cè)部分,而]edshow模塊只是驅(qū)動(dòng)數(shù)碼管顯示讀出的數(shù)

據(jù)。對(duì)于這個(gè)通信的過程,內(nèi)部使用了一段式狀態(tài)機(jī)進(jìn)行設(shè)計(jì)。圖4是狀態(tài)機(jī)的狀態(tài)圖。具體每個(gè)狀態(tài)見程序。

圖4

1.字節(jié)寫

ByteWrite

S

TW

AR

RI

TDEVICET

ADDRESSEWORDADDRESSDATA

SDAUNE[JU]工

MnLRiAI-:M::::::LiA[in

SS/CSSCA

BBwKBBKC

圖5

ModeIsim后仿真的圖

nniniri|||||np|in||jT

藍(lán)色為sda數(shù)據(jù)線高阻態(tài),fpga接受eeprom應(yīng)答。寫入數(shù)據(jù)88h.

2.字節(jié)讀

RandomRead

swSRS

TR;DEVICEET

AIAO

RDEVICETWORDDP

TADDRESSEADDRESSn-

-

MLRAMLAMLAN

SS/CSScSSCDATAno

BBwKBBkBBK

—A

C

K

DUMMYWHYE

圖6

ModeIsim后仿真的圖

nKhnl」J[JrLIiMrLrU"[[][VuTI

3.頁(yè)寫

,PageWrite

sw

TR

AI

RDEVICET

TADDRESSEWORDADDRESS(n)

0ALinn

LRAA

MS/CC

SBWKK

B

圖7

由于我只有8個(gè)數(shù)碼管,所以我程序里的頁(yè)寫,頁(yè)讀都只有4個(gè)數(shù)據(jù)。

Modelsim后仿真的圖

可以看到寫入數(shù)據(jù)位2lh,43h,65hz87ho

4.八龍

SequentialRead

RS

EAT

AC

DEVICEO

DKP

ADORESS

SOAUNEu

L

RAN

/CDATAno

wK

A

C

K

圖8

隨機(jī)字節(jié)讀和當(dāng)前字節(jié)讀都能觸發(fā)頁(yè)讀,我只做了隨機(jī)字節(jié)讀

Modelsim后仿真的圖

二匚二匚二匚:二匚二匚匚:[:二:匚二:匚二工:二:匚:二『:二:匚二匚二

HWLLT【IIILI;也

這里就是應(yīng)答是fpga應(yīng)答給eeprom的。

最后希望這篇文檔能幫助對(duì)IIC協(xié)議還不夠了解的同學(xué)。

源程序在下一篇文章中。

<ahref="blogs,com/cnb1ogs_com/gianttank/WindowsLiveWriter/verilogI

IC_CClB/clip_imageO02_2,jpg"Ximgwidth="786"height_265"title="clip_image002"style="bord

er-width:0px;display:inline;z,alt=,rc1ipimage002"src="hltp:〃image

/cnblogscom/gianttank/WindowsLiveWriter/verilogIIC_CCIB/c1ip_image002_thu

mb.jpgnborder="0"></a>

頂層

1timescaleIns/Ips

amodu1eiicmax(

4cIk,rst_n,

5swl,sw2,sw3,sw4,

scl,sda,

leddata,ledcom

8

9);

10

11inputclk;〃50MHz

Ainputrstn;〃復(fù)位信號(hào),低有效

「inputsw1,sw2,sw3,sw4;〃按鍵,(1按下執(zhí)行寫入操作,2按下執(zhí)行讀操作,3按下執(zhí)行連寫操作,4按下執(zhí)行

15連讀操作)

16outputscl;〃24co8的時(shí)鐘端口

17inoutsda;//24co8的數(shù)據(jù)端口

18

19

20output[7:0]ledcom;〃數(shù)碼管片選信號(hào),低有效

21output[7:0]1eddata;〃7段數(shù)碼管(不涉及小數(shù)點(diǎn))

22

23

24wire[7:0]tansdata;//傳送的數(shù)據(jù)

25wire[2:0]ackf1ag;〃標(biāo)志

26

27iiccomiiccom(

28

.clk(cIk),

29

30.rst_n(rst_n),

31.sw1(swl),

32.sw2(sw2),

J3

.sw3(sw3),

34

35.sw4(sw4),

36.sda(sda),

37.scl(scl),

38

.ackflag(ackf1ag),

39

40.outdata(tansdata)

41);

42ledshow1edshow(

43.c1k(clk),

AA

.rst_n(rst_n),

45

.ackflag(ackflag),

.1edcom(ledcom),

.1eddata(leddata),

.indata(tansdata)

);

endmodule

<fontface=z,Verdana/,>IICCOM

模塊</font>

timescaleIns/Ips

2

3moduleiiccom(

4cIk,rst_n,

5swl,sw2,sw3,sw4,

6

7scl,sda,

8ackflag,

9outdata

10

11

12

//50MHz

13inputc1k;

14inputrstn;//復(fù)位信號(hào),低有效

15inputswl,sw2,sw3,sw4;//按鍵,(1按下執(zhí)行寫入操作,2按下執(zhí)行讀操作,3按下執(zhí)行連寫操作,4按下執(zhí)

16行連讀操作)

17

18outputscl;//24co8的時(shí)鐘端口

19output[2:0]ackf1ag;//后面顯示接受到數(shù)據(jù)的標(biāo)準(zhǔn)

20inoutsda;//24co8的數(shù)據(jù)端口

21output[7:0]outdata;//數(shù)碼管顯示的數(shù)據(jù)

22

23

24

25//按鍵檢測(cè)

26regsw1_r,sw2_r,sw3_r,sw4_r;//鍵值鎖存寄存器,每20ms檢測(cè)一次鍵值

27

reg[19:0]cnt_20ms;//20ms計(jì)數(shù)寄存器

28

29

30always?(posedgec1kornegedgerst_n)

31if(!rst_n)cnt_20ms<=20'dO;

32elseif(cnt20ms==20*hfffff)ent_20ms<=2O'hO;

33

34eIsecnt_20ms<=ent_20ms+1'b1;//不斷計(jì)數(shù)

35

36always@(posedgeelkornegedgerst_n)

37if(!rst_n)begin

38

39sw1_r<=Vb1;//鍵值寄存器復(fù)位,沒有鍵盤按下時(shí)鍵值都為1

40sw2_r<=fbl;

41sw3_r<=fbl;

42sw4_r<=fbl;

43

end

44

45elseif(cnt_20ms==20>hffff0)begin

46swl_r<=swl;〃按鍵值鎖存

47sw2_r<=sw2;

48

49sw3r<=sw3;

50sw4_r<=sw4;

51end

52

53//

54

〃分頻部分

55

56reg[2:0]cnt;//cnt=0:scl上升沿,cnt=1:sc1高電平中間,cnt=2:sc1下降沿,cnt=3:scl低電平

57中間

58reg[8:0]cnt_delay;//500循環(huán)計(jì)數(shù),產(chǎn)生iic所需要的時(shí)鐘

59regscl_r;〃時(shí)鐘脈沖寄存器

60

61

62aIways@(posedgeelkornegedgerst_n)

63if(!rst_n)ent_delay<=9'dO;

64elseif(cntdelay==9'd499)cntdelay09'dO://計(jì)數(shù)至U10us為scl的周期,即10OK

65Hz

66

67elseent_delay<=cntde1ay+Tb1;//時(shí)鐘計(jì)數(shù)

68

69aIways@(posedgeelkornegedgerstn)begin

70if(!rst_n)ent<=3'd5;

71elsebegin

72

case(cnt_delay)

73

749*d124:cnt<=3'dl;〃cnt=l:sc1高電平中間,用于數(shù)據(jù)采樣

759'd255:ent<=3Zd2;〃cnt=2:sc1下降沿后面點(diǎn)

769'd374:ent<=3'd3;〃cnt=3:sc1低電平中間,用于數(shù)據(jù)變化

779'd495:ent<=3>dO;//cnt=0:scl上升沿前面點(diǎn)

78

79default:ent<=3'd5;

80endcase

81end

82end

83

84

85

'defineSCL_POS(ent==3'd0)//cnt=0:scl

86上升沿前面點(diǎn)

87defineSCL_IITG(cnt==3'dl)//cnt=l:scl高電平中間,用于數(shù)據(jù)采樣

88defineSCL.NEG(cnt==3*d2)//cnt=2:scl下降沿后面點(diǎn)

89defineSCL_LOW(ent==3*d3)〃cnt=3:sc]低電平中間,用于數(shù)據(jù)變化

90

91

92

always@(posedgeelkornegedgerst_n)

93

94if(!rst_n)scl_r<=Tb0;

95e1seif(cnt_delay==9,d499)scl_r<=1'bl;//scl信號(hào)上升沿

96elseif(cnt_de1ay==9Jd249)scl_r<=1'bO;〃scl信號(hào)下降沿

97

98

assignscl=sc1_r;//產(chǎn)生iic所需要的時(shí)鐘

99

10

0//需要寫入24C02的地址和數(shù)據(jù)

101

I0

defineDEVICEREAD8'b10101001//被尋址器件地址(讀操作)

2

103defineDEVICEWRITE8'bl010?1000//被尋址器件地址(寫操作)

104defineWRTTE_DATAO8Jb1000_l000

105defineWRITE_DATA18'b0010_0001//寫入EEPROM的數(shù)據(jù)

10

defineWRITE_DATA28'b0100_0011

6

8'bO110_0101

107defineWRITE_DATA3

I0defineWRITEDATA48*bl0000111

f?rne

81BYTE_ADDR8*b00000100〃寫入/讀出EEPROM的地址寄存器

g—7:0

1091db_r;//在IIC上傳送的數(shù)據(jù)寄存器

110[7

:read_data;

111[01//讀出EEPROM的數(shù)據(jù)寄存器

77:01

112eoutdata_r;//輸出數(shù)據(jù)貯存器

r

113amerPAGEDATA_NUM=3*d4;〃頁(yè)寫數(shù)據(jù)個(gè)數(shù)

114

11//-

5〃讀、寫時(shí)序

11

6parameterIDLE=1Tb0_0000_0000_0000_0001;//初始態(tài)

117parameterSTART1=17*b0_0000_0000_0000_0010:〃起始信號(hào)

118parameterADD1=17'b0_0000_0000__0000_0100;//寫入器件地址

119parameterACK1=17'b0_0000_0000_0000_1000;〃應(yīng)答

120

parameterADD2=17'b0_0000_0000_0001_0000;//寫入字節(jié)土也址

121

122parameterACK2=17*b0_0000_0000_0010_0000;//應(yīng)答

123parameterSTART2=irbooooooooo_oioooooo;//讀操作開始前的起始信號(hào)

124parameterADD3=1TbO000000001000_0000;〃寫入器件地址

125parameterACK3=17'b0000000010000_0000;//應(yīng)答

126

127parameterACKR=17*b10000_000000000000;//fpga給應(yīng)答

128parameterDATA=17'b00000_001000000000;//字節(jié)讀寫

129parameterPAGER二17'b0_0000_0100_0000_0000;//頁(yè)讀

130parameterPAGEW=1Vb0_0000_1000_0000_0000;//頁(yè)寫

131

132parameterACK4=17'b0_0001_0000_0000_0000;〃應(yīng)答

133parameterHIGH=17*b0_0010_0000_0000_0000;〃高電平

134parameterSTOPI=17'b0_0100_0000_0000_0000;//停止位

135parameterSTOP2=17'b0_1000_0000_0000_0000;//延時(shí)同步

136

137

138reg[l6:0]cstate;//狀態(tài)寄存器

139

140regsda_r;〃輸出數(shù)據(jù)寄存器

141regsdalink;//輸出數(shù)據(jù)sda信號(hào)inout方向控制位

142reg[3:0]num:〃讀寫的字節(jié)計(jì)數(shù)

14reg[2:0]ackf1ag;〃連讀時(shí)的數(shù)據(jù)標(biāo)志

3

reg[2:0]pageent;//連讀連寫時(shí)的數(shù)據(jù)計(jì)數(shù)器

144

14reg[7:0]pagedata_r:〃連讀儲(chǔ)存器

5

146always@(posedgec1kornegedgerst_n)begin

147if(!rst_n)begin

148pagedata_r<=8'dO;

149

150end

151elsebegin

152case(pagecnt)

1533'dO:pagedata_r<=WRITE_DATA1;

154

1553'd1:pagedata_r<=WRITE_DATA2;

1563'd2:pagedata」<=1WRITE_DATA3;

1573'd3:pagedata_r<=WRITE_DATA4;

158

default:;

15

9endcase

160end

161end

16狀態(tài)機(jī)

2

?//

163

164a1ways?(posedgeclkornegedgerst_n)begin

16if(!rst_n)begin

5cstate<=IDLE;

166sda_r<=I*b1;

167

168sda_link<=1'bO;

169num<=4'd0;

170ackflag<=3'dO;

17pageent<=3'dO;

1

172read_data<=8'b0000_0000;

173outdata_r<=8>bOO000000;

174end

175else

176

case(cstate)

177

178IDLE:begin

179sda_link<=1'b1;//數(shù)據(jù)線sda為inp

180ut

18

sda_r<=I*b1;

1

182read_data<=8'bO000_0000;

183//ackflag<=3'dO;

184if(!swl_r||!sw2_r|!sw3_r|I!sw4_r)begi

185

//SW1,SW2,SW3,SW4鍵有一個(gè)被按下

18

6db_r<=、DEVICE」RI

187TE;//送器件地址(寫操作)

188cstate<=START1;

189

end

190

19elsecstate<=IDLE;〃沒有任何鍵被按下

1end

192START1:begin

193if('SCL_HIG)begin〃sc1為高電平期間

194

195sda_link<=fb1;〃數(shù)據(jù)線sda為。utput

196sdar<=rbO;//拉低數(shù)據(jù)線sda,產(chǎn)生起始

197位信號(hào)

198cstate<=ADD1;

19ackflag<=1'bO;

9

num<=4'dO;〃num計(jì)數(shù)清零

200

201end

202elsecstate<=START1;〃等待scl高電平中間位置到來

203end

204ADD1:begin

205

20if('SCL_LOW)begin

6if(num==4*d8)begin

207num<=4'dO;/

208/num計(jì)數(shù)清零

20

9sda_r<=1'b1;

210sda」ink<=1'b

2110;〃sda置為高阻態(tài)(input)

212cstate<=ACK1:

213

21end

4elsebegin

215cstate<=ADD1;

216num<=num+1'bl;

217case(num)

218

214'd0:sda_r<=d

9b_r[7];

2204,dl:sda_r<=d

221b_r[6];

22

24'd2:sda_r<=db_r

223[5];

2244'd3:sda_r<=

225db_r[4];

226

224*d4:sda_r<=

7db_r[3];

2284'd5:sda_r<=db—

22r[2];

94,d6:sda_r<=dbr

230

[1];

231

2324’d7:sda_r<=db

233_r[0]:

234default:;

235

endcase

236

237end

23end

8elsecstate<=ADD1;

239end

24

ACKI:begin

0

241if('SCL_NEG)begin

242estate<=ADD2;〃從機(jī)響應(yīng)信號(hào)

243db_r<='BYTE_ADDR;//1地址

244

end

245

24e1secstate<=ACK1;〃等待從機(jī)響應(yīng)

6end

247ADD2:begin

248if('SCL.LOW)begin

249

,

250if(num==4d8)begin

251num<=4'dO;//

252num計(jì)數(shù)清零

25sda_r<=rbl;

3

sda_1ink<=1'b

25

40;//sda置為高阻態(tài)(input)

255cstate<=ACK2;

256

end

257

258e1sebegin

25sda_link<=Tb

91;//sda作為output

260num<=num+1*b1;

261

26case(num)

24'd0:sda_r<=dbr

263[7]:

2644'd1:sdar<=d

265b_r[6];

266

2674'd2:sda_r<=db_r

268[5]:

264'd3:sda_r<=db_r

9[4];

270

4*d4:sda_r<=db_

27

1r[3];

2724'd5:sda_r<=db_r

273[2];

274

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論