概述:利用FPGA實(shí)現(xiàn)AD芯片的時(shí)序,進(jìn)一步實(shí)現(xiàn)與AD芯片數(shù)據(jù)的交互,主要熟悉FPGA對(duì)時(shí)序圖的實(shí)現(xiàn),掌握時(shí)序圖轉(zhuǎn)換Verilog硬件描述語(yǔ)言技巧后與其它芯片進(jìn)行數(shù)據(jù)的交互也是類似的。
說(shuō)明:FPGA芯片采用了altera的Cyclon IV E系列的“EP4CE10F17C8”,軟件環(huán)境-Quartus-Ⅱ,采用的AD芯片為—AD-TLC549。
通過(guò)FPGA實(shí)現(xiàn)以下時(shí)序設(shè)計(jì):
1.AD-TLC549簡(jiǎn)介
位數(shù):8位。
最大轉(zhuǎn)換時(shí)間:17us(36個(gè)內(nèi)部時(shí)鐘周期)。
轉(zhuǎn)換速率:每秒40000次。
TOP VIEW:
電路連接圖:
2.AD-TLC549時(shí)序圖解析
From datasheet:
2.1時(shí)序圖說(shuō)明:
(1)當(dāng)CS為高時(shí),轉(zhuǎn)換結(jié)果數(shù)據(jù)串行輸出端DATA OUT處于高阻態(tài),此時(shí)I/O CLOCK也不起作用。
(2)當(dāng)CS為低時(shí),AD前一次轉(zhuǎn)換的數(shù)據(jù)A的最高位A7立即出現(xiàn)在數(shù)據(jù)線DATA OUT上,其余的7位數(shù)據(jù)在I/O CLOCK的下降沿依次由時(shí)鐘同步輸出(方便我們?cè)谏仙夭杉瘮?shù)據(jù),細(xì)品)。
注意:
①當(dāng)CS變?yōu)榈碗娖降絀/O CLOCK的第一個(gè)時(shí)鐘到來(lái)至少需要1.4us。
②I/O CLOCK不能超過(guò)1.1M,Verilog代碼中采用了1M的時(shí)鐘。
(3)讀完8位數(shù)據(jù)后,AD開(kāi)始轉(zhuǎn)換下一幀 數(shù)據(jù)B,以便下次讀取,轉(zhuǎn)換時(shí)片選信號(hào)CS必須置高電平,每次轉(zhuǎn)換的時(shí)間不超過(guò)17us,轉(zhuǎn)換開(kāi)始于CS變低后的I/O CLOCK的第8個(gè)下降沿,沒(méi)有轉(zhuǎn)換完成的標(biāo)志信號(hào);也沒(méi)有啟動(dòng)控制端,只要讀取前一次數(shù)據(jù)后馬上就可以開(kāi)始新的AD轉(zhuǎn)換,轉(zhuǎn)換完后就進(jìn)入保持狀態(tài)。
3.時(shí)序圖轉(zhuǎn)化為Verilog代碼
在時(shí)序圖轉(zhuǎn)化為Verilog代碼過(guò)程中,要注意的是時(shí)間t su {{ ext{t}}_{{ ext{su}}}}tsu=1.4us、t conv {{ ext{t}}_{{ ext{conv}}}}tconv=17us、I/O CLOCK=1MHz,AD轉(zhuǎn)換的時(shí)候I/O CLOCK是沒(méi)有的。
(1)代碼TOP VIEW:
(2)代碼按以下?tīng)顟B(tài)機(jī)編寫(xiě):
狀態(tài)1:CS拉低至CLK第一個(gè)上升沿。
狀態(tài)2:在I/O CLOCK8個(gè)上升沿讀取數(shù)據(jù)。
狀態(tài)3:等待AD轉(zhuǎn)換完成。
狀態(tài)4:AD轉(zhuǎn)換完完成。
(3)依據(jù)時(shí)序圖完成以下代碼:
//系統(tǒng)時(shí)鐘為50M,周期為20ns; AD時(shí)鐘為1M,周期為1us `define Tsu_time 10'd70//70*20=1.4us,Tsu延時(shí)的計(jì)數(shù)終值 `define Cov_time 10'd850//850*20=17us, Cov延時(shí)的計(jì)數(shù)終值 `define CLK_time 10'd50//20*50=1us, 實(shí)現(xiàn)1M AD時(shí)鐘得計(jì)數(shù)終值 `define CLKHALF_time 10'd25//20*25=0.5us,實(shí)現(xiàn)1M AD時(shí)鐘得計(jì)數(shù)中值 module AD_TLC549 ( //輸入 inputCLK_50M,//系統(tǒng)時(shí)鐘 input RST_N,//復(fù)位 input AD_DATA,//8bit AD原始數(shù)據(jù) //輸出 output reg AD_CS,//片選 output reg AD_CLK//AD時(shí)鐘1M ); //狀態(tài)機(jī),四個(gè)狀態(tài);狀態(tài)1:CS拉低至CLK第一個(gè)上升沿,狀態(tài)2:讀取數(shù)據(jù),狀態(tài)3等待轉(zhuǎn)換,狀態(tài)4:轉(zhuǎn)換完成 reg [2:0]SM_NOW/*synthesis preserve*/; //現(xiàn)在的狀態(tài) reg [2:0]SM_NEXT/*synthesis preserve*/;//下一狀態(tài) parameter SM_Tsu= 3'd0, //CS拉低至CLK第一個(gè)上升沿1.4us SM_Data = 3'd1, //讀取AD數(shù)據(jù)8個(gè)AD_CLK SM_Cov= 3'd2, //等待轉(zhuǎn)換17us SM_End= 3'd3; //轉(zhuǎn)換完成 //產(chǎn)生計(jì)數(shù) reg[9:0] Time_cnt;//在狀態(tài)機(jī)的每個(gè)狀態(tài)開(kāi)始都會(huì)被清零,可以運(yùn)用至每個(gè)狀態(tài)的計(jì)數(shù) reg[3:0] CLK_posedge;//AD_CLK 的8個(gè)時(shí)鐘上升沿 //讀取的8bit數(shù)據(jù) reg[7:0]DATA;//數(shù)據(jù)現(xiàn)態(tài) reg[7:0] DATA_N/*synthesis preserve*/;//數(shù)據(jù)的下一個(gè)狀態(tài) //時(shí)鐘 reg AD_CLK_N;//AD_CLK的下一個(gè)狀態(tài) //時(shí)序產(chǎn)生,Tsu計(jì)時(shí)、Cov計(jì)時(shí)、AD_CLK計(jì)時(shí) always@(posedge CLK_50M or negedge RST_N) begin if(!RST_N) Time_cnt <= 10'd0; else if(SM_NOW != SM_NEXT) Time_cnt <= 10'd0; else if(SM_NOW == SM_Tsu)//產(chǎn)生tus延時(shí) begin if(Time_cnt == `Tsu_time) Time_cnt <= 10'd0; else Time_cnt <= Time_cnt + 10'd1; end else if(SM_NOW == SM_Cov)//產(chǎn)生Cov延時(shí) begin if(Time_cnt == `Cov_time) Time_cnt <= 10'd0; else Time_cnt <= Time_cnt + 10'd1; end else if(SM_NOW == SM_Data)//產(chǎn)生CLK begin if(Time_cnt == `CLK_time) Time_cnt <= 10'd0; else Time_cnt <= Time_cnt + 10'd1; end else Time_cnt <= Time_cnt; end //產(chǎn)生AD_CLK always@(posedge CLK_50M or negedge RST_N) begin if(!RST_N) AD_CLK <= 0; else AD_CLK <= AD_CLK_N; end always@(*) begin if(SM_NOW != SM_Data) AD_CLK_N = 0; else if(Time_cnt == `CLKHALF_time)//半周期 begin AD_CLK_N = 1;//CLK_H end else if(Time_cnt == `CLK_time)//滿周期 AD_CLK_N = 0;//CLK_L else AD_CLK_N = AD_CLK; end //記錄AD_CLK的8個(gè)上升沿 always@(posedge CLK_50M or negedge RST_N) begin if(!RST_N) CLK_posedge <= 4'd0; else if(SM_NOW != SM_Data) CLK_posedge <= 4'd0; else if(Time_cnt == `CLKHALF_time) CLK_posedge <= CLK_posedge + 4'd1; else CLK_posedge <= CLK_posedge; end //CS信號(hào)產(chǎn)生 always@(posedge CLK_50M or negedge RST_N) begin if(!RST_N) AD_CS <= 1'b1; else begin if(SM_NOW == SM_Tsu) AD_CS <= 1'b0; else if(SM_NOW == SM_Cov) AD_CS <= 1'b1; else AD_CS <= AD_CS; end end //狀態(tài)機(jī),產(chǎn)生AD時(shí)序 always@(posedge CLK_50M or negedge RST_N) begin if(!RST_N) SM_NOW <= 3'd0; else SM_NOW <= SM_NEXT; end always@(*) begin case(SM_NOW) SM_Tsu://狀態(tài)1:CS拉低至CLK第一個(gè)上升沿。 if(Time_cnt == `Tsu_time) SM_NEXT = SM_Data; else SM_NEXT = SM_Tsu; SM_Data://狀態(tài)2:在I/O CLOCK8個(gè)上升沿讀取數(shù)據(jù)。 if(CLK_posedge == 4'd8 && Time_cnt == `CLK_time) SM_NEXT = SM_Cov; else SM_NEXT = SM_Data; SM_Cov: //狀態(tài)3:等待AD轉(zhuǎn)換完成。 if(Time_cnt == `Cov_time) SM_NEXT = SM_End; else SM_NEXT = SM_Cov; SM_End://狀態(tài)4:AD轉(zhuǎn)換完完成。 SM_NEXT <= SM_Tsu; default:SM_NEXT <= SM_Tsu; endcase end //提取數(shù)據(jù) always@(posedge CLK_50M or negedge RST_N) begin if(!RST_N) DATA <= 8'b0; else DATA <= DATA_N; end always@(*) begin if((SM_NOW == SM_Data)&&(!AD_CLK)&&(AD_CLK_N))//上升沿 DATA_N = {DATA[6:0],AD_DATA}; else DATA_N = DATA; end endmodule
4. 仿真結(jié)果
通過(guò)SignalTapⅡ仿真得到以下波形:
波形解析:
(1)t su {{ ext{t}}_{{ ext{su}}}}tsu:
用計(jì)數(shù)器實(shí)現(xiàn)了1.9us延時(shí),大于了1.4us。
(2)t conv {{ ext{t}}_{{ ext{conv}}}}tconv:
用計(jì)數(shù)器實(shí)現(xiàn)17us延時(shí)
(3)8bit數(shù)據(jù)及其時(shí)鐘:
原文鏈接:
https://openatomworkshop.csdn.net/6746bf193a01316874d9466f.html
-
FPGA
+關(guān)注
關(guān)注
1629文章
21736瀏覽量
603248 -
通信
+關(guān)注
關(guān)注
18文章
6032瀏覽量
135985 -
AD芯片
+關(guān)注
關(guān)注
2文章
25瀏覽量
18397
原文標(biāo)題:FPGA驅(qū)動(dòng)AD芯片_實(shí)現(xiàn)與芯片通信
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論