?
13.8??樣機(jī)的調(diào)試方法和技巧
不管是復(fù)雜的電子系統(tǒng)還是簡(jiǎn)單的電路,樣機(jī)的調(diào)試都是有一些基本步驟的。對(duì)于本案例的信號(hào)采集設(shè)備同樣如此。
最先進(jìn)行的就是電源系統(tǒng)的調(diào)試,包括是否有短路、斷路,是否有虛焊,各電壓系統(tǒng)是否正常,電源模塊輸出電流是否足夠驅(qū)動(dòng)負(fù)載等。只有電源系統(tǒng)正常工作,才能談得上實(shí)現(xiàn)系統(tǒng)功能。
完成了電源系統(tǒng)的調(diào)試后,PCI信號(hào)采集卡的下一個(gè)工作就是對(duì)PCI954進(jìn)行配置。用戶可以通過編程器或者PLXMon工具在線進(jìn)行燒寫。這個(gè)配置過程保證主機(jī)操作系統(tǒng)能夠識(shí)別出硬件設(shè)備。
主機(jī)能夠正確地識(shí)別硬件設(shè)備后,需要進(jìn)行設(shè)備驅(qū)動(dòng)程序的安裝。
通過上述步驟,主機(jī)已經(jīng)可以正確地識(shí)別設(shè)備,并為用戶提供了可供操作的API接口。接下來要做的調(diào)試工作就是硬件工程師要完成的FPGA邏輯設(shè)計(jì)和軟件工程師要完成的應(yīng)用軟件設(shè)計(jì)。但這兩部分并不能絕對(duì)分開進(jìn)行設(shè)計(jì),因?yàn)椴还苁菍?duì)設(shè)備的I/O操作還是DMA操作都需要進(jìn)行地址空間映射,因此都需要在軟件和硬件上進(jìn)行相應(yīng)的設(shè)計(jì)。
在本系統(tǒng)的FPGA調(diào)試和軟件聯(lián)調(diào)中,我們使用了兩個(gè)簡(jiǎn)單的例子來驗(yàn)證系統(tǒng)是否能夠正常的工作。一個(gè)是直接用FPGA控制的跑馬燈實(shí)例,另一個(gè)是通過應(yīng)用軟件控制的跑馬燈實(shí)例。
13.8.1??沒有PCI控制的跑馬燈
本實(shí)例僅用FPGA內(nèi)部邏輯對(duì)LED進(jìn)行控制,實(shí)現(xiàn)跑馬燈。通過本實(shí)例可以檢驗(yàn)FPGA的兩種配置模式是否正常工作,同時(shí)可以學(xué)習(xí)使用QuartusII軟件開發(fā)和配置FPGA的流程。
如圖13.23是本實(shí)例的系統(tǒng)框圖。
圖13.23??跑馬燈系統(tǒng)框圖
其中計(jì)數(shù)分頻器是通過計(jì)數(shù)器將晶振的40MHz時(shí)鐘進(jìn)行分頻,產(chǎn)生的低頻時(shí)鐘作為L(zhǎng)ED狀態(tài)機(jī)的控制時(shí)鐘。LED狀態(tài)機(jī)使用4個(gè)狀態(tài)分別表示4個(gè)LED的亮滅,狀態(tài)轉(zhuǎn)換通過狀態(tài)機(jī)的時(shí)鐘上升沿觸發(fā),實(shí)現(xiàn)跑馬燈。
下面是這個(gè)實(shí)例FPGA內(nèi)的主要Verilog源代碼。
//--計(jì)數(shù)分頻-------------------------------------
always?@?(posedge?clkin)
?????count?<=?count+1;???????????? //分頻計(jì)數(shù)器
assign?clk?=?count[24];?????????? //狀態(tài)機(jī)時(shí)鐘
//--LED控制--------------------------------
always?@?(posedge?clk)?begin
?????case(state)???????????????????????//跑馬燈狀態(tài)控制量
???????????2'd0: led?<=?4'b0001;??????? //D1亮
???????????2'd1: led?<=?4'b0010;??????? //D2亮
???????????2'd2: led?<=?4'b0100;??????? //D3亮
???????????2'd3: led?<=?4'b1000;??????? //D4亮
?????endcase
?????state?<=?state+1;??????????????//跑馬燈狀態(tài)變化
end
?
13.8.2??基于PCI控制的跑馬燈
本實(shí)例使用應(yīng)用程序通過PCI總線(PCI9054)來對(duì)FPGA內(nèi)部邏輯參數(shù)進(jìn)行配置,實(shí)現(xiàn)對(duì)LED的控制。通過本實(shí)例可以檢驗(yàn)開發(fā)板的驅(qū)動(dòng)以及PCI的實(shí)時(shí)控制,同時(shí)學(xué)習(xí)應(yīng)用程序和PCI9054進(jìn)行通信的方法。
如圖13.24所示為本實(shí)例的系統(tǒng)框圖。
圖13.24??基于PCI控制的跑馬燈系統(tǒng)框圖
?
其中PCI本地控制器實(shí)現(xiàn)與PCI9054的接口通信,獲取LED控制應(yīng)用程序發(fā)出的觸發(fā)信號(hào)。LED控制器包含LED狀態(tài)機(jī)并接受PCI本地控制器的觸發(fā)信號(hào),通過判別LED觸發(fā)的類型決定啟動(dòng)單個(gè)LED控制或LED狀態(tài)機(jī)。
下面是這個(gè)范例FPGA內(nèi)的主要Verilog源代碼。
//--計(jì)數(shù)分頻-------------------------------------
always?@?(posedge?clkin)
?????count?<=?count+1;????????????????????????? //分頻計(jì)數(shù)器
assign?clk?=?count[24];?????????????????????? //狀態(tài)機(jī)時(shí)鐘
//--LED控制--------------------------------
always?@?(posedge?clk)?begin
?????case(LEDByControl)??????????????????????????? //狀態(tài)控制量
??????????8'd1: led?<=?4'b0001;???????????????? //PCI控制D1亮
??????????8'd2: led?<=?4'b0010;???????????????? //PCI控制D2亮
??????????8'd3: led?<=?4'b0100;???????????????? //PCI控制D3亮
??????????8'd4: led?<=?4'b1000;???????????????? //PCI控制D4亮
??????????8'd5: case(state)????? ??????????????? //跑馬燈狀態(tài)控制量
????????????????????????2'b00: led?<=?4'b0001; ? //跑馬燈D1亮
????????????????????????2'b01: led?<=?4'b0010;?? //跑馬燈D2亮
????????????????????????2'b10: led?<=?4'b0100;?? //跑馬燈D3亮
????????????????????????2'b11: led?<=?4'b1000;?? //跑馬燈D4亮
????????????????????????endcase
??????????default:?led?<=?4'b0000;??????????????? //跑馬燈全滅
??????????endcase
?????state?<=?state+1;???????????????????????????? //跑馬燈狀態(tài)變化
end
//--PCI本地控制器-------------------------------
always?@(posedge?clkin)
?????lholda?<=?lhold;??????????????????????????? //PCI本地總線占用請(qǐng)求及應(yīng)答
always?@(posedge?clkin?or?negedge?lrst)?begin
?????if(!lrst)?begin???????????????????????????//PCI9054復(fù)位
??????????readyflag?<=?1'b0;
??????????LEDByControl[7:0]?<=?8'b0;
?????end
?????else?if(!ads?&?lwr?&?blast?&?la[13:0]?==?14'b1)
??????????readyflag?<=?1'b1;?????????????????//開始發(fā)起LED控制字IO配置
?????else?if(ads?&?lwr?&?blast?&?readyflag?==?1'b1?&?la[13:0]?==?14'b1)
??????????readyflag?<=?1'b1;????????????????//捕獲發(fā)起操作
?????else?if(ads?&?lwr?&?!blast?&?readyflag?==?1'b1?&?la[13:0]?==?14'b1)?begin
??????????LEDByControl[7:0]?<=?ld[31:24];//進(jìn)行LED控制字IO配置操作
??????????readyflag?<=?1'b0;
??????????end
?????else begin
??????????LEDByControl[7:0]?<=?LEDByControl[7:0];//保持LED控制字
??????????readyflag?<=?1'b0;
?????end
end
在進(jìn)行FPGA的邏輯設(shè)計(jì)時(shí),采用一種叫做虛擬邏輯分析儀的技術(shù),可以增強(qiáng)我們?cè)\斷系統(tǒng)的能力。Altera?FPGA提供的虛擬邏輯分析儀稱為SignalTap,Xilinx中也有同樣功能的產(chǎn)品稱為ChipScope。
SignalTap?II邏輯分析儀是Altera第二代系統(tǒng)級(jí)調(diào)試工具,能夠獲取、顯示可編程片上系統(tǒng)(SOPC)的實(shí)時(shí)信號(hào),幫助工程師在其系統(tǒng)設(shè)計(jì)中觀察硬件和軟件的交互作用。在可編程邏輯市場(chǎng)上,SignalTap?II邏輯分析儀專用于Quartus?II?軟件,與其他嵌入式邏輯分析儀相比,它支持的通道數(shù)最多,抽樣深度最大,時(shí)鐘速率最高。
如圖13.25所示為控制其中一個(gè)LED時(shí)的PCI本地時(shí)序圖。
圖13.25??控制1個(gè)LED的PCI本地時(shí)序圖
?
如圖13.26所示為控制4個(gè)LED進(jìn)行跑馬燈時(shí)的PCI本地時(shí)序圖。
圖13.26??控制4個(gè)LED跑馬燈的PCI本地時(shí)序圖