當前位置:首頁 » 編程軟體 » soc腳本

soc腳本

發布時間: 2022-08-19 15:01:12

❶ 以前做fpga現在做soc,看什麼書有助入門

首先,做IC跟做FPGA用的工具不太一樣,所以先要學學相關工具的使用。
然後學學腳本語言的使用方法,這在IC設計中非常有用。
再學學時序分析和驗證方面的理論
最重要的是找個高手帶一個項目!

❷ 求助考慮SOC時的VASP編譯問題

bash腳本、bash終端: 請先執行ulimit -s unlimited 再執行vasp tcsh/csh腳本、tcsh/csh終端: 請先執行unlimit

❸ Perl腳本在數字IC設計中有哪些應用

Perl腳本可以用於生成有規律的代碼,如SOC地址仲裁模塊verilog代碼、不同規格的CRC校驗verilog代碼、不同規格的FIFO代碼。
在晶元設計過程中,所用到的FIFO數量很多,大於100多個很常見,甚至大於500個都是存在的。而不同規格的FIFO基本都是用最基礎的RAM模塊來搭建實現的,如果依靠人工編寫,錯誤率高而且效率極其低下。因此,使用perl腳本編寫不同規格的FIFO代碼是可靠高效的方式。
快速生成testbench:在進行功能模擬的時候,需要編寫測試案例testbench,可以利用perl腳本快速生成測試案例的大部分代碼,手動添加少量verilog,即可快速完成testbench的編寫,有效減少工作量。
Verilog代碼自動對齊:verilog代碼在人工編寫時全靠手敲空格符會很累,並且效率低下,採用perl腳本一鍵對齊,效率高節省體力。
Mole例化連接:有些mole模塊的輸入輸出信號有上百條,依靠手動添加會很繁瑣,此時利用perl腳本生成例化模塊可以有效提高效率,降低錯誤率。

❹ 如何為SoC設計選擇IP核

SoC設計師常常需要仔細考慮以決定哪種IP核對一個給定的SoC項目最合適。他們必須決定內核的類型(軟核或是硬核)、可交付使用內核和相關產品的質量、IP提供商的可靠性和承諾等。本文將就以上每個環節進行討論,並為如何最好地評估競爭性IP核的特性提供指導。

IP核可以兩種形式提供給客戶:軟核和硬核。兩種方式都可使客戶獲得在功能上經過驗證的設計。軟核也被稱為可綜合內核,需要由客戶進行綜合並在其SoC上實現。而硬核已完全實現(完成了版圖設計),可直接用於製造。(從技術上說,一種設計只有生產後才能實現。但是在此情況下,實現的意思是指安排布局並可直接投入生產)。SoC團隊只需將硬核像一個單片集成電路片那樣置入晶元即可。軟核和硬核具有不同的問題和好處。

將IP核整合到一個晶元上需要很多步驟。這個過程是否能夠很容易地完成,主要取決於提供的交付成果。另外,客戶不僅必須對IP核進行評估,而且還要評估IP提供商。

軟核與硬核的對比

1. 性能

由於軟核沒有實現,因此它天生在功能和實現方面比硬核更加靈活。另一方面,硬核開發者可能要花更多的時間來優化他們的硬核,因為它們要在很多設計中使用。因此,這使人們覺得硬核會提供更高的性能。

事實上,為那些最先進工藝設計的高端、全定製硬核確實能夠提供比軟核更好的性能。通過使用鎖存、動態邏輯、三態信號、定製存儲器等,全定製設計團隊能實現比完全靜態綜合的設計更好的結果。對於需要達到現有工藝和設計技術極限性能的SoC來說,全定製硬核能夠更好地滿足這些要求。

然而,如果性能目標在一個軟核范圍內,那麼硬核的優勢就無關緊要了。SoC設計團隊能夠使用軟核來滿足性能要求,並利用其固有的靈活性優勢。而隨著工藝技術的進步,軟核的最高頻率限制也在提高,使它們成為更多SoC設計師的一種選擇。在較低時鍾頻率下,硬核或許具有矽片面積方面的優勢。但是情況往往並不是這樣。硬核經常簡單地使用ASIC的方法進行固化,使之不能提供速度上的優勢。在其他情況下,全定製內核不能根據每一代工藝進行重新優化,所以削弱了頻率和尺寸上的優勢。

2. 技術獨立和可移植性

軟核的優勢之一是技術獨立的,也就是說,Verilog或VHDL不需要使用一種特定的工藝技術或標準的單元庫。這意味著同一個IP核能夠應用到多種設計中,或現有設計的下一代中。一些軟核提供商採用使其內核技術上非獨立的設計風格,但是這種方式看不到什麼優勢。

圖1:受IP核影響的開發任務。

另一方面,硬核在技術上是非常特定的。事實上,如果代工廠改變其工藝參數或庫,硬核可能就無法正常工作。這就產生了一個風險,因為在工藝參數改變時,IP提供商需要重新對硬核進行驗證。

硬核能夠移植到新的工藝技術,但是重新優化全定製內核的工作既費事又昂貴。對於一些先進的微處理器內核,這可能要花兩年或更長的時間。因此,硬核經常根據新的工藝進行光學調整。雖然這一方法既簡單又快速,但是它減少了由設計團隊針對現有工藝進行全定製優化的許多優勢。

不僅如此,光學調整同時帶來了另一個風險,因為它只能保證新的設計滿足設計規則,而不能保證准確的時序或功能,而且重新全面驗證經過光學調整的IP核是非常困難的。

3. 速度/面積/功率優化

對於要實現的技術來說,硬核通常比可比較的軟核運行速度更快。但是即使對於這單種技術來說,硬核也僅僅是針對一組目標而優化。如果目標是在合理的性能上使晶元面積更小,那麼對於這種應用來說,為高度可調性能而優化的硬核可能就太大了。

軟核是能夠被「應用優化」的。為適合特定的嵌入式SoC設計,時序、面積和功率目標可能需要進行調整。例如:如果SoC使用200MHz的時鍾,那麼設計運行在250MHz的軟IP內核可以改為准確地運行在200MHz上。這在得到更小尺寸和更低功率的同時滿足了設計約束。

這種應用優化也適用於低層IO時序。軟內核的IO約束可以進行調整,以准確配合內核的使用環境。如果硬內核有延遲輸出信號,SoC設計師幾乎無法改善時序。

如果SoC的速度、面積和功率目標與硬核的目標相符,那麼硬核將極具競爭力。但對於大多數設計師來說,軟核在為特定的SoC優化方面更具優勢。

4. 可定製性

軟核相對硬核還具有另外一個優勢:編譯時間定製化。這些是實現之前的設計選項。

高速緩沖存儲器的內存大小就是一種常見的編譯時間用戶定製項目。根據特定嵌入式應用所需的高速緩沖存儲器的大小,軟核處理器能夠精確地被配置。而硬核在這方面就不能被定製。

另一種在許多軟核中應用的定製項目就是指令專用,或選擇性支持某種特殊指令。例如,一些SoC可能需要對外部協處理器的支持。然而,在一些不使用這些特性的系統中,多餘的硬體可從軟核中去掉,以節省面積和功率。

軟核還可以包括實現配置參數。這是一種特殊的編譯時間定製,可幫助軟核更好地配合SoC團隊使用的設計風格。例如,微處理器內核經常通過使用門控時鍾電路來實現,但這種時鍾不能與某些時鍾布線工具很好配合。如果處理器內核可提供一種將所有門控時鍾變為相等的多路復用器(MUX)的編譯時間設置,SoC團隊可使實現更為容易。

5. 易於集成

軟核很可能更容易被集成到SoC設計團隊使用的流程中,除非內部設計小組已經實現了硬核。其原因是SoC設計團隊將在他們認可的IP核周圍添加RTL模塊。這些內核看上去就像另外的SoC模塊,也可像它們一樣地實現。

另一方面,硬核看上去更像一個黑匣子RAM,特別是在它採用全定製技術實現時。這意味著硬核提供商將需要為該內核提供更多的黑匣子模型,使SoC設計師能夠在其周圍設計其模塊。這本身就比使用軟核更困難。例如,全定製硬核也許沒有門級網表。這是因為該設計已經在晶體管級完成,而沒有使用邏輯門。但是設計團隊可能需要通過背注時序運行門級功能模擬,因為缺少門級網表,這將難以進行。

附加提供物

一個有競爭力的軟IP核不只是一個Verilog或VHDL源文件的集合。出於同樣原因,一個好的硬核也不只是一個版圖資料庫。今天的IP核包含一系列可交付使用的提供物,可使SoC設計團隊將IP核整合到他們的設計中。這些附加提供物的目標是使IP核盡可能容易地整合到設計流程的各個環節。

圖1顯示了採用不同IP核的SoC開發活動。這里包括了軟核和硬核都必需的一些可交付使用的提供物。

