使用LabVIEW FPGA模塊設(shè)計(jì)IP核
圖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的用戶需要在應(yīng)用項(xiàng)目中手動(dòng)創(chuàng)建相關(guān)的FIFO資源。為免除對(duì)IP代碼模塊用戶的這一額外需求,我們建議對(duì)于LabVIEW FPGA 8.0中的任何IP代碼模塊避免使用FIFO。
在LabVIEW 8.20中,您可以選擇創(chuàng)建一個(gè)VI-Scoped FIFO配置以一個(gè)VI專用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模塊的開發(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ì)描述見下段)的狀態(tài)信息。
圖5:一個(gè)積分解碼器IP代碼模塊范例
使IP代碼模塊定時(shí)獨(dú)立于調(diào)用者的指導(dǎo)方針,存在一個(gè)例外:如果該IP代碼模塊目的在于為其調(diào)用應(yīng)用提供定時(shí)功能。此類IP代碼模塊的例子便是一個(gè)數(shù)據(jù)采集掃描時(shí)鐘例程。下面的框圖展示了一個(gè)簡(jiǎn)單的IP代碼模塊,它實(shí)現(xiàn)了一個(gè)具有附加功能特性的掃描時(shí)鐘,附加功能就是驗(yàn)證調(diào)用的應(yīng)用程序是否能夠滿足指定的定時(shí)。這一增強(qiáng)的掃描時(shí)鐘可以快捷運(yùn)用于多個(gè)不同的應(yīng)用中。在此例中,IP代碼模塊的操作與定時(shí)依賴性應(yīng)當(dāng)以文檔的形式詳細(xì)描述,以便該IP的用戶了解其應(yīng)用的定時(shí)行為將受到怎樣的影響。
圖6:一個(gè)掃描時(shí)鐘IP代碼模塊范例
框圖獨(dú)立性
LabVIEW FPGA IP代碼模塊可以運(yùn)用于使用不同編程模型的廣泛應(yīng)用中。許多LabVIEW FPGA特性采用while循環(huán)和for循環(huán)編寫而成,這些循環(huán)并沒(méi)有對(duì)代碼、函數(shù)和其中所使用的VI作太多限制。然而,單周期定時(shí)循環(huán)可以運(yùn)用于一些要求更短周期時(shí)長(zhǎng)的應(yīng)用。因此,如果可行的話,IP代碼模塊應(yīng)當(dāng)通過(guò)編寫使其可以運(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í)例都擁有其專用存儲(chǔ)空間用于存放狀態(tài)信息。
文檔、測(cè)試與范例
在IP代碼模塊開發(fā)過(guò)程中,文檔、測(cè)試和范例構(gòu)造也都應(yīng)當(dāng)成為開發(fā)過(guò)程中有意為之的一部分。其他不熟悉該代碼模塊的開發(fā)人員將在其自己的應(yīng)用中使用該代碼并且需要掌握關(guān)于如何正確使用該IP的信息。
作為實(shí)現(xiàn)的一部分,每個(gè)將為其他開發(fā)人員使用的子VI都應(yīng)當(dāng)包含有LabVIEW上下文幫助。當(dāng)幫助窗口打開并且鼠標(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ú)的用戶或參考手冊(cè)文檔中。
圖7:PWM發(fā)生器IP的上下文幫助范例
一旦完成了IP代碼模塊的基本實(shí)現(xiàn),測(cè)試與范例構(gòu)造就成了開發(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)。
評(píng)論