<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > LabVIEW FPGA代碼模塊設計(IP核)

LabVIEW FPGA代碼模塊設計(IP核)

作者: 時(shí)間:2017-06-06 來(lái)源:網(wǎng)絡(luò ) 收藏
概覽
對于利用 實(shí)現RIO目標平臺上的定制硬件的工程師與開(kāi)發(fā)人員,他們可以很容易地利用所推薦的組件設計構建適合其應用的、可復用且可擴展的?;谝呀?jīng)驗證的設計進(jìn)行開(kāi)發(fā),將使現有IP在未來(lái)應用中得到更好的復用,也可以使在不同開(kāi)發(fā)人員和內部組織之間進(jìn)行共享和交換的代碼更好服用。

目錄
1.
2.可復用代碼——知識產(chǎn)權
3.I/O與資源的獨立性
4.定時(shí)獨立性
5.框圖獨立性
6.文檔、測試與范例
7.總結

代碼模塊
任一項軟件開(kāi)發(fā)工作均包括函數、子例程、對象和代碼模塊,以及其他較大架構的基礎構建模塊的開(kāi)發(fā)。當設計一個(gè)應用時(shí),各個(gè)函數與操作均被識別和實(shí)現。然后,這些構建模塊被組合與集成以形成更大的應用。通過(guò)長(cháng)期開(kāi)發(fā)不同應用的過(guò)程,一個(gè)開(kāi)發(fā)小組或團隊將創(chuàng )建表示常見(jiàn)操作的代碼模塊庫,并對其進(jìn)行復用以更快速地構建未來(lái)的應用。開(kāi)發(fā)這樣的代碼庫目的是通過(guò)一次構建和測試函數并多次復用它,減少開(kāi)發(fā)的總工作量。模塊化設計,除了促進(jìn)現有代碼的復用外,還提高了代碼的可測試性與可維護性,從而允許開(kāi)發(fā)人員和設計人員關(guān)注于應用相關(guān)的特性和代碼段。

每種編程語(yǔ)言以及某些情況下的編程環(huán)境都有一個(gè)優(yōu)選的代碼模塊設計模型,以便改進(jìn)代碼模塊的實(shí)現與集成。該優(yōu)選設計可以因具體的開(kāi)發(fā)人員而異,但通常一個(gè)開(kāi)發(fā)組會(huì )根據共同的需要和考慮確定一組共享的設計準則。作為一種編程語(yǔ)言,自身?yè)碛幸唤M供世界各地的程序人員開(kāi)發(fā)子VI使用的指導方針,以便子VI可以容易理解、而且運用于不同應用并由不同開(kāi)發(fā)人員維護。 ,作為L(cháng)abVIEW的一個(gè)子集,擁有其自身的一組用于利用特定行為構建代碼模塊(子VI)的指導方針,以便它們可以有效運用于廣泛的基于FPGA的應用。

可復用代碼——知識產(chǎn)權
FPGA平臺上的可復用代碼模塊通常稱(chēng)為IP(知識產(chǎn)權)核——從傳統芯片設計長(cháng)時(shí)間演化來(lái)的名稱(chēng)。在LabVIEW FPGA中,這樣的由常用于LabVIEW編程和LabVIEW工具集的子VI組成。LabVIEW FPGA中的子VI支持我們一次實(shí)現不同的函數與操作,優(yōu)化FPGA上的實(shí)現,然后將其運用至不同的應用。為使這樣的子VI可以與不同的重疊需求和架構方便地協(xié)同使用,我們需要遵循某些基本指導方針,以確保子VI廣泛可用,而不是專(zhuān)為一項特定應用而優(yōu)化。

為進(jìn)一步促進(jìn)和改善LabVIEW FPGA IP的復用,代碼模塊應當除子VI源碼以外還包括一些組件。這些組件包括文檔、測試代碼和使用IP的基本范例。

在LabVIEW FPGA應用中,IP代碼模塊典型地用于一些操作的執行,如通信協(xié)議(如SPI、I2C等)的編碼與解碼、數字信號處理、濾波、控制算法的實(shí)現、傳感器信號(如PWM、積分信號)的編碼/解碼和基準標定等。