1. 文檔創建

清晰和簡練的文檔是大多數技術產品的先決條件。然而,需要參考IP核文檔的人差異非常大,這使IP核技術文檔創建面臨非常大的挑戰。

在圖1中,每一個開發活動都有不同的文檔需求。例如,軟體開發者需要了解硬體的可編程特性,但他們可能不關心它是怎樣實現的。因此,一組好的文檔可使軟體開發者更容易發現他們所需的信息,而不致被大量無用的信息困擾。

最後,如果SoC團隊要為能復用部分IP核文檔的SoC創建文檔,IP提供商應該提供可編輯的源文件和引用權。

2. 介面檢查器

SoC團隊必須設計邏輯,以便與不同信號和IP核協議進行介面。為了確定其設計是否正確,IP提供商能夠提供介面檢查器模塊,以驗證所有介面信號和協議的正確運行。它可能與確認不變的靜態信號一樣簡單,也可能像驗證多周期匯流排協議的正確運行一樣復雜。

這些檢查器通過自動驗證給定介面處理類型是否正確運行的工作,大大簡化SoC團隊的工作。在一個非法處理的情況下,檢查器應該報告錯誤,使SoC設計師能夠容易地查明有缺陷的邏輯並排除故障。介面檢查器必須在SoC設計環境中准確工作。它們應該能夠非常容易地整合到功能模擬中,而不是以一種實際硬體的形式出現。

3. 協議製表器

IP提供商能夠提供另一種交付成果使介面驗證變得更加容易,這就是協議製表器。這是一個監測介面處理的模塊,可觀察到各種特殊狀況。協議製表器保存所有可見的處理類型並報告沒被運行的「邊際」(corner case)。IP提供商必須提供一個進行介面完全驗證所需的邊角情況表。

在開發過程中,協議製表器將幫助SoC團隊決定哪些「邊際」情況需要繼續驗證。一旦開發結束,它同時確保通知SoC團隊已經執行了所有必需的「邊際」情況驗證。由於IP提供商對內核介面具有最佳的理解,這個「邊際」情況表將比SoC團隊能夠想像的任何方案更加完善。

4. RAM檢查器

如果一個IP核擁有SoC團隊必須編譯和整合的內部隨機存儲器,在處理過程中有可能引入瑕疵。排除由深度嵌入式RAM導致的故障對於SoC團隊是一件非常困難的事情,因為它經常涉及通過內核模塊跟蹤故障的工作。RAM檢查器能夠大大簡化排除RAM模塊導致的故障的工作。(當SoC團隊不得不通過一個IP核來排除故障時,這是一個非常糟的情況。他們應該能夠信賴它的正確運行。)

5. 快速模擬模型

對於SoC設計師來說,用一個大型IP核的RTL模擬完整的SoC可能非常緩慢。如果IP提供商能夠提供一個周期精確的內核快速功能模型,客戶將從更快速模擬、更快速調試及更少地使用模擬授權中獲益。即使是一個非周期精確的模型,對於大多數SoC設計和調試已經足夠好了。只要最後運行周期精確模型,在開發過程中就可以從快速功能模型中受益。

6. EDA工具支持

另一個內核質量指標是EDA工具的支持情況。由於不同設計團隊可能使用不同的工具,支持多種EDA工具的多種形式的可交付使用成果是目前先進內核經常能提供的。

例如,一個IP核使用Verilog設計而成,但那些使用基於VHDL的EDA工具和方法的客戶仍會要求VHDL。如果一個內核只針對Verilog,那麼SoC團隊在使用該內核時,將不得不忍受一個麻煩且容易發生錯誤的轉換過程。

此外,IP提供商應該提供比需求格式更多的東西。不同的EDA工具可能有標准格式的不同實現方法。在以上的例子中,IP提供商不能僅為Verilog客戶提供Verilog RTL,它必須支持客戶使用特定的Verilog模擬器。否則,該客戶可能要調試與IP提供商所用的略微不同的Verilog模擬器相關的設計問題。

這個概念實際上適用於所有交付成果。對於硬核,這個概念同樣可在實現階段應用。硬核必須以一種被SoC團隊後端工具所支持的形式提供。而且IP提供商必須支持客戶使用的特殊後端工具。

對硬核來說,這個概念在實現階段同樣適用。硬核必須以能被SoC團隊後端工具支持的形式提供,而且IP提供商必須支持使用特定的後端工具。

7. EDA腳本實例

為了幫助快速展開各種設計活動,IP提供商應該提供所支持EDA工具的實例腳本。這是IP提供商幫助SoC團隊有效地使用IP核進行系統設計的另一種方法。該腳本可能如makefiles一樣簡單,可實現匯編功能模擬器。這些腳本也可能如一個全套的、針對功能回歸執行的自動化設計腳本一樣復雜。在任何情況下,實例腳本對於SoC設計師來說總是很有用。

對於軟核來說,實例綜合腳本幾乎是必要的。至少它們應該提供頂層約束、故障路徑和多周期路徑。如果可能,應該同時提供實現若干工業標准綜合方法學的腳本。當然,這些實例腳本越簡單,對於SoC設計師來說就越容易理解、進行修改並集成到他們的流程中。

8. 功能內核驗證

雖然SoC設計師不會修改軟IP核的RTL設計,但是他們確實會改變作為晶元設計常規部分的一些功能。這樣的例子包括掃描鏈接插入、時鍾緩存和RAM BIST集成。SoC設計團隊需要驗證這些改變不會對內核的正確運行產生影響。

驗證新設計在功能上與以前設計沒有改變的一種方法是採用IP提供商提供的測試基準和測試套件,以全面驗證內核是否正確運行。不幸的是,對於許多內核來說,完整的測試套件太大了,以至於不能作為IP核的一部分來提供。因此,大多數IP提供商選用完整驗證套件組的子集,它同樣能夠驗證運行。大多數情況下,對於發現那些由以上設計變化類型引起的錯誤來說,這個子集已經足夠了。

然而,形式驗證工具對於保證正確運行是一個更徹底的方法。這些工具可精確地驗證新設計與老設計的相同之處。支持形式驗證工具可使SoC團隊無需運行門級回歸。

9. 軟體協同開發工具

為新系統開發軟體的標准方式是,首先生產硬體樣片,然後開發運行在上面的軟體。然而,在很多情況下這延長了產品上市時間,因此軟體開發經常與硬體開發平行進行。

軟體開發比硬體開發需要快得多的系統模擬。因此IP提供商必須提供一個非常快的IP核功能模型。這為低層固件的開發提供了足夠的性能。

對於更高的模擬速度,有時會使用硬體邏輯模擬器,它可比純模擬快一個數量級(雖然這仍然比實際硬體慢2至3個數量級)。這些工具非常難用,而且需要特殊的綜合。對於計劃進行硬體和軟體協同開發的SoC設計團隊來說,支持這些技術是對IP核的一個關鍵要求。

❺ labview FPGA模塊中控制DIO板卡輸出IO量控制繼電器吸合,怎麼實現IO量自動輸出功能

第一步:使用Quartus和Qsys工具完成硬體系統的配置。

該步驟實現SOC最小系統的硬體配置,包括硬核處理器配置、HPS和FPGA之間通信介面匯流排的選擇、HPS外設裁剪、HPS時鍾配置和SDRAM配置。該實驗中主要用到HPS硬核,以及PIO外設IP核。Qsys工具為用戶提供硬體系統的可視化設計,能夠自動生成handoff文件,該文件配合bsp-editor工具可以生成preloader。Preloader是HPS的第二階段引導源,主要作用為:初始化SDRAM介面,配置HPS IO口,載入下一引導源並跳轉到它。

實驗步驟

1 新建Quartus工程。

1.1 設置工程存放路徑,工程名以及頂層文件名,如圖1所示。

圖1

1.2 選擇FPGA器件型號,如圖2所示,DE10-Standard板載FPGA型號為5CSXFC6D6F31C6。

圖2

1.3 點擊next直到finish,未提及的頁面均按默認設置即可。

2 在Qsys中配置SOC。

2.1 運行Qsys工具。

在Quartus軟體中,通過菜單欄Tools->Qsys打開Qsys工具。剛打開的Qsys工具頁面如圖3所示。

圖3

2.2 添加HPS並完成配置。

在左側的IP目錄中輸入hps,選中Arria V/Cyclone V Hard Processor System,雙擊添加HPS,在彈出的HPS配置頁面中進行HPS配置。HPS配置頁面如圖4所示。

圖4

1) 在FPGA Interfaces頁面中,General一欄均不勾選,AXI Bridges一欄設為64-bit、64-bit、32-bit,FPGA-to-HPS SDRAM Interface一欄中移除原有介面,Resets一欄中均不勾選。

