對(duì)于利用LabVIEW FPGA實(shí)現(xiàn)RIO目標(biāo)平臺(tái)上的定制硬件的工程師與開(kāi)發(fā)人員,,他們可以很容易地利用所推薦的組件設(shè)計(jì)構(gòu)建適合其應(yīng)用的,、可復(fù)用且可擴(kuò)展的代碼模塊?;谝呀?jīng)驗(yàn)證的設(shè)計(jì)進(jìn)行代碼模塊開(kāi)發(fā),,將使現(xiàn)有IP在未來(lái)應(yīng)用中得到更好的復(fù)用,也可以使在不同開(kāi)發(fā)人員和內(nèi)部組織之間進(jìn)行共享和交換的代碼更好服用,。
代碼模塊
任一項(xiàng)軟件開(kāi)發(fā)工作均包括函數(shù),、子例程、對(duì)象和代碼模塊,,以及其他較大架構(gòu)的基礎(chǔ)構(gòu)建模塊的開(kāi)發(fā),。當(dāng)設(shè)計(jì)一個(gè)應(yīng)用時(shí),各個(gè)函數(shù)與操作均被識(shí)別和實(shí)現(xiàn),。然后,,這些構(gòu)建模塊被組合與集成以形成更大的應(yīng)用。通過(guò)長(zhǎng)期開(kāi)發(fā)不同應(yīng)用的過(guò)程,,一個(gè)開(kāi)發(fā)小組或團(tuán)隊(duì)將創(chuàng)建表示常見(jiàn)操作的代碼模塊庫(kù),,并對(duì)其進(jìn)行復(fù)用以更快速地構(gòu)建未來(lái)的應(yīng)用。開(kāi)發(fā)這樣的代碼庫(kù)目的是通過(guò)一次構(gòu)建和測(cè)試函數(shù)并多次復(fù)用它,,減少開(kāi)發(fā)的總工作量,。模塊化設(shè)計(jì),除了促進(jìn)現(xiàn)有代碼的復(fù)用外,,還提高了代碼的可測(cè)試性與可維護(hù)性,,從而允許開(kāi)發(fā)人員和設(shè)計(jì)人員關(guān)注于應(yīng)用相關(guān)的特性和代碼段。
每種編程語(yǔ)言以及某些情況下的編程環(huán)境都有一個(gè)優(yōu)選的代碼模塊設(shè)計(jì)模型,,以便改進(jìn)代碼模塊的實(shí)現(xiàn)與集成。該優(yōu)選設(shè)計(jì)可以因具體的開(kāi)發(fā)人員而異,,但通常一個(gè)開(kāi)發(fā)組會(huì)根據(jù)共同的需要和考慮確定一組共享的設(shè)計(jì)準(zhǔn)則,。作為一種編程語(yǔ)言,LabVIEW自身?yè)碛幸唤M供世界各地的程序人員開(kāi)發(fā)子VI使用的指導(dǎo)方針,,以便子VI可以容易理解,、而且運(yùn)用于不同應(yīng)用并由不同開(kāi)發(fā)人員維護(hù),。LabVIEW FPGA,作為L(zhǎng)abVIEW的一個(gè)子集,,擁有其自身的一組用于利用FPGA特定行為構(gòu)建代碼模塊(子VI)的指導(dǎo)方針,,以便它們可以有效運(yùn)用于廣泛的基于FPGA的應(yīng)用。
可復(fù)用代碼——知識(shí)產(chǎn)權(quán)
FPGA平臺(tái)上的可復(fù)用代碼模塊通常稱(chēng)為IP(知識(shí)產(chǎn)權(quán))核——從傳統(tǒng)芯片設(shè)計(jì)長(zhǎng)時(shí)間演化來(lái)的名稱(chēng),。在LabVIEW FPGA中,,這樣的IP核由常用于LabVIEW編程和LabVIEW工具集的子VI組成。LabVIEW FPGA中的子VI支持我們一次實(shí)現(xiàn)不同的函數(shù)與操作,,優(yōu)化FPGA上的實(shí)現(xiàn),,然后將其運(yùn)用至不同的應(yīng)用。為使這樣的子VI可以與不同的重疊需求和架構(gòu)方便地協(xié)同使用,,我們需要遵循某些基本指導(dǎo)方針,,以確保子VI廣泛可用,而不是專(zhuān)為一項(xiàng)特定應(yīng)用而優(yōu)化,。
為進(jìn)一步促進(jìn)和改善LabVIEW FPGA IP的復(fù)用,,代碼模塊應(yīng)當(dāng)除子VI源碼以外還包括一些組件。這些組件包括文檔,、測(cè)試代碼和使用IP的基本范例,。
在LabVIEW FPGA應(yīng)用中,IP代碼模塊典型地用于一些操作的執(zhí)行,,如通信協(xié)議(如SPI,、I2C等)的編碼與解碼、數(shù)字信號(hào)處理,、濾波,、控制算法的實(shí)現(xiàn)、傳感器信號(hào)(如PWM,、積分信號(hào))的編碼/解碼和基準(zhǔn)標(biāo)定等,。
開(kāi)發(fā)LabVIEW FPGA IP的最基本指導(dǎo)方針便是,開(kāi)發(fā)不僅獨(dú)立于其主應(yīng)用,、而且對(duì)其主應(yīng)用不產(chǎn)生影響或不會(huì)有顯著要求的代碼模塊,。IP代碼模塊與其主應(yīng)用間的唯一需求或依賴(lài)性應(yīng)當(dāng)是子VI連接面板的接口。該文檔將闡述如何在LabVIEW FPGA IP中創(chuàng)建這樣的調(diào)用獨(dú)立的IP子VI,,并展示一些相關(guān)范例,。
I/O與資源的獨(dú)立性
為使LabVIEW FPGA IP便于應(yīng)用于不同的應(yīng)用,它應(yīng)當(dāng)獨(dú)立于任何輸入/輸出通道(I/O)或其他硬件資源,,如FPGA塊存儲(chǔ)器,。根據(jù)具體的應(yīng)用,最終應(yīng)用可以使用不同的RIO板卡或其他FPGA目標(biāo)平臺(tái),。因此,,IP代碼模塊不應(yīng)根據(jù)一個(gè)特定類(lèi)型的I/O資源進(jìn)行編程,。將IP模塊集成至最終應(yīng)用的編程人員或開(kāi)發(fā)人員將選擇使用某個(gè)特定的I/O資源。來(lái)自I/O資源數(shù)據(jù)與值,,應(yīng)當(dāng)以參數(shù)的方式傳遞給IP模塊,,或從IP模塊返回。
例如對(duì)于一個(gè)PWM輸出IP模塊,,應(yīng)用開(kāi)發(fā)人員將為PWM輸出信號(hào)選用某條數(shù)字輸出線(xiàn),。在此例中,該P(yáng)WM IP模塊應(yīng)當(dāng)產(chǎn)生并輸出信號(hào)的當(dāng)前狀態(tài),。開(kāi)發(fā)人員將把在更高層次VI中賦值給I/O資源,。該I/O資源未嵌入在IP代碼模塊的框圖中。
圖1:一個(gè)調(diào)用PWM輸出IP代碼模塊(子VI)的應(yīng)用VI的框圖
同樣的指導(dǎo)方針應(yīng)用于任意輸入信號(hào),。例如,,假設(shè)您在使用一個(gè)由數(shù)字濾波器設(shè)計(jì)工具包創(chuàng)建的模擬濾波器IP子VI,模擬數(shù)值應(yīng)當(dāng)自該濾波器子VI外部采集,,然后傳遞給IP代碼模塊,。
圖2:使用一個(gè)模擬濾波器IP子VI(直接FIR)。模擬數(shù)值在主VI采集并傳遞給濾波器IP,。
獨(dú)立于I/O資源的IP代碼模塊的開(kāi)發(fā),,使其使用更為方便和靈活,并支持將其多次集成到一項(xiàng)應(yīng)用,,而不必定制該IP代碼模塊的每個(gè)實(shí)例,。
塊存儲(chǔ)
除了I/O通道外,其他可能為L(zhǎng)abVIEW FPGA IP使用的資源便是塊(用戶(hù))存儲(chǔ)器,。LabVIEW FPGA支持開(kāi)發(fā)人員利用多個(gè)不同的函數(shù)訪(fǎng)問(wèn)FPGA上的塊存儲(chǔ)器,,其中包括存儲(chǔ)器讀/寫(xiě)、FIFO,、查詢(xún)表及其他函數(shù),。這些函數(shù)中的大多數(shù)均在塊存儲(chǔ)中創(chuàng)建了一個(gè)唯一的地址空間,以避免發(fā)生IP與該應(yīng)用其他IP間的存儲(chǔ)器沖突,。
然而,,LabVIEW FPGA 8.0存儲(chǔ)器讀函數(shù)和存儲(chǔ)器寫(xiě)函數(shù),對(duì)于其在作為當(dāng)前FPGA功能特性一部分的任一VI中使用的所有實(shí)例,,均使用了一個(gè)16 kB共有地址空間,,這個(gè)共有地址空間被當(dāng)前FPGA功能中任一VI的函數(shù)實(shí)例所使用。使用這些函數(shù)可能會(huì)與該應(yīng)用其他部分使用的存儲(chǔ)器產(chǎn)生沖突,,因此不應(yīng)當(dāng)使用這些函數(shù),。如果需要在利用LabVIEW FPGA 8.0(或者更早版本)開(kāi)發(fā)的IP代碼模塊中支持隨機(jī)存儲(chǔ)訪(fǎng)問(wèn),您應(yīng)當(dāng)使用利用LabVIEW存儲(chǔ)器擴(kuò)展應(yīng)用程序創(chuàng)建的一個(gè)存儲(chǔ)器模塊。
在LabVIEW FPGA 8.20中,,每個(gè)存儲(chǔ)器讀函數(shù)和存儲(chǔ)器寫(xiě)函數(shù)引用一個(gè)特定的存儲(chǔ)塊(地址空間),典型情況下,,它在LabVIEW項(xiàng)目中作為一項(xiàng)資源被創(chuàng)建,。由于這些存儲(chǔ)塊在項(xiàng)目中被定義,因此,,如果您將一個(gè)IP代碼模塊VI加載至一項(xiàng)新應(yīng)用,,它們不會(huì)自動(dòng)轉(zhuǎn)遞給新的項(xiàng)目。為此,,您可以在VI中定義一個(gè)存儲(chǔ)塊作為VI-Scoped存儲(chǔ)配置,,而不是LabVIEW項(xiàng)目。這一VI-Scoped存儲(chǔ)塊可以在IP中創(chuàng)建并使用,;對(duì)于任一使用該IP的
新應(yīng)用,,它將被自動(dòng)創(chuàng)建。
圖3:使用LabVIEW FPGA 8.20 VI scoped指定存儲(chǔ)塊
相似地,,使用塊存儲(chǔ)器來(lái)緩存數(shù)據(jù)的LabVIEW FPGA FIFO函數(shù),,是基于一個(gè)在LabVIEW項(xiàng)目中創(chuàng)建的FIFO資源。在LabVIEW FPGA 8.0中,,如果您決定使用一個(gè)IP代碼模塊中的FIFO,,該IP的用戶(hù)需要在應(yīng)用項(xiàng)目中手動(dòng)創(chuàng)建相關(guān)的FIFO資源。為免除對(duì)IP代碼模塊用戶(hù)的這一額外需求,,我們建議對(duì)于LabVIEW FPGA 8.0中的任何IP代碼模塊避免使用FIFO,。
在LabVIEW 8.20中,您可以選擇創(chuàng)建一個(gè)VI-Scoped FIFO配置以一個(gè)VI專(zhuān)用FIFO存儲(chǔ)塊,。這一操作與指定VI-Scoped存儲(chǔ)塊的方式相同,。
圖4:使用LabVIEW FPGA 8.20 VI范圍指定FIFO
無(wú)論存儲(chǔ)器如何被IP代碼模塊或應(yīng)用的其他部分使用,都從FPGA上可用的公共塊存儲(chǔ)器上分配存儲(chǔ)空間,,存儲(chǔ)空間的大小取決于目標(biāo)平臺(tái)中所使用的特定FPGA,。因此,對(duì)于IP代碼模塊的使用者,,重要的是知道IP使用了多少存儲(chǔ)器,。這一信息應(yīng)當(dāng)包含在文檔和上下文感知的幫助文件中。使用IP模塊的開(kāi)發(fā)人員必須明確了解應(yīng)用中不同部分所使用的塊存儲(chǔ)器的大小,,以防止編譯過(guò)程中可能的存儲(chǔ)溢出,。
定時(shí)獨(dú)立性
為使IP模塊能夠自由運(yùn)用于LabVIEW FPGA應(yīng)用中,該代碼模塊不應(yīng)對(duì)主應(yīng)用的定時(shí)產(chǎn)生明顯影響,。例如,,在處理來(lái)自一個(gè)積分編碼器的一對(duì)數(shù)字輸入信號(hào)時(shí),解碼位置信息的代碼模塊不應(yīng)當(dāng)顯著延遲調(diào)用它的應(yīng)用程序。這就意味著,,該IP代碼模塊子VI應(yīng)當(dāng)快速,、高效地執(zhí)行其操作。在大多數(shù)情況下,,這要求子VI中不應(yīng)存在任何循環(huán)結(jié)構(gòu),。而且,子VI也不應(yīng)使用任何等待或其他延遲代碼運(yùn)行的定時(shí)函數(shù),。如若定時(shí)或循環(huán)功能需要作為主應(yīng)用的一部分,,那么應(yīng)當(dāng)在調(diào)用它的VI中實(shí)現(xiàn)這些功能。下面的框圖展示了一個(gè)積分解碼器的實(shí)現(xiàn),。該范例使用局部變量存儲(chǔ)IP代碼模塊一次調(diào)用以及下一次調(diào)用(其詳細(xì)描述見(jiàn)下段)的狀態(tài)信息,。
圖5:一個(gè)積分解碼器IP代碼模塊范例
使IP代碼模塊定時(shí)獨(dú)立于調(diào)用者的指導(dǎo)方針,存在一個(gè)例外:如果該IP代碼模塊目的在于為其調(diào)用應(yīng)用提供定時(shí)功能,。此類(lèi)IP代碼模塊的例子便是一個(gè)數(shù)據(jù)采集掃描時(shí)鐘例程,。下面的框圖展示了一個(gè)簡(jiǎn)單的IP代碼模塊,它實(shí)現(xiàn)了一個(gè)具有附加功能特性的掃描時(shí)鐘,,附加功能就是驗(yàn)證調(diào)用的應(yīng)用程序是否能夠滿(mǎn)足指定的定時(shí),。這一增強(qiáng)的掃描時(shí)鐘可以快捷運(yùn)用于多個(gè)不同的應(yīng)用中。在此例中,,IP代碼模塊的操作與定時(shí)依賴(lài)性應(yīng)當(dāng)以文檔的形式詳細(xì)描述,,以便該IP的用戶(hù)了解其應(yīng)用的定時(shí)行為將受到怎樣的影響。
圖6:一個(gè)掃描時(shí)鐘IP代碼模塊范例
框圖獨(dú)立性
LabVIEW FPGA IP代碼模塊可以運(yùn)用于使用不同編程模型的廣泛應(yīng)用中,。許多LabVIEW FPGA特性采用while循環(huán)和for循環(huán)編寫(xiě)而成,,這些循環(huán)并沒(méi)有對(duì)代碼、函數(shù)和其中所使用的VI作太多限制,。然而,,單周期定時(shí)循環(huán)可以運(yùn)用于一些要求更短周期時(shí)長(zhǎng)的應(yīng)用。因此,,如果可行的話(huà),,IP代碼模塊應(yīng)當(dāng)通過(guò)編寫(xiě)使其可以運(yùn)用于一個(gè)單周期定時(shí)循環(huán)中。這將對(duì)IP代碼模塊內(nèi)的代碼施加一定的限制,。然而,,這些限制與前述討論定時(shí)獨(dú)立性的部分中所介紹的指導(dǎo)方針相似。
避免在您的IP代碼模塊中使用任何循環(huán),。
使用局部變量存儲(chǔ)您的IP代碼模塊的一次調(diào)用以及下一次調(diào)用的狀態(tài)信息,。
避免在您的IP模塊中使用任何定時(shí)函數(shù)。
避免在您的IP代碼模塊中使用與單周期定時(shí)循環(huán)不兼容的函數(shù),,如商余函數(shù),。
一些應(yīng)用或許使用了一個(gè)IP代碼模塊的多個(gè)拷貝,,該代碼模塊應(yīng)當(dāng)無(wú)縫支持這樣的操作。如果代碼模塊子VI使用了任何局部變量存儲(chǔ)狀態(tài)信息,,那么該子VI應(yīng)當(dāng)設(shè)置為可重入,。這樣將在編譯過(guò)程中創(chuàng)建多個(gè)FPGA之上的子VI的實(shí)例,每個(gè)實(shí)例都擁有其專(zhuān)用存儲(chǔ)空間用于存放狀態(tài)信息,。
文檔,、測(cè)試與范例
在IP代碼模塊開(kāi)發(fā)過(guò)程中,文檔,、測(cè)試和范例構(gòu)造也都應(yīng)當(dāng)成為開(kāi)發(fā)過(guò)程中有意為之的一部分。其他不熟悉該代碼模塊的開(kāi)發(fā)人員將在其自己的應(yīng)用中使用該代碼并且需要掌握關(guān)于如何正確使用該IP的信息,。
作為實(shí)現(xiàn)的一部分,,每個(gè)將為其他開(kāi)發(fā)人員使用的子VI都應(yīng)當(dāng)包含有LabVIEW上下文幫助。當(dāng)幫助窗口打開(kāi)并且鼠標(biāo)光標(biāo)懸浮于子VI上方時(shí),,該上下文幫助將顯示在LabVIEW中,。該文檔應(yīng)當(dāng)包含關(guān)于VI操作/功能的一個(gè)基本描述,以及關(guān)于每個(gè)輸入輸出參數(shù)的基本描述,。還應(yīng)當(dāng)注意任何其他關(guān)于子VI的編程限制或約束,,如在單周期定時(shí)循環(huán)中的使用或塊存儲(chǔ)的利用率。關(guān)于VI及其參數(shù)的更詳細(xì)描述應(yīng)當(dāng)包含在一個(gè)單獨(dú)的用戶(hù)或參考手冊(cè)文檔中,。
圖7:PWM發(fā)生器IP的上下文幫助范例
一旦完成了IP代碼模塊的基本實(shí)現(xiàn),,測(cè)試與范例構(gòu)造就成了開(kāi)發(fā)過(guò)程中的下一個(gè)邏輯步驟。測(cè)試將確保該IP代碼模塊在各種不同的應(yīng)用中完成預(yù)期的操作,。IP代碼模塊的測(cè)試應(yīng)當(dāng)仔細(xì)進(jìn)行,,覆蓋不同的輸入值和不同的編程場(chǎng)景,而不是僅僅覆蓋最初所考慮的內(nèi)容,。對(duì)于每個(gè)IP,,應(yīng)當(dāng)完成多個(gè)實(shí)例的測(cè)試以及在不同編程結(jié)構(gòu)中的使用。
最終的IP代碼模塊應(yīng)當(dāng)包括一些基本范例和可能更高級(jí)的范例,,以闡述該代碼模塊如何在應(yīng)用中使用,。通常,對(duì)于圍繞某個(gè)特定的IP的一項(xiàng)應(yīng)用,,這些范例將成為工作的起點(diǎn),。
圖8:展示PWM發(fā)生器IP的使用方法的VI范例
總結(jié)
如果創(chuàng)建的IP代碼模塊靈活且易于使用,那么LabVIEW FPGA IP代碼模塊可以在應(yīng)用開(kāi)發(fā)中提供顯著的優(yōu)勢(shì)和節(jié)約,。該文檔所介紹的指導(dǎo)方針將有助于確保IP可以方便地復(fù)用并無(wú)須為單個(gè)應(yīng)用進(jìn)行定制處理,。
下面是在開(kāi)發(fā)任何LabVIEW FPGA IP過(guò)程中應(yīng)當(dāng)遵循的指導(dǎo)方針的總結(jié)列表:
I/O資源不應(yīng)嵌入在IP代碼模塊的框圖中。
請(qǐng)勿在IP中使用項(xiàng)目引用的存儲(chǔ)器讀寫(xiě)函數(shù)或FIFO讀寫(xiě)函數(shù),。如可能,,使用一個(gè)VI scoped存儲(chǔ)塊或FIFO(LabVIEW 8.20),。
文檔化表述IP中存儲(chǔ)器(存儲(chǔ)器拓展例程存儲(chǔ)塊、FIFO和查詢(xún)表等)的所有使用,。在IP的分布中包含任何存儲(chǔ)器拓展例程存儲(chǔ)塊VI,。
不要在IP中包含任何循環(huán)結(jié)構(gòu)或等待/循環(huán)定時(shí)器函數(shù),除非這便是該IP的主要目標(biāo),。
在IP中使用局部變量存儲(chǔ)狀態(tài)信息,。
文檔化表述IP的任何非正常的定時(shí)行為。