開(kāi)發(fā)LabVIEW FPGA IP的最基本指導方針便是,開(kāi)發(fā)不僅獨立于其主應用、而且對其主應用不產(chǎn)生影響或不會(huì )有顯著(zhù)要求的代碼模塊。IP代碼模塊與其主應用間的唯一需求或依賴(lài)性應當是子VI連接面板的接口。該文檔將闡述如何在LabVIEW FPGA IP中創(chuàng )建這樣的調用獨立的IP子VI,并展示一些相關(guān)范例。

I/O與資源的獨立性
為使LabVIEW FPGA IP便于應用于不同的應用,它應當獨立于任何輸入/輸出通道(I/O)或其他硬件資源,如FPGA塊存儲器。根據具體的應用,最終應用可以使用不同的RIO板卡或其他FPGA目標平臺。因此,IP代碼模塊不應根據一個(gè)特定類(lèi)型的I/O資源進(jìn)行編程。將IP模塊集成至最終應用的編程人員或開(kāi)發(fā)人員將選擇使用某個(gè)特定的I/O資源。來(lái)自I/O資源數據與值,應當以參數的方式傳遞給IP模塊,或從IP模塊返回。

例如對于一個(gè)PWM輸出IP模塊,應用開(kāi)發(fā)人員將為PWM輸出信號選用某條數字輸出線(xiàn)。在此例中,該PWM IP模塊應當產(chǎn)生并輸出信號的當前狀態(tài)。開(kāi)發(fā)人員將把在更高層次VI中賦值給I/O資源。該I/O資源未嵌入在IP代碼模塊的框圖中。

本文引用地址:http://dyxdggzs.com/article/201706/349487.htm 圖1:一個(gè)調用PWM輸出IP代碼模塊(子VI)的應用VI的框圖

同樣的指導方針應用于任意輸入信號。例如,假設您在使用一個(gè)由數字濾波器設計工具包創(chuàng )建的模擬濾波器IP子VI,模擬數值應當自該濾波器子VI外部采集,然后傳遞給IP代碼模塊。

圖2:使用一個(gè)模擬濾波器IP子VI(直接FIR)。模擬數值在主VI采集并傳遞給濾波器IP。

獨立于I/O資源的IP代碼模塊的開(kāi)發(fā),使其使用更為方便和靈活,并支持將其多次集成到一項應用,而不必定制該IP代碼模塊的每個(gè)實(shí)例。

塊存儲
除了I/O通道外,其他可能為L(cháng)abVIEW FPGA IP使用的資源便是塊(用戶(hù))存儲器。LabVIEW FPGA支持開(kāi)發(fā)人員利用多個(gè)不同的函數訪(fǎng)問(wèn)FPGA上的塊存儲器,其中包括存儲器讀/寫(xiě)、FIFO、查詢(xún)表及其他函數。這些函數中的大多數均在塊存儲中創(chuàng )建了一個(gè)唯一的地址空間,以避免發(fā)生IP與該應用其他IP間的存儲器沖突。

然而,LabVIEW FPGA 8.0存儲器讀函數和存儲器寫(xiě)函數,對于其在作為當前FPGA功能特性一部分的任一VI中使用的所有實(shí)例,均使用了一個(gè)16 kB共有地址空間,這個(gè)共有地址空間被當前FPGA功能中任一VI的函數實(shí)例所使用。使用這些函數可能會(huì )與該應用其他部分使用的存儲器產(chǎn)生沖突,因此不應當使用這些函數。如果需要在利用LabVIEW FPGA 8.0(或者更早版本)開(kāi)發(fā)的IP代碼模塊中支持隨機存儲訪(fǎng)問(wèn),您應當使用利用LabVIEW存儲器擴展應用程序創(chuàng )建的一個(gè)存儲器模塊。

在LabVIEW FPGA 8.20中,每個(gè)存儲器讀函數和存儲器寫(xiě)函數引用一個(gè)特定的存儲塊(地址空間),典型情況下,它在LabVIEW項目中作為一項資源被創(chuàng )建。由于這些存儲塊在項目中被定義,因此,如果您將一個(gè)IP代碼模塊VI加載至一項新應用,它們不會(huì )自動(dòng)轉遞給新的項目。為此,您可以在VI中定義一個(gè)存儲塊作為VI-Scoped存儲配置,而不是LabVIEW項目。這一VI-Scoped存儲塊可以在IP中創(chuàng )建并使用;對于任一使用該IP的新應用,它將被自動(dòng)創(chuàng )建。