2)在Peripheral Pins頁面中,設置HPS外設引腳復用及模式選擇。設置如表1所示。設置完成後頁面如圖5所示。(本實驗其實未用到這些外設)

表1 外設引腳復用及模式選擇

外設名稱

引腳復用選擇

模式選擇

EMAC1

HPS I/O Set 0

RGMII

QSPI

HPS I/0 Set 0

1SS

SDIO

HPS I/0 Set 0

4-bit Data

USB1

HPS I/0 Set 0

SDR

UART0

HPS I/0 Set 0

No Flow Control

(註:表中未提及的外設即Unused,無需設置)

圖5 Peripheral Pins頁面設置

  • 在HPS Clocks頁面中,確認下Input Clocks->External Clock Sources 中的時鍾頻率為25MHz,其它無需設置,默認即可。

  • 在SDRAM頁面中,參考圖6-11更改該頁面下所有子頁面中的參數。(本實驗未用到SDRAM,所以不設置也可)

    圖6

    圖7

    圖8

    圖9

    圖10

    圖11

    5) 至此,HPS設置完畢,點擊finish離開HPS設置頁面。

    2.3 添加並設置其它Qsys元件

    本實驗通過HPS控制FPGA部分的IO口,以此來控制連接在FPGA IO引腳LED燈的亮滅。所以整個SOC只需包含HPS和PIO,即Qsys中還需要添加PIO外設。

    添加PIO外設。在IP目錄中輸入PIO,選中PIO雙擊添加外設,設置頁面如圖12所示,本實驗通過PIO控制4個LED,故寬度為4。

    圖12

    2.4 配置Qsys系統元件

  • 修改元件名稱。本實驗把pio_0重命名為led_pio。

  • 導出外設的頂層I/O介面。在Export一欄下相應位置雙擊,導出led_pio的頂層I/O介面,命名為fpga_led_pio,導出hps_0的h2f_reset介面,命名為hps_0_h2f_reset,如圖13所示。

    圖13

  • 連接Qsys外設介面。外設的介面信號之間沒有連接,需要根據系統要求手動進行連接。各個外設之間的信號連接c如表2所示。連接好後如圖14所示。

    表2 元件信號連接關系

    需要連接的

    被連接的

    元件

    信號名

    元件

    信號名

    led_pio

    clk

    clk_0

    clk

    reset

    clk_0

    clk_reset

    s1

    hps_0

    h2f_lw_axi_master

    hps_0

    h2f_lw_axi_clock

    clk_0

    clk

    h2f_lw_axi_master

    led_pio

    s1

    圖14

    4)配置Qsys的地址映射。Qsys中添加的元件及外設都需要分配對應的基地址。這里我們採用自動分配的方式,在Qsys菜單中選擇System->Assign Base Address,完成基地址自動分配。

    5)生成Qsys系統。Save保存Qsys文件,命名為soc_led.qsys。然後點擊菜單Generate->Generate HDL,彈出如圖15設置框,按圖設置好後點擊Generate,Qsys將生成與硬體系統相關的一系列文件。

    圖15

    3 完成Quartus工程編譯

    3.1 在Quartus工程中添加Qsys產生的系統模塊。

    1)Quartus中點擊菜單Assignments->Settings,彈出設置框,選中左側Files一欄,添加Qsys文件soc_led.v和soc_led.qip,添加完成後如圖16所示。

    圖16

    2)新建頂層文件。本實驗採用的頂層文件類型為bdf(Block Diagram/Schematic File)。點擊菜單File->New,選擇Design Files中的Block Diagram/Schematic File後點擊OK,點擊菜單File->Save As將該文件保存到工程目錄下,命名為top.bdf。在該原理圖空白處右鍵Insert->Symbol,選擇Qsys生成的soc_led.bsf,將該模塊插入到頂層原理圖文件中。選中插入的元件,右鍵點擊Generate Pins for Symbol Ports,為元件添加輸入輸出埠,如圖17所示。

    圖17

    3.2 工程分析綜合後分配引腳

    完成以上步驟後,需要分配引腳,包括HPS外設默認引腳分配以及FPGA部分引腳分配,在分配引腳之前,工程必須通過分析綜合,否則引腳分配會出錯。

    圖18

    然後按2)所示Tcl Scripts工具執行上面編寫的腳本,完成FPGA部分LED引腳的分配。

    3.3 工程編譯。

    完成以上所有操作後,可以點擊菜單Processing->Start Compilation對工程進行完全編譯。編譯成功後會生成FPGA編程所需的.sof文件。

    4 完成FPGA編程。

    這里只介紹採用JTAG方式完成FPGA編程方式,注意這種方式下,FPGA編程電路斷電後就丟失。

    點擊菜單Tools->programmer,打開編程工具,選擇連接至計算機的DE10開發板,如圖19所示。Close硬體設置框。編程頁面中Mode選擇JTAG,點擊Auto Detect按鈕,在彈出的器件選擇框中選擇相應的器件型號,DE10-Standard板載FPGA型號應選擇5CSXFC6D6。選中FPGA設備,點擊Change FIle,選中編譯生成的top.sof文件,如圖20所示。然後勾選Program/Configure,如圖21所示。最後點擊Start按鈕開始編程。

    圖19

    圖20

    圖21

    實驗細節注意:

    在分配引腳之前必須先對工程進行分析綜合(Analysis and Synthesis)

    第二步:使用SOCEDS完成HPS軟體開發

    說明:

    該步驟完成HPS軟體部分的開發,SOC EDS提供了全套的軟體開發工具。本實驗只是通過HPS控制FPGA部分的IO口,系統架構簡單,採用裸機開發方法。DS-5為SoC FPGA裸機開發提供了兩套編譯工具:ARM Compiler 和 Altera Baremetal GCC。本實驗採用ARM Compiler。

    實驗步驟

    1 運行軟體開發工具DS-5。

    打開Embedded_Command_Shell.bat,輸入eclipse &命令回車,打開DS-5開發軟體。如圖1所示。 DS-5界面如圖2所示。

    圖1

    圖2

    2 新建C Project

    點擊菜單File->New->C Project,彈出工程配置框如圖3所示,按圖完成設置,注意編譯工具鏈選擇ARM Compiler 5

    圖3

    3 工程編譯選項設置

    3.1 添加HWLIB路徑

    因為本實驗用到了SOC EDS提供的HWLIB中的API訪問硬體,所以要在項目編譯選項中添加HWLIB路徑。HWLIB所在路徑為:<SOC EDS安裝路徑>ipalterahpsaltera_hpshwlibinclude 和 <SOC EDS安裝路徑>ipalterahpsaltera_hpshwlibincludesoc_cv_av

    操作:在DS-5左側的Project Explorer中選中LedWater工程,右鍵點擊Properties。彈出的對話框按圖4設置,完成HWLIB路徑的添加。

    圖4

    3.2為工程編寫分散文件scatter。

    scatter文件為連接器指定映像的內存映射。本實驗中,映像文件的載入區和執行區都在HPS的片內RAM上,而HPS片內RAM的地址映射為0xFFFF0000-0xFFFFFFFF,所以編寫分散文件內容如下,分散文件編寫完成後添加到編譯選項中。

    OCRAM 0xFFFF0000 0x1000

    {

    APP_CODE +0

    {

    *(+RO, +RW, +ZI)

    }

    ARM_LIB_STACKHEAP 0xFFFF8000 EMPTY 0x8000

    {}

    }

    操作:點擊菜單File->New->Other,彈出對話框,按圖5操作。打開新建的scat文件,輸入上面的分散文件內容。在DS-5左側的Project Explorer中選中LedWater工程,右鍵點擊Properties。彈出的對話框按圖6設置,完成scat文件路徑的添加。

    圖5

    圖6

    4 生成硬體設備描述頭文件。

    利用SOC EDS提供的swinfo2header工具,將Qsys硬體系統信息轉換為軟體開發所需的設備描述頭文件。

    操作:在嵌入式命令行shell中cd到soc_led.sopcinfo所在目錄,然後輸入如下命令:sopc-create-header-files soc_led.sopcinfo --single hps_0.h --mole hps_0如圖7所示,同目錄下將會生成名為hps_0.h的頭文件,將其拷貝至軟體工程目錄下。

    圖7

    5 編寫main.c

    為工程新建main.c文件,輸入main.c代碼,代碼如下:

    #include "hwlib.h"

    #include "socalsocal.h"

    #include "socalhps.h"

    #include "hps_0.h"

    void delay(int delay_time)

    {

    int k;

    for(k=0; k<delay_time; k++) ;

    }

    int main()

    {

    int i = 0x1;

    while(1)

    {

    alt_write_word( ALT_LWFPGASLVS_OFST+LED_PIO_BASE, i );

    if( (i&0xf) == 0x8 ) i=0x1;

    else

    i = i<<1;

    delay(100000000);

    }

    return 1;

    }

    6 工程編譯連接

    在DS-5左側的Project Explorer中選中LedWater工程,右鍵點擊Build Project,生成可執行文件ledWater.axf。

    7 生成preloader

    裸機工程中,preloader即u-boot-spl。在shell中輸入bsp-editor啟動工具,如圖8所示。在打開的bsp-editor工具中,點擊菜單File->New HPS BSP,選擇handoff文件目錄,如圖9所示。設置中取消勾選WATCHDOG_ENABLE選項,如圖10所示,因為我們沒有在裸機應用程序中用到看門狗。設置完成後點擊generate,產生我們設置的preloader源代碼,生成的源代碼路徑顯示在Information欄中。Shell中cd到preloadre源代碼目錄下,輸入make -j8 (多線程編譯提高編譯效率),如圖11所示,回車生成preloader二進制文件,需要等待幾分鍾。在<Quartuas工程目錄>softwarespl_bspuboot-socfpgaspl目錄下,可以看到已經生成了u-boot-spl二進制文件。將其拷貝至LedWater工程目錄下。

    圖8

    圖9

    圖10

    圖11

    8 編寫調試腳本

    為LedWater工程新建調試腳本,步驟如圖12所示。打開新建的文件輸入以下內容。

    reset system

    stop

    wait 30s

    set semihosting enabled false

    loadfile "$sdir/u-boot-spl" 0x0

    set semihosting enabled true

    delete

    tbreak spl_boot_device

    run

    wait

    loadfile "$sdir/Debug/ledWater.axf"

    Start

    圖12

    完成以上所有操作後,工程目錄應該如圖13所示。

    圖13

    9 工程調試。

    1) 在進行工程調試前,首先要確保板卡連接至計算機,並先下載硬體sof文件至fpga。然後新建調試配置項,選中LedWater工程,右鍵選擇Debug As->Debug Configurationz,彈出會話框,按圖14和圖15設置。設置完成後點擊Debug開始調試。

    圖14

    圖15

    2)進入調試頁面後,如圖16所示,點擊紅圈中Continue圖標,開始運行main程序,DE10開發板上的4個LED燈依次循環點亮。

  • 編寫fpga部分的外設引腳分配腳本。根據硬體板卡的實際連接關系,編寫引腳分配腳本,本實驗用到DE10-Standard板卡上的4個LED,參考原理圖,編寫腳本如下:

    set_location_assignment PIN_AA24 -to fpga_led_pio_export[0]

    set_location_assignment PIN_AB23 -to fpga_led_pio_export[1]

    set_location_assignment PIN_AC23 -to fpga_led_pio_export[2]

    set_location_assignment PIN_AD24 -to fpga_led_pio_export[3]

    set_location_assignment PIN_AF14 -to clk_clk

  • 菜單點擊Processing->Start->Start Analysis & Synthesis開始分析綜合。

  • 分析綜合完成後,點擊菜單Tools->Tcl Scripts,彈出腳本運行框,如圖18所示。分別運行hps_sdram_p0_parameters.tcl和hps_sdram_p0_pin_assignments.tcl。

❻ 如何調bcm 晶元sdk初始化

SDK初始化前,需要對SDK的架構有所了解,具體如下圖;可以看出SDK的代碼結構是一個層次化分明的架構,這里對各層的作用和詳細工作機制不闡述了,具體可以參見SDK的介紹文檔。

SDK代碼的結構圖

SDK根據上述架構,BCM模式啟動的時候進行的初始化包括以下幾個步驟:

1. 根據操作系統(linux、vxworks或unix等)不同調用sal_core_init()和sal_appl_init()兩個函數的對應版本,分別對Core SAL和Appl SAL兩部分進行初始化;linux系統下的sal_core_init()函數的主要工作時調用了函數sal_dpc_init()創建DPC(Deferred Procere Call)的信號量和線程;sal_appl_init()函數的linux版本則直接返回,沒有做任何工作;這兩個函數雖然意義很大,但是值得我們研究的內容不多。

2. 然後調用sal_thread_create創建一個運行BCM模式的線程,並調用diag_shell()函數完成對BCM模式的數據進行初始化、命令行進行注冊、設備探測和掛載、晶元初始化、客戶命令注冊、重啟動和BCM模式退出等操作,主要通過調用diag_init()函數、sysconf_init()函數、diag_rc_set()函數、sysconf_probe()函數、sysconf_attach()函數、bcm_init()函數、custom_cmd()和sal_reboot()等函數實現,下面詳細介紹下該函數的執行流程;

a. diag_init()調用cmdlist_init()函數、init_symtab()函數、sal_srand()函數、gvar_init()函數和sh_bg_init()函數等來完成命令行注冊、晶元的寄存器和表項軟體數據內存分配、隨機數種子獲取、全局變數初始化和所有設備可執行任務的內存分配(最多10條)和記錄等工作;

b. sysconf_init()函數除了初始化管理介面的調式函數外還調用soc_cm_init()函數來完成SOC的配置的管理介面的初始化;

c. sysconf_probe()函數調用bde_create()函數和sysconf_chip_override()函數完成探測已經掛載的設備並建立對應的配置管理項,包括為每個設備的分配id等工作;

d. 然後對每個unit調用sysconf_attach()函數來對soc_cm_device_init ()初始的管理介面的設備掛載一些中斷處理函數,注冊PCI讀寫函數等,用管理介面的結構體的指針函數成員形式保存,以便可以刪除和添加這些處理函數,並調用soc_cm_device_init()函數通過在裡面再調用soc_attach()函數來對每一個unit建立並初始化晶元的soc_control_t structure信息及對其訪問的互斥體;soc_attach()函數調用soc_feature_init函數、soc_intr_disable()函、soc_cmic_uc_msg_start函數、soc_info_config()函數(這個函數下面會繼續調用)、soc_dcb_unit_init()函數和soc_counter_verify()函數分別進行支持特性賦值、關閉中斷、開啟對設備的CMIC的UC信息、soc信息初始化、CPU收發包緩存DCB初始化和各種counter寄存器軟體記錄特定初始化,並對SOC_CONTROL(unit)和SOC_PERSIST(unit)兩個保存晶元設備信息的結構體一些成員進行賦值;

e. 調用diag_rc_set()函數來設置對每個晶元初始化配置的腳本文件名稱和熱啟動的初始化配置腳本名稱,如果沒有指定全部用默認的配置;然後解析腳本中的配置項,運用腳本進行配置初始化(包括MMU的配置);

f. 然後對每個晶元調用bcm_init()函數開始晶元的初始化工作,其首先調用bcm_attach()函數對BCM_CONTROL(unit)信息的部分成員進行賦值,包括設備類型、設備名稱和unit號等;然後調用_bcm_api_xlate_port_init()函數建立lport和bcm port的映射關系;並調用晶元各功能模塊的初始化函數(trident是bcm_esw_init ()函數)來對各模塊進行初始化;

g. 然後調用custom_cmd()函數載入BCM模式下用戶配置的命令載入進去;

h. 這樣整個SDK就初始化完畢,BCM模式就會提示BCM>等來等待用戶輸入命令;然後進入一個死循環一直調用sh_process()函數解析用戶配置的命令,然後調用對應的SDK介面下發到驅動;

i. 如果用戶輸入退出命令,會調用sh_exit函數來處理,包括可選的是否回收已經分配的資源等任務;

j. 如果用戶輸入重啟的命令則調用sal_reboot()函數linux版本是通過exit(0)實現。

另外,SDK為上層的初始化提供了調用介面system_init()函數對BCM交換晶元進行初始化,這部分是咱們應該重點關注的部分,當然該介面在BCM模式下用init命令也是可以被調用到的。下面詳細講解下:

a. 首先調用soc_reset_init()函數,ESW晶元里這個函數調用soc_do_init()函數來完事情;soc_do_init()函數會根據是否是重啟動設備進行的配置不一樣;