圖3:使用LabVIEW FPGA 8.20 VI scoped指定存儲塊

相似地,使用塊存儲器來(lái)緩存數據的LabVIEW FPGA FIFO函數,是基于一個(gè)在LabVIEW項目中創(chuàng )建的FIFO資源。在LabVIEW FPGA 8.0中,如果您決定使用一個(gè)IP代碼模塊中的FIFO,該IP的用戶(hù)需要在應用項目中手動(dòng)創(chuàng )建相關(guān)的FIFO資源。為免除對IP代碼模塊用戶(hù)的這一額外需求,我們建議對于LabVIEW FPGA 8.0中的任何IP代碼模塊避免使用FIFO。

在LabVIEW 8.20中,您可以選擇創(chuàng )建一個(gè)VI-Scoped FIFO配置以一個(gè)VI專(zhuān)用FIFO存儲塊。這一操作與指定VI-Scoped存儲塊的方式相同。

圖4:使用LabVIEW FPGA 8.20 VI范圍指定FIFO

無(wú)論存儲器如何被IP代碼模塊或應用的其他部分使用,都從FPGA上可用的公共塊存儲器上分配存儲空間,存儲空間的大小取決于目標平臺中所使用的特定FPGA。因此,對于IP代碼模塊的使用者,重要的是知道IP使用了多少存儲器。這一信息應當包含在文檔和上下文感知的幫助文件中。使用IP模塊的開(kāi)發(fā)人員必須明確了解應用中不同部分所使用的塊存儲器的大小,以防止編譯過(guò)程中可能的存儲溢出。

定時(shí)獨立性
為使IP模塊能夠自由運用于LabVIEW FPGA應用中,該代碼模塊不應對主應用的定時(shí)產(chǎn)生明顯影響。例如,在處理來(lái)自一個(gè)積分編碼器的一對數字輸入信號時(shí),解碼位置信息的代碼模塊不應當顯著(zhù)延遲調用它的應用程序。這就意味著(zhù),該IP代碼模塊子VI應當快速、高效地執行其操作。在大多數情況下,這要求子VI中不應存在任何循環(huán)結構。而且,子VI也不應使用任何等待或其他延遲代碼運行的定時(shí)函數。如若定時(shí)或循環(huán)功能需要作為主應用的一部分,那么應當在調用它的VI中實(shí)現這些功能。下面的框圖展示了一個(gè)積分解碼器的實(shí)現。該范例使用局部變量存儲IP代碼模塊一次調用以及下一次調用(其詳細描述見(jiàn)下段)的狀態(tài)信息。

圖5:一個(gè)積分解碼器IP代碼模塊范例

使IP代碼模塊定時(shí)獨立于調用者的指導方針,存在一個(gè)例外:如果該IP代碼模塊目的在于為其調用應用提供定時(shí)功能。此類(lèi)IP代碼模塊的例子便是一個(gè)數據采集掃描時(shí)鐘例程。下面的框圖展示了一個(gè)簡(jiǎn)單的IP代碼模塊,它實(shí)現了一個(gè)具有附加功能特性的掃描時(shí)鐘,附加功能就是驗證調用的應用程序是否能夠滿(mǎn)足指定的定時(shí)。這一增強的掃描時(shí)鐘可以快捷運用于多個(gè)不同的應用中。在此例中,IP代碼模塊的操作與定時(shí)依賴(lài)性應當以文檔的形式詳細描述,以便該IP的用戶(hù)了解其應用的定時(shí)行為將受到怎樣的影響。

圖6:一個(gè)掃描時(shí)鐘IP代碼模塊范例

框圖獨立性
LabVIEW FPGA IP代碼模塊可以運用于使用不同編程模型的廣泛應用中。許多LabVIEW FPGA特性采用while循環(huán)和for循環(huán)編寫(xiě)而成,這些循環(huán)并沒(méi)有對代碼、函數和其中所使用的VI作太多限制。然而,單周期定時(shí)循環(huán)可以運用于一些要求更短周期時(shí)長(cháng)的應用。因此,如果可行的話(huà),IP代碼模塊應當通過(guò)編寫(xiě)使其可以運用于一個(gè)單周期定時(shí)循環(huán)中。這將對IP代碼模塊內的代碼施加一定的限制。然而,這些限制與前述討論定時(shí)獨立性的部分中所介紹的指導方針相似。

避免在您的IP代碼模塊中使用任何循環(huán)。
使用局部變量存儲您的IP代碼模塊的一次調用以及下一次調用的狀態(tài)信息。
避免在您的IP模塊中使用任何定時(shí)函數。
避免在您的IP代碼模塊中使用與單周期定時(shí)循環(huán)不兼容的函數,如商余函數。
一些應用或許使用了一個(gè)IP代碼模塊的多個(gè)拷貝,該代碼模塊應當無(wú)縫支持這樣的操作。如果代碼模塊子VI使用了任何局部變量存儲狀態(tài)信息,那么該子VI應當設置為可重入。這樣將在編譯過(guò)程中創(chuàng )建多個(gè)FPGA之上的子VI的實(shí)例,每個(gè)實(shí)例都擁有其專(zhuān)用存儲空間用于存放狀態(tài)信息。

文檔、測試與范例
在IP代碼模塊開(kāi)發(fā)過(guò)程中,文檔、測試和范例構造也都應當成為開(kāi)發(fā)過(guò)程中有意為之的一部分。其他不熟悉該代碼模塊的開(kāi)發(fā)人員將在其自己的應用中使用該代碼并且需要掌握關(guān)于如何正確使用該IP的信息。

作為實(shí)現的一部分,每個(gè)將為其他開(kāi)發(fā)人員使用的子VI都應當包含有LabVIEW上下文幫助。當幫助窗口打開(kāi)并且鼠標光標懸浮于子VI上方時(shí),該上下文幫助將顯示在LabVIEW中。該文檔應當包含關(guān)于VI操作/功能的一個(gè)基本描述,以及關(guān)于每個(gè)輸入輸出參數的基本描述。還應當注意任何其他關(guān)于子VI的編程限制或約束,如在單周期定時(shí)循環(huán)中的使用或塊存儲的利用率。關(guān)于VI及其參數的更詳細描述應當包含在一個(gè)單獨的用戶(hù)或參考手冊文檔中。

圖7:PWM發(fā)生器IP的上下文幫助范例

一旦完成了IP代碼模塊的基本實(shí)現,測試與范例構造就成了開(kāi)發(fā)過(guò)程中的下一個(gè)邏輯步驟。測試將確保該IP代碼模塊在各種不同的應用中完成預期的操作。IP代碼模塊的測試應當仔細進(jìn)行,覆蓋不同的輸入值和不同的編程場(chǎng)景,而不是僅僅覆蓋最初所考慮的內容。對于每個(gè)IP,應當完成多個(gè)實(shí)例的測試以及在不同編程結構中的使用。

最終的IP代碼模塊應當包括一些基本范例和可能更高級的范例,以闡述該代碼模塊如何在應用中使用。通常,對于圍繞某個(gè)特定的IP的一項應用,這些范例將成為工作的起點(diǎn)。

圖8:展示PWM發(fā)生器IP的使用方法的VI范例

總結
如果創(chuàng )建的IP代碼模塊靈活且易于使用,那么LabVIEW FPGA IP代碼模塊可以在應用開(kāi)發(fā)中提供顯著(zhù)的優(yōu)勢和節約。該文檔所介紹的指導方針將有助于確保IP可以方便地復用并無(wú)須為單個(gè)應用進(jìn)行定制處理。

下面是在開(kāi)發(fā)任何LabVIEW FPGA IP過(guò)程中應當遵循的指導方針的總結列表:

I/O資源不應嵌入在IP代碼模塊的框圖中。
請勿在IP中使用項目引用的存儲器讀寫(xiě)函數或FIFO讀寫(xiě)函數。如可能,使用一個(gè)VI scoped存儲塊或FIFO(LabVIEW 8.20)。
文檔化表述IP中存儲器(存儲器拓展例程存儲塊、FIFO和查詢(xún)表等)的所有使用。在IP的分布中包含任何存儲器拓展例程存儲塊VI。
不要在IP中包含任何循環(huán)結構或等待/循環(huán)定時(shí)器函數,除非這便是該IP的主要目標。
在IP中使用局部變量存儲狀態(tài)信息。
文檔化表述IP的任何非正常的定時(shí)行為。


關(guān)鍵詞: LabVIEW 代碼模塊 FPGA IP核

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>