(1) 如果是熱啟動的設備則先調用soc_dma_abort()關閉所有DMA並調用soc_linkscan_config()函數設置CMIC(CPU Management InterfaceController)查詢埠link狀態,如果設置項為空則表示關閉埠link狀態掃描;然後如果是初始化soc有失敗標記的話調用soc_dma_abort()函數、soc_counter_stop()函數、soc_mem_scan_stop函數、soc_i2c_detach()函數和soc_l2x_stop()函數(有些其他晶元還調用soc_cmic_uc_msg_stop函數等)分別禁止所有的中斷、禁止計數行為、禁止內存掃描動作、釋放I2C
驅動內存、結束L2X(應該是用於mac地址學習和老化對CPU進行中斷通知)相關線程和停止等;然後調用soc_info_config()函數來初始化晶元埠的各種信息,包括晶元型號、各種類型埠的點陣圖、晶元稱號、mod數目、埠數目、hg口的位置、堆疊口位置、CPU口隊列數目、用於時間同步埠數目、埠最大支持速率、meter pools、入埠QOS支持的隊列數目等信息,另外對trident晶元支持QOS三級調度,所以還會調用soc_trident_num_cosq_init()對各個埠支持的隊列數做特殊初始化,最後調用soc_esw_dport_init()函數對User
to physical port map的映射及對user port的逆映射;總之soc_reset_init()函數偏重於對晶元信息、埠屬性和QOS隊列屬性等初始化;然後調用soc_feature_init()函數和soc_dcb_unit_init()函數完成晶元特性支持添加和CPU收發包緩存DCB的初始化工作;然後調用soc_dma_attach()函數和soc_dma_init()函數對中斷進行重新初始化,然後對通過PCI設置CMIC_CONFIG使能高級的DMA模式,包括Scatter/gather,
reload, annaligned transfers(這里具體含義不太明白),然後開啟一些中斷;然後是對MAC_CTRL寄存器讀寫配置一些MAC層的收發使能;然後是設置MAC表項、MPLS表項、vlan和egress vlan、 L3表項的一些hash沖突的級別,接著使能MAC地址學習和老化通知、 重新獲取L3轉發表項的長度和表項大小信息即可完成整個熱啟動的過程;

(2) 在不是熱啟動的情況下,會首先調用調用soc_info_config()函數、soc_feature_init()函數和soc_dcb_unit_init()函數來完成信么MMU、晶元特性支持和DCB初始化工作;然後調用soc_endian_config() 函數和soc_pci_burst_enable()函數來完成硬體大小端和支持PCI讀寫突發情形的使能;然後是調用soc_reset()函數來完成對晶元的一些配置,包括埠的phy配置和mac配置(比如寄存器有XLPORT_XMAC_CONTROL),及還會調用相應晶元的soc_reset_bcm56840_a0()函數完成對CPU口和出入方向屬性的一些配置,如CMIC_XGXS1_PLL_CONTROL_*、CMIC_MISC_CONTROL、CMIC_SOFT_RESET_REG、ING_CONFIG_2、EGR_CONFIG_2、ING_Q_BEGIN和EGR_Q_BEGIN等寄存器;然後和熱啟動一樣,通過PCI設置CMIC_CONFIG使能高級的DMA模式,對MAC_CTRL寄存器讀寫配置一些MAC層的收發使能就退出了soc_do_init()函數;

b. 然後調用soc_misc_init()函數對晶元的初始化信息進行核實判斷,最終根據函數指針調用晶元相應的函數,trident調用的則是_soc_trident_misc_init()函數;_soc_trident_misc_init()函數首先_soc_trident_ser_init()函數對IFP、EFP、VFP和UDF等tcam表項的表項大小、起始地址等信息進行軟體獲取並記錄,然後調用_soc_trident_clear_all_memory函數對CPU_COS_MAP_ONLY、FP_GLOBAL_MASK_TCAM、FP_GM_FIELDS、FP_TCAM、FP_UDF_TCAM、L2_USER_ENTRY_ONLY、L3_DEFIP_128_ONLY、L3_DEFIP_ONLY、L3_TUNNEL、MY_STATION_TCAM_ENTRY_ONLY、VFP_TCAM、VLAN_SUBNET_ONLY、EFP_TCAM、FP_GLOBAL_MASK_TCAM_Xm、FP_GLOBAL_MASK_TCAM_Ym、L3_ECMP_XM、L3_ECMP_YM、EGR_IPMC_CFG2、EGR_VLAN_CONTROL_1、_XLPORT_MIB_RESET等表項進行清空;然後_soc_trident_misc_init()函數繼續對CPU_PBM、CPU_PBM_2m、ISBS_PORT_TO_PIPE_MAPPINGm、EGR_ING_PORTm、XLPORT_CONFIGr、XLPORT_MODE_REG、IARB_MAIN_TDMm、EGR_PERQ_XMT_COUNTERS_BASE_ADDR、MISCCONFIG、ING_BYPASS_CTRL、EGR_BYPASS_CTRL、EGR_ENABLE、EPC_LINK_BMAP、ING_CONFIG_64、EGR_CONFIG_1、EGR_VLAN_CONTROL_1、ING_EN_EFILTER_BITMAP、SW2_FP_DST_ACTION_CONTROL、RTAG7_FLOW_BASED_HASH、RTAG7_HASH_ECMP、CMIC_I2C_STAT、CMIC_RATE_ADJUST_I2C、CMIC_RATE_ADJUST_INT_MDIO等寄存器或表項進行初始化賦值操作,並調用_trident_lep_init對埠進行點燈操作,還調用_soc_trident_fcoe_config_init對晶元的FCOE功能進行初始化;

c. 然後調用soc_mmu_init()函數對MMU進行初始化,和soc_misc_init()函數一樣,也是根據不同的晶元掛載不同的函數指針,這里會調用_soc_trident_mmu_init()函數對trident晶元的MMU進行初始化;包括GH、PG、SSP、SP、Port Min、PORT_MAX_SHARED_CELL、Queue Min等的劃分,MMU port到phy port的映,及MCQ_CONFIG、OP_THR_CONFIG、OP_VOQ_PORT_CONFIG、OVQ_DROP_THRESHOLD0、OVQ_DROP_THRESHOLD_RESET_LIMIT、OVQ_FLOWCONTROL_THRESHOLD、OVQ_MCQ_CREDITS、MCQ_FIFO_BASE_REG、PORT_PAUSE_ENABLE0_64、INPUT_PORT_RX_ENABLE0_64、S3_CONFIG、S2_CONFIG、S2_S3_ROUTING等voq和Qos相關功能的MMU相關寄存器初始化;

d. 然後調用soc_l2x_start函數開啟對MAC地址學習和老化的信息通知功能,主要是創建一個線程;

e. 然後調用bcm_init()函數對晶元進一步初始化,實際對trident晶元調用的是bcm_esw_init()函數,該函數再調用_bcm_esw_init()函數,該函數主要的是分別調用bcm_esw_linkscan_enable_set()函數、_bcm_moles_init()函數和bcm_esw_rcpu_init()函數,來實現關閉埠狀態掃描、初始化晶元各個模塊、初始化RCPU機制的主控模塊:然後_bcm_esw_init()函數調用_bcm_esw_switch_init()函數來實現對CPU隊列的初始化和對晶元的一些特殊控制信息,主要是通過調用bcm_esw_switch_rcpu_encap_priority_map_set()函數和bcm_esw_switch_control_set()函數來設置的。其中的_bcm_moles_init()函數調用晶元轉發流程的各個模塊的初始化函數,具體如下圖:

此處內容較多但是非常重要,希望感興趣的同學能查看對應代碼實際學習下相關內容,只提一點,bcm_esw_l2_init函數會調用_bcm_l2_bp_init函數對l2_user_etry表項設置BPDU報文上CPU的規則;

f. 然後對unit的每個埠調用bcm_port_stp_set()函數、bcm_port_autoneg_set()函數和bcm_stat_clear()函數分別設置埠的STP的狀態為轉發、是否自動協商和清楚埠統計;

g. 然後調用bcm_linkscan_enable_set函數來定期查詢埠的link狀態;

h. 部分晶元還會調用bcm_linkscan_register注冊trunk口的link狀態查詢回調函數;

❼ 汽車發動機開環和閉環的區別

動態系統建模被各領域廣泛應用,例如電動汽車,能源系統,航空航天。我們本文提到動態系統主要是被控對象,對被控對象進行建模是因為我們希望了解這個系統(被控對象)的物理特性以及接受一些外部輸入(力,扭矩,電流等等)時會有什麼樣的動態響應,基於此從而可以更好的給出控制輸入得到我們期望的系統的輸出,以及理解系統的退化或最大化提升系統效率。

這些動態系統的行為是由多物理場復雜的交互作用決定的,因此系統行為和系統響應建模通常需要復雜的第一原理支撐,模擬時也需要大量的計算(例如有限元模型)。

這也是本文的出發點,提供數據驅動(主要介紹深度學習和系統辨識)的模型降階(Reced Order Modeling)提速的方法,通過數據得到具有一定保真度的數據模型,在捕捉到系統動態特性的同時也提升模擬速度。

本文中將涉及多個 demo,數據以及腳本文件,若您感興趣進一步獲取這些鏈接,可以在文末填寫反饋問卷,獲取這些鏈接。

動態系統

動態系統包含狀態空間 S, 時間集 T 和一個映射(規則)來描述狀態隨時間的演變規則 R:S×T→S。例如給定一個時刻 t 的狀態 st ,通過這個規則可以計算後面一個或幾個時刻狀態 st+1=R(st),st+2=R(R(st)) 等等。動態系統通常可以用隨時間變化的方程或方程組來描述。尤其對於連續時間系統,可以通過微分方程來表示。

我們先看一個簡單的常微分系統(ODE), [鏈接1]

其中 y(t) 是系統狀態。例如:一個簡單二自由度線性系統,

其中 A 是一個 2x2 的矩陣。初始條件 x0 = [2; 0], 可以通過求解 ODE 方程得到的相應的二維輸出 x(t),包含兩個狀態,時序和動態圖如下:

圖表 1 系統輸出x(t):

x0 = [2; 0];

A = [-0.1 -1; 1 -0.1];

trueModel = @(t,y) A*y; % 定義系統函數,此處就是一個狀態空間方程

numTimeSteps = 2000;

T = 15;

odeOptions = odeset(RelTol=1.e-7);

t = linspace(0, T, numTimeSteps);

[~, xTrain] = ode45(trueModel, t, x0, odeOptions);

後面(在介紹 Neural ODE 部分)我們會嘗試利用這個系統的數據 xTrain 進行深度學習模型的訓練來得到這個系統的數據代理模型(Surrogate Model),這種思路也可以同樣用於復雜系統。

既然數據驅動,有很多機器學習和深度學習演算法可以用,那動態系統建模有什麼特殊性呢,不是都適用嗎?

目前工程中已經用到很多穩態(靜態)模型。例如在發動機排放標定,通過 DoE 試驗時我們會將發動機維持在不同的穩態工況(轉速恆定,扭矩恆定等等),通過試驗數據建模得到用於標定的穩態數據模型[鏈接2]。

穩態工況下,對於方程(1)這樣一個簡單系統,其中 y(t)' 可以看作 0,到達平衡點,於是 y(t) 和 u(t) 關系恆定,不再在時間維度上與歷史狀態 y(t-1),y(t-2) 等等有關,因此穩態模型針對穩態工況是非常準的。

而在瞬態工況下通常 y(t)' 非零,因此方程(1)在求解系統輸出 y(t) 時不僅由當前時刻的輸入 u(t) 決定,還取決於 y(t-1),y(t-2),u(t-1), u(t-2) 等等,這就是動態系統的特殊性,當前輸出不僅依賴於當前的輸入,還依賴於系統過去的行為(歷史輸入和歷史輸出)。我們在下一篇關於系統辨識的文章中會基於示例詳細說明這一點。

不考慮動態系統,單純從系統建模來說,通常有如下的兩個方向:基於第一原理的和基於數據驅動的。

第一原理建模是領域工程師都比較熟悉的,例如可以使用 M 腳本語言,Simulink 或 Simscape 建模語言從物理原理進行系統模型的創建。

那什麼情況下搭建系統會考慮使用或部分使用數據代理模型(Surrogate Model)?


  • 物理系統原理比較復雜或者不夠清晰,無法構建第一原理模型

  • 數據獲取相對簡單

  • 第一原理物理模型過於復雜,求解耗時,在控制開發時有時效要求,需要加速模擬計算

  • 可以看到右半部分主要是基於數據驅動的建模手段,其中針對動態系統的建模主要是系統辨識和神經網路/深度學習。也是本系列兩個方向。

    本文介紹神經網路的幾種用於動態系統建模的模型,下一篇文章會介紹系統辨識的幾種模型。

    前饋神經網路(Feedforward Neural Network)

    前神經網路大家都不陌生,各神經元分層排列。如圖2

    圖2 簡單前饋神經網路示意圖

    每層神經元只接受上層輸出,結果只傳給下一層,沒有反饋。稍微復雜點的如圖3。

    圖3 squeeze net MATLAB 示例

    前饋神經網路是相對於循環神經網路(Recurrent Neural Network)而言,後者具有反饋,後面我們也會介紹。

    那麼問題來了,前饋神經網路因為沒有反饋,如何表達動態系統(Dynamic System)的時間狀態依賴呢?

    通常主要手段使用不同尺度的滑動窗口來構建衍生特徵從而表徵系統在時間上的動態。

    電池 SoC 預測示例

    我們以電池管理系統為例,通過使用深度學習來估計電池的荷電狀態 SoC(State of Charge)。

    本示例主要介紹 SoC 數據驅動的建模方法,在即使不清楚電池電化學模型以及物理非線性特性的情況下,依然可以進行 SoC 估計。我們可以通過實驗室中收集到的實測數據進行一個前饋神經網路代理模型訓練實現 SoC 估計[1]。

    腳本和數據[鏈接3]

    圖表4 數據集預覽和模型的5個輸入1個輸出

    數據准備

    我們利用實測數據通過預處理得到訓練數據集 cdsTrain,我們看其中一條數據記錄:

    preview(cdsTrain)

    ans = 1×2 cell array

    {5×669956 double} {1×669956 double}

    數據包含五個特徵,分別是電壓 V、電流 I、溫度 T、滑動平均電壓 V_avg、滑動平均電流 I _avg,其中後面兩個衍生特徵用於表徵動態信息。

    搭建模型

    接下來我們構建神經網路模型,結構比較簡單,三層全連接網路,一個輸出的 Feedforward Neural Network模型。

    layers =[sequenceInputLayer(numFeatures,"Normalization","zerocenter")

    fullyConnectedLayer(numHiddenUnits)

    tanhLayer % HyperbolicTangent

    fullyConnectedLayer(numHiddenUnits)

    leakyReluLayer(0.3) % 激活函數

    fullyConnectedLayer(numResponses)

    clippedReluLayer(1) % 激活函數

    regressionLayer];

    設置訓練選項並訓練

    options =trainingOptions('adam', ... % Adam optimizer

    'MaxEpochs',Epochs,...

    'ExecutionEnvironment','cpu',...%可以選擇GPU

    'InitialLearnRate',InitialLearnRate, ...

    'LearnRateSchele','piecewise', ...

    'LearnRateDropPeriod',LearnRateDropPeriod,...

    'LearnRateDropFactor',LearnRateDropFactor,...

    'ValidationData', {X,Y}, ...

    'ValidationFrequency',validationFrequency,...

    'MiniBatchSize',miniBatchSize, ...

    'CheckpointPath', NET_Path);

    圖表 5 訓練過程 Loss 變化

    導入測試數據驗證模型在測試集上的准確度

    圖表 6 深度學習模型的預測值與實測值比較

    模擬測試以及代碼生成

    Simulink 中的深度學習推斷模塊[鏈接8]支持將我們訓練好的模型作為 block 參數, 一起作為被控對象集成到整個電池管理系統中。

    圖表 7 電池管理系統和電池的系統模型

    圖中所示的 BMS 的 Simulink 模型可以監控電池狀態,確保運行安全,還有一個電池模型用於模擬電池的動態和負荷。上面訓練的深度學習 SoC 預測器和其他電池平衡邏輯 Block 一樣嵌入在 BMS 中可以閉環模擬,以及後面做代碼生成與硬體在環。

    圖表 8 Simulink 中原生的用於深度學習推斷的 Block 和 BMS 中的閉環測試 SoC 預測效果

    圖表 9 deep learning 模塊的 C 代碼生成

    上面這個示例我們利用衍生特徵(通過時間滑窗構建時域依賴的特徵,也可以通過不同長度的滑窗構建多尺度的時域特徵),將前饋神經網路用於動態系統的建模。

    Temporal convolutional network (TCN)

    TCN 的主要構成是一個擴展因果卷積層。任何一個時刻的計算輸出都是基於多個歷史時刻的輸入。

    它用於構建動態系統的邏輯和前面介紹的衍生特徵是類似的,都是考慮了歷史的多個時間步的輸入,因此也可以用於建模動態系統。

    TCN 從之前的時間步構建依賴,通常需要將多個卷積層疊加在一起。為了獲得更長期的依賴關系,卷積層的膨脹因子呈指數級增加,如下圖所示。

    假設第 k 個卷積層的膨脹因子為2⁽ᵏ⁻¹⁾ ,步長為 1,則該網路的考慮到的依賴的時間窗的大小可計算為 R=(f-1)(2ᵏ-1)+1,其中 f 為過濾器大小,K 為卷積層數。圖中對應的 f=2,K=4, 於是 R=16, 也就是當前時刻輸出可以考慮到前面 16 個時刻步長輸入。

    與循環網路(RNN)相比,TCN 的缺點之一是它在推理期間佔用更大的內存。計算下一個時間步需要整個原始序列。下圖是一個經典的 TCN 模型結構(結合殘差網路):[鏈接4]

    for i = 1:numBlocks

    dilationFactor = 2^(i-1);

    layers = [

    convolution1dLayer(filterSize,numFilters,DilationFactor=dilationFactor,Padding="causal",Name="conv1_"+i)

    layerNormalizationLayer

    spatialDropoutLayer(dropoutFactor)

    convolution1dLayer(filterSize,numFilters,DilationFactor=dilationFactor,Padding="causal")

    layerNormalizationLayer

    reluLayer

    spatialDropoutLayer(dropoutFactor)

    additionLayer(2,Name="add_"+i)];

    % Add and connect layers.

    lgraph =addLayers(lgraph,layers);

    lgraph =connectLayers(lgraph,outputName,"conv1_"+i);

    一般的 TCN 架構(如[1]中所述)由多個殘差塊組成,每個殘差塊包含兩組具有相同擴張因子的擴張因果卷積層,然後是歸一化層、ReLU 激活層和空間 dropout 層。

    網路將每個塊的輸入加到該塊的輸出上(當輸入和輸出之間的通道數量不匹配時,對輸入進行 1 × 1 的卷積),並應用最終的激活函數。

    循環神經網路: LSTM/Gru

    循環網路的結構與前饋神經網路不同,它帶有一個指向自身的環,用來表示它可以傳遞當前時刻處理的信息給下一時刻使用,我們選取 LSTM 來介紹,結構如下,

    LSTM 之所以可以用於動態系統建模,是因為 LSTM 和動態系統有類似的特性:對於時刻 t, LSTM 使用當前網路的狀態 (ht-1,ct-1) 和當前的輸入 xt來計算網路輸出 ht,同時更新當前網路的狀態 (ht,ct),ht 也叫輸出狀態,就是當前時刻 t 的 LSTM 網路的輸出,ct 稱為 cell state,包含學習來的歷史時刻的狀態信息。每個時間步 LSTM 都會對 ct進行更新:添加信息或移除信息,主要通過四個門函數(f,g,i,o)來實現,將前面的計算過程示意性的描述一下:

    其中,上面方程中的 Wf,g,i,o, Rf,g,i,o, bf,g,i,o是這些門函數各自的可學習參數,主要包括針對輸入 xt 的權重,針對上一時刻輸出狀態(同時也是當前時刻的輸入)ht-1 的權重,以及偏置,這些可學習參數本身是無狀態的,被所有時刻共享。訓練的過程就是優化這些學習參數的過程。

    總結一下:當前時刻的輸出 ht不僅依賴於當前的輸入xt,還依賴於當前的狀態 (ht-1,ct-1)。它可以根據訓練選擇性的記住每一時刻的「重要」信息,並且利用這個信息作為狀態,結合當前輸入 xt 進行輸出狀態 ht預測。

    電機溫度預測示例

    接下來我們使用數據結合 LSTM 模型來搭建永磁同步電機(PMSM)的一個代理模型(Surrogate Modeling),用於電機不同位置的溫度預測。

    類似 Demo [鏈接5]

    理解數據集

    數據集來自多片時長不同的數據。從數據中可以看到 PMSM 不同位置溫度與電氣系統和熱系統對應的工況參數的相互影響。

    同時環境溫度的變化也會對電機不同位置溫度以及相應需求扭矩所需的電流電壓有影響。

    我們使用環境溫度、冷卻液溫度、電壓、電流作為輸入,輸出為不同位置 PMSM 的溫度。

    數據預處理與特徵工程

    同樣作為一個動態系統,我們通過對初始數據再進行不同尺度滑窗實現衍生特徵生成,所有特徵結合在一起作為 LSTM 的輸入(盡管 LSTM 本身也具有考慮時間依賴關系的特性)。

    % create derived features using raw voltages and currents derivedinputs =computedrivedfeatures(tt_data); % check the noise in the data tt_data=[tt_data derivedinputs]; Vnames=tt_data.Properties.VariableNames; s1=620;s2=2915;s3=4487;s4=8825; % preprocess exponentially weighted moving average [t_s1,t_s2,t_s3,t_s4]=preprocmovavg(tt_data,s1,s2,s3,s4,Vnames); % preprocess exponentially weighted moving variance [t_v1,t_v2,t_v3,t_v4]=preprocmovvar(tt_data,s1,s2,s3,s4,Vnames); % attach features to the original table predictors=[tt_data,t_s1,t_s2,t_s3,t_s4,t_v1,t_v2,t_v3,t_v4,tt_profileid]; responses=[tt(:,9:12) tt_profileid]; VResponsenames=responses.Properties.VariableNames;

    准備訓練數據和驗證數據

    holdOuts =[657258]; % define profiles that are withheld from training. [xtrain,ytrain]= prepareDataTrain(predictors,responses,holdOuts);

    我們將使用第 58 條記錄作為驗證集,其中包括 4.64 小時的數據。

    validationdata =58; [xvalidation, yvalidation]= prepareDataValidation(predictors,responses,validationdata); numResponses = size(ytrain{1},1); featureDimension = size(xtrain{1},1); numHiddenUnits=125;

    上面的 DAG 網路可以對許多復雜的系統進行建模。通過上面的結構(左右兩支)幫助我們對依賴於時間歷史的物理行為動態行為以及含狀態的行為進行建模。

    查看預測結果

    如圖所示,紅色和藍色分別代表了實測數據和模型預測結果,右側圖像顯示的是他們的殘差,可以看到大部分誤差在 1% 以內,預測效果比較理想。模型在瞬態變化較快和較慢的工況下都能和實測數據保持一致,說明模型也保持了一定的保真度。

    將模型導出 Simulink

    我們將訓練好的模型保存為 .mat 文件,並將其導入 Simulink Deep Neural Network Predict 模塊[鏈接9],這樣我們就有了一個只有 50Kbyte 大小可以預測溫度的代理模型(Surrogate Model)用於模擬。

    Neural Ordinary Differential Equations:神經網路 ODE

    這是 NIPS 2018 年最佳論文[2]提出的一種新的網路層。當然這個要理論上介紹還是比較復雜,我們可以通過應用場景直觀的解釋一些 Neural ODE 如何實現動態系統建模。

    試想我們有一個動態系統,因為系統動力學過於復雜,我們沒有真正的物理模型,但我們可以不斷地通過測量得到系統的初始狀態 y(t0),動態輸 入 u(t0), u(t1),…, 與動態輸出 y(t1),y(t2),…,y(tn)。接下來我們想是否可以實現這樣一個微分方程:

    使得這個微分方程正好代表了我們的系統,也就是說在系統輸入 y(t0) 的初始條件下通過求解(例如使用 ode45)這個微分方程得出的解 yp(t) 和我們實測結果是吻合的。但如何基於已有的數據 y(t0),序列 u(t) 和序列 y(t) 得到 f 呢?如果我們將 f 用一個神經網路 F(θ) 替代,即

    我們現在有數據 u(t), y(t)。我們不斷地利用數據訓練參數θ,使得上述方程的解 yp(t1), yp(t2),...,yp(tn) 與實測 y(t)是吻合的,那就可以得到這個動態系統的微分方程模型了,從而可以用於後續系統模擬與預測。如何理解 yp(t) 與實測 y(t) 的接近度,也就是損失函數? 我們簡單介紹一下訓練時 Loss 函數計算。對於方程,我們在知道系統初始狀態 y(t0),可以通過很多數值積分求解器(例如常用的 ode45)得到任何時刻的推斷輸出 yp(t) (當然前提是系統的輸入 u(t)也是已知).

    θ 是神經網路 F 的靜態參數。對於所有時刻都是不變的。我們就可以方便得到損失函數的值

    其中 L 可以是任何自定義的損失函數。於是我們可以進行參數 θ 的訓練。當然關於梯度計算與反向傳播會有相對復雜的數學推導,論文提出了伴隨方法(Adjoint Method)來實現這一過程,此處不做詳細論述。

    對應於上述過程,MATLAB中提供了dlode45 [鏈接10],用於建模方程右側非線性函數F的同時,計算 ODE 的時序解。

    即 dlode45 接收一個含參神經網路 F(θ)、需要計算輸出結果的時刻序列 [t0, t1,…,tN]、系統的 t0 時刻的初始狀態 yt0、神經網路參數的一組值,就可以計算出時刻 [t1,…,tN] 所對應的輸出狀態。

    使用 Neural ODE 為系統建模示例

    我們通過一個示例介紹如何使用Neural ODE為動態系統建模。[鏈接6]

    我們就借用文章剛開始的簡單二自由度線性系統,x' (t)=Ax(t), 其中A是一個 2x2 的矩陣。我們用這個已知的系統產生一些數據,利用這些數據來訓練一個 Neural ODE 的方程,使得這個基於數據訓練好的系統(Neural ODE 方程)能夠接近已知的這個動態系統。

    生成物理系統的數據 xTrain 作為真值

    x0 = [2; 0];

    A = [-0.1 -1; 1-0.1];

    trueModel = @(t,y)A*y;

    [~, xTrain] =ode45(trueModel, t, x0, odeOptions);

    xTrain 兩個自由度的可視化

    定義和初始化神經網路 F(t,x(t),θ) 的參數 θ

    neuralOdeParameters.fc1= struct;

    sz = [hiddenSizestateSize];

    neuralOdeParameters.fc1.Weights= initializeGlorot(sz, hiddenSize, stateSize);

    neuralOdeParameters.fc1.Bias = initializeZeros([hiddenSize 1]);

    neuralOdeParameters.fc1

    ans = 包含以下欄位的 struct:

    Weights: [20×2 dlarray]

    Bias: [20×1 dlarray]

    同樣

    neuralOdeParameters.fc2

    ans = 包含以下欄位的 struct:

    Weights: [2×20 dlarray]

    Bias: [2×1 dlarray]

    定義神經網路模型 F(t,x(t),θ) 函數

    function y = odeModel(~,y,theta)

    y =tanh(theta.fc1.Weights*y + theta.fc1.Bias);

    y =theta.fc2.Weights*y + theta.fc2.Bias;

    end

    結合定義好的 F(t,x(t),θ) 作為 dlode45 的輸入來構建代理模型函數

    function X =model(tspan,X0,neuralOdeParameters)

    X = dlode45(@odeModel,tspan,X0,neuralOdeParameters,DataFormat="CB");

    end

    定義模型梯度函數

    主要用於訓練過程計算損失以及對應待訓練參數的梯度

    function [gradients,loss] =modelGradients(tspan,dlX0,neuralOdeParameters,targets)

    % Compute predictions.

    dlX = model(tspan,dlX0,neuralOdeParameters);

    % Compute L1 loss.

    loss =l1loss(dlX,targets,NormalizationFactor="all-elements",DataFormat="CBT");

    % Compute gradients.

    gradients =dlgradient(loss,neuralOdeParameters);

    end

    訓練模型

    不斷地迭代訓練,創建 miniBatch,並進行損失函數計算和自動微分,通過調用 adam 求解器進行參數學習

    for iter=1:numIter

    % Create batch

    [dlx0, targets] = createMiniBatch(numTrainingTimesteps,neuralOdeTimesteps, miniBatchSize, xTrain);

    % Evaluatenetwork and compute gradients

    [grads,loss] = dlfeval(@modelGradients,timesteps,dlx0,neuralOdeParameters,targets);

    % Update network

    [neuralOdeParameters,averageGrad,averageSqGrad] =adamupdate(neuralOdeParameters,grads,averageGrad,averageSqGrad,iter,...

    learnRate,gradDecay,sqGradDecay);

    % Plot loss

    currentLoss =double(extractdata(loss));

    測試模型

    選取新的初始條件作為訓練好的模型的輸入,來進行和物理系統輸出的對比

    x0Pred1 =sqrt([2;2]);

    x0Pred2 =[-1;-1.5];

    x0Pred3 = [0;2];

    x0Pred4 = [-2;0];

    可以看到模型對於新的初始條件依然表現優異。因此神經網路 ODE 在構建動態系統上很有潛力,目前在發動機建模上也有一些示例應用。

    NARX(nonlinear autoregressive network with exogenous inputs)反饋神經網路

    在深度學習網路爆發之前,在淺層神經網路的場景中,NARX 反饋神經網路是經常用於動態系統建模的,它具有反饋連接,即輸出 y(t) 依賴於系統之前時刻的輸出 y(t-1),y(t-2) 等等和輸入。

    其中網路 F 主要是通過一個前饋神經網路實現。

    如下圖,其中F即為第一層隱含層前饋網路,其中輸入和輸出可以是多維的。

    跟其他反饋神經網路類似(前面介紹的 LSTM),它的訓練過程與推斷過程有些區別。網路本身的輸出需要被反饋到前饋神經網路的輸入。在訓練時,因為我們能夠拿到整段輸出真實的數據,因此,我們會用當前時刻真實的輸出值作為訓練時模型輸入而不是反饋預測的輸出,換句話說,在訓練時我們會把網路作為開環去訓練。

    這有兩個好處。一是前饋網路的輸入更准確。第二,生成的網路具有純前饋架構,靜態反向傳播變得可用。當我們進行未來多步推斷時,因為這種情況我們只能用推斷的數據進行下一時刻預測,所以這次我們才把網路閉環,用於推斷。

    磁懸浮系統的 NARX 建模示例

    接下來我們使用 narx 神經網路來對動態系統進行建模的示例[鏈接7]。示例系統是一個磁懸浮系統。目標是控制懸浮在電磁鐵上方的磁鐵的位置,在電磁鐵的位置上,磁鐵受到限制,只能在垂直方向上移動,如下圖所示,

    系統的運動方程為:

    其中 y(t) 是磁鐵在電磁鐵上方的距離,i(t) 是經過電磁鐵的電流,M 是磁鐵的質量,g 是重力常數。其中 β 為粘性摩擦系數,由磁體運動材料決定;α 為場強常數,由電磁鐵上導線匝數和磁體強度決定。我們搜集了系統輸入 u(t)-施加在電磁鐵上的電壓和系統輸出 y(t)-永磁體的位置,對應兩個時間序列。

    搭建網路和准備數據

    d1 = [1:2];

    d2 = [1:2];

    narx_net =narxnet(d1,d2,10); % 使用narxnet功能創建NARX開環串聯網路,10個隱藏層神經元

    [p,Pi,Ai,t] =preparets(narx_net,u,{},y); % 用preparets准備數據

    其中 y(t) 是一個反饋信號,既是輸入,也是輸出,訓練時我們既可以拿到當前時刻數據,也可以拿到後面時刻的數據,所以可以用於開環訓練,當推斷時我們會將輸出接到輸入作為閉環進行推斷。

    訓練網路

    narx_net =train(narx_net,p,t,Pi); % 訓練網路得到訓練好的網路

    驗證開環網路推斷效果

    yp =sim(narx_net,p,Pi);

    e =cell2mat(yp)-cell2mat(t);

    可以看到誤差很小。因為我們用的開環訓練,所以推斷結果是用前面時刻的真實輸出數據(而非推斷輸出反饋),所以這里的誤差是 one-step-ahead 推斷誤差。

    測試閉環推斷效果

    如果要看網路真實准確度的表現,需要將開環的輸出作為反饋接到輸入,然後進行多步預測。

    narx_net_closed =closeloop(narx_net);

    現在可以使用閉環執行 900 個時間步的迭代預測。在這個閉環網路中只需要兩個初始輸入和兩個初始輸出作為初始條件。

    y1 = y(1700:2600);

    u1 = u(1700:2600);

    [p1,Pi1,Ai1,t1] = preparets(narx_net_closed,u1,{},y1);

    yp1 =narx_net_closed(p1,Pi1,Ai1);

    從閉環預測的結果看,藍線是磁鐵的實際位置,紅線是 NARX 神經網路預測的位置。即使網路預測的時間步預測了 900 步,預測依然是非常准確的。閉環多步預測准確的前提就是開環下單步推斷誤差要小。

    總結

    本文主要介紹了動態系統的特性和用於動態系統建模的神經網路模型從而可以實現模型降階(Reced Order Modeling),包括前饋神經網路,TCN,循環神經網路,神經網路 ODE, NARX 網路和相應的一些手段,並結合示例與場景進行了說明這些手段的有效性。

    在後續文章我會來介紹系統辨識(System Identification)的一些示例,歡迎繼續關注。

    本文中涉及到的多個 demo,數據以及腳本文件,若您感興趣,可以通過掃描填寫下面這個反饋問卷,或點擊」閱讀原文「進一步獲取這些鏈接。

    獲取文中示例鏈接

    參考文獻

    [1] Vidal, C., Kollmeyer, P., Naguib, M., Malysz, P. et al., 「Robust xEV Battery State-of-Charge Estimator Design Using a Feedforward Deep Neural Network,」 SAE Technical Paper 2020-01-1181, 2020, doi:10.4271/2020-01-1181.

    [2] Ricky T. Q. Chen*, Yulia Rubanova*, Jesse Bettencourt*, David Duvenaud University of Toronto, Vector Institute 「Neural Ordinary Differential Equations」

    編輯:謝雅潔 校對 :向映姣

熱點內容
銀行密碼保護在哪裡 發布:2024-04-27 10:25:23 瀏覽:188
tomcat源碼導入eclipse 發布:2024-04-27 10:25:15 瀏覽:193
android的api 發布:2024-04-27 10:23:39 瀏覽:682
官式訪問 發布:2024-04-27 10:04:00 瀏覽:521
國產高配置有哪些 發布:2024-04-27 09:18:26 瀏覽:947
建行手機app忘記密碼如何修改 發布:2024-04-27 08:58:59 瀏覽:393
蟻群演算法的數學模型 發布:2024-04-27 08:58:39 瀏覽:994
androidactivity生命 發布:2024-04-27 07:33:48 瀏覽:84
win2008伺服器搭建網站 發布:2024-04-27 07:26:51 瀏覽:640
java的vector 發布:2024-04-27 07:05:00 瀏覽:204