Altera SOPC嵌入式系統設計教程
第1章 概述
SOPC(System On Programmable Chip,可編程的片上系統)是Altera公司提出來的一種靈活、高效的SOC解決方案。它將處理器、存儲器、I/O口、LVDS、CDR等系統設計需要的功能模塊集成到一個可編程器件上,構成一個可編程的片上系統。
1.1 SOPC及其技術
現今,可將SOPC視為是基於FPGA解決方案的SOC。與ASIC的SOC解決方案相比,SOPC系統及其開發技術具有更多的特色,也有多種途徑可構成SOPC方案。
1.1.1基於FPGA嵌入IP硬核的SOPC系統
基於FPGA嵌入IP硬核的SOPC系統是指在FPGA中預先植入處理器。目前最常用的嵌入式處理器大多是采用含有ARM32位知識產權處理器核的器件。為了達到通用性,必須為常規的嵌入式處理器集成諸多通用和專用的接口,但這樣無疑會增加芯片的成本和功耗。如果將ARM或其他處理器核以硬核方式植入FPGA中,利用FPGA的可編程邏輯資源,按照系統功能需求來添加接口功能模塊,既能實現目標系統功能,又能降低系統的成本和功耗。 這樣就使得FPGA靈活的硬件設計與處理器的強大軟件功能有機地結合在一起,高效地實現 SOPC系統。
1.1.2基於FPGA嵌入IP軟核的SOPC系統
將IP硬核直接植入FPGA的解決方案存在以下不足:
(1)由於此類硬核多來自第三方公司,FPGA廠商通常無法直接控制其知識產權費用,從而導致FPGA器件價格相對偏高。
(2)由於硬核是預先植入的,設計者無法根據實際需要改變處理器的結構,如總線規模、接口方式、指令形式,更不可能將FPGA邏輯資源構成的硬件模塊以指令的形式嵌入硬件加速模塊(如DSP)。
(3)無法根據實際設計需要在同一 FPGA中集成多個處理器。
(4)無法根據需要裁剪處理器硬件資源以降低FPGA成本。
(5)只能在特定的FGPA中使用硬核嵌入式處理器。
如果利用軟核處理器,就能有效地彌補上述不足。
目前最有代表性的軟核處理器分別是Altera公司的Nios II核,以及Xilinx公司的Mi-croBlaze核。特別是Nios II核,能很好的解決上述五方面問題。
Altera的Nios II核是用戶可隨意配置和構建的32位嵌入式處理器IP核,釆用Avalon 總線結構通信接口;包含由First Silicon Solution(FS2)開發的基於JTAG的片內設備(OCI) 內核(這為開發者提供了強大的調試功能)。在把Nios II植入FPGA前,用戶可以根據設計要求,利用Quartus II和Qsys,對Nios II及其外圍設備進行構建,使該嵌入式系統在硬件結構、功能特點、資源占用等方面全面滿足用戶系統設計的要求。Nios II核在同一FPGA中的植入數量沒有限制,只要FPGA資源足夠即可。
另外,在開發工具的完備性方面,Nios II具有很大的優勢。Altera不僅提供了強大的 HAL系統庫支持,還提供了嵌入式操作系統和TCP/IP協議棧的支持。
就成本而言,由於Nios II是由Altera公司直接提供而非第三方廠商產品,故用戶通常無須支付知識產權費用,Nios II的使用費用僅僅是其占用的FPGA邏輯資源的費用。因此,用戶選用的FPGA越便宜,則Nios II的使用費就越低。
特別值得一提的是,通過Matlab和DSP Builder,用戶可以為Nios II處理器設計各類硬件數字處理器,並以指令的形式加入Nios II的指令集。例如,用戶可以根據設計項目的具體要求,隨心所欲地構建自己的DSP處理器系統,而不必拘泥於其他DSP公司已上市的有限款式的DSP處理器。
1.2 NiosII軟核處理器
1.2.1 Nios II軟核處理器簡介
繼第一代可配置嵌人式軟核處理器Nios之后,2004年6月,Altera公司又推出了性能更好的Nios II嵌入式軟核處理器。它與2000年上市的原產品Nios相比,最大處理性能提髙了3倍,而CPU內核部分的面積最大可縮小1/2。在2013年底,Altera公司又推出了NIOS II嵌入式軟核處理器GEN2版本,並將之前的NIOS II嵌入式軟核處理器更名為NIOS II Classic。GEN2版本與Classic相比,有相似的尺寸和性能,用戶只需要做很小的改動,就能夠把Classic版本上的軟件移植到GEN2版本上來。
Nios II系列32位RISC嵌入式處理器具有超過200 DMIP的性能,在低成本FPGA中實現成本只有35美分。由於處理器是軟核形式,具有很大的靈活性,可以在多種系統設置組合中進行選擇,滿足成本和功能要求。采用Nios II處理器進行設計,可以幫助用戶將產品迅速推向市場,延長產品生命周期,防止出現處理器逐漸過時的情況。
Nios II開發包含有一套通用外設和接口庫,部分IP和接口如表1.2所列。
利用Qsys軟件中的用戶邏輯接口向導,用戶還可以生成自己的定制外設,並將其集成在Nios II處理器系統中。使用Qsys,用戶可以在Altera FPGA中,組合實現現有處理器無法達到的嵌入式處理器配置,得到用戶所需的結果。
Nios II系列嵌入式處理器使用32位的指令集結構(ISA),建立在第一代16位Nios處理器的基礎上,定位於廣泛的嵌入式應用。Nios II Classic處理器系列包括3種內核:快速的(Nios II/f)、經濟的(Nios/e)和標准的(Nios II/s)內核。更新版的Nios II GEN2處理器系列則取消了標准型內核,保留了經濟型和快速型。。每一型號都針對價格和性能進行了優化。使用 Altera 的 Quartus II 軟件、Qsys 工具以及Nios II集成開發環境(IDE),用戶可以輕松地完成基於Nios II處理器的嵌入式系統開發。
表1.3列出了 Nios II系統的3種內核及特性。
表1.4列出了 Nios II處理器的特性。
1.2.2可配置嵌入式軟核處理器的優勢
嵌入式處理器開發人員面對的一個最大挑戰就是如何選擇一個滿足其應用要求的處理器。現在已有數百種嵌入式處理器,每種處理器都具備一組不同的外設、存儲器、接口和性能特性,用戶很難做出一個合理的選擇:要么為了匹配實際應用所需的外設和接口要求而不得不選擇在某些性能上多余的處理器;要么為了保持成本的需求而達不到原先預計的理想方案。
采用Nios II處理器,用戶將不會局限於預先制造的處理器技術,而是根據自己的要求定制處理器,按照需要選擇合適的外設、存儲器和接口。此外,用戶還可以輕松集成自己專有的功能(如DSP,用戶邏輯),創建一款“完美”的處理器,如圖1.1所示,使用戶的設計具有獨特的 競爭優勢。
用戶所需要的處理器,應該能夠滿足當前和今后的設計性能需求。由於今后發展具有不確定性,因此,設計人員必須能夠更改其設計,加人多個CPU,定制指令集及硬件加速器,以達到新的性能目標,而Nios II處理器能滿足以上要求。
采用Nios II處理器,用戶可以根據需要設置功能,在低成本Altera器件中實現。在單個 FPGA中實現處理器、外設、存儲器和I/O接口功能,可以降低用戶的系統總體成本。
無論是外設、存儲器接口、性能特性,還是成本。這些優勢的體現都借助於在Altera的FPGA上創建一個定制的片上系統,或者更精確地說,創建一個可編程單芯片系統。
1.提供合理的性能組合
使用Altera Nios處理器和FPGA,用戶可以創建一個在處理器、外設、存儲器和1/0接口方面的完美方案。選擇如下:
Ø 3種處理器內核——Nias II開發人員可以選擇一種或以下任意3種內核的組合:具備髙性能的快速的內核(Nios II/f),具備低成本的經濟的內核(Nios II/e),性能和尺寸折中的標准的內核(NiosII/s)。
Ø 超過60種Qsys配備的內核——用戶可以創建一組適合自己應用的外設、存儲器和I/O接口。
Ø 無限制的DMA通道組合——直接存儲器存取(DMA)可以連接到任何外設,從而提高系統的性能。
Ø 可配置的硬件及軟件調試特性——軟件開發人員具有多個調試選擇,包括基本的JTAG的運行控制(運行、停止、單步、存儲器等)、硬件斷點、數據觸發、片內和片外跟蹤、嵌入式邏輯分析儀。這些強大的工具可以在開發階段使用,一旦調試通過后就可以去掉。
2.提升系統的性能
在嵌入式開發中,設計人員通常都會選擇一個比實際所需的性能要高的處理器(意味着更髙的成本),從而為設計保留一個性能上的安全余量。Nios II系統的性能是可以根據應用來裁剪的,相比固定的處理器,在較低的時鍾速率下,具備更高的性能。Nios II的特性可以在以下幾個方面來提升系統的性能:
Ø 多CPU內核一Nios II開發者可以選擇最快的內核(Nios II/f)以獲得高性能,還可以通過添加多個處理器來獲得所需的系統性能。
Ø FPGA系列—Nios II處理器可以工作在Altera推出的所有Cyclone系列、MAX10系列、Arria系列和Stratix系列的FPGA上。尤其是在Stratix V器件上,Nios II/f內核超過350 DMIPS的性能,僅占用1800個邏輯單元(LE)。可以說用戶幾乎是免費得到一個200 DMIPS性能的處理器。
Ø 多處理器系統——開發人員可以在FPGA內部實現多個處理器內核。通過將多個 Nios II/f內核集成到單個器件內,可以獲得極高的性能而不用重新設計印刷電路板。Nios II的IDE支持這種多處理器在單一 FPGA上的開發,或多個FPGA共享一條JTAG鏈。
Ø 定制指令—定制指令是一種擴展處理器指令的方法,最多可以定制256個用戶指令 (見圖1.2)。定制指令是處理器處理復雜的算術運算和加速邏輯的最佳途徑。例如,將一個在64K字的緩沖區實現的循環冗余碼校驗(CRC)的邏輯塊作為一個定制的指令,要比用軟件實現快27倍。
Ø 硬件加速—通過將專用的硬件加速器添加到FPGA中作為CPU的協處理器,CPU就可以並發地處理大塊的數據。例如上面提到的CRC例子,通過硬件加速器處理一個64K字的緩沖區,比用軟件快530倍。Qsys設計工具中包含一個向導,用戶可以用此向導來將加速邏輯和DMA通道添加到系統中。
3.降低系統成本
嵌入式設計人員總是堅持不懈地尋找降低系統成本的方法。然而,選擇一款處理器,總是存在性能、特性與成本的沖突,最終結果總是以增加系統成本為代價。利用Nios II處理器可以通過以下途徑來降低成本:
Ø 更大規模的系統集成—將一個或更多的Nios II處理器組合,選擇合適的一組外設、 存儲器、I/O接口,這些方法可降低電路板的成本、復雜程度以及功耗。
Ø 優化FPGA/CPU的選擇—Cyclone系列的FPGA提供可行的、低成本的嵌入式方案。經濟型的內核(Nios II/e)只占用不到35美分的Cyclone器件資源,僅占用600個邏輯單元,給其他片外的器件保留了更多的邏輯資源。Nios II/e內核定位於低成本、需要低處理性能的系統。占用很少的邏輯資源還使得在單個的FPGA芯片上嵌入多個處理器成為可能。
Ø 更好的庫存管理—嵌入式系統通常包含了來自多個生產商的多種處理器,以應付多變的系統任務。當一種器件多余而另一種短缺的時候,管理這些處理器的庫存便是個問題。但是使用標准化的Nios II軟核處理器,庫存的管理將會大大簡化,因為通過將處理器實現在標准的FPGA器件上,減少了處理器種類的需求。
4.延長產品的生命周期
開發人員希望快速將產品推向市場並保持一個較長的產品生命周期,避免更新換代。基於Nios II的系統在以下幾個方面可以幫助用戶實現此目標:
Ø 縮短產品的上市時間—FPGA可編程的特性使其具有最快的產品上市速度。許多的設計通過簡單的修改都可以被快速地實現到FPGA設計上。Nios II系統的靈活性和快速上市的特性源於Altera提供完整的開發套件、眾多的參考設計、強大的硬件開發工具(Qsys)和軟件開發工具(Nios II IDE)。用戶可以借助Nios II開發套件所帶的設計,在幾個小時內就完成自己的設計原型。由於將Nios II處理器放置於FPGA內部就可以驗證外部的存儲器和I/O組件,電路板設計速度顯著加快。
Ø 建立有競爭性的優勢—維持一個基於通用硬件平台的產品的競爭優勢是非常困難的。而包含一個或多個Nios II處理器,具備硬件加速、定制指令、定制的可裁剪的外設等的SOPC系統,具備了競爭的優勢。
Ø 延長了產品的生存時間—使用Nios II處理器的SOPC產品帶來的一個獨特優勢就是能夠對硬件進行升級。即使產品已經交付給客戶,仍可以定期升級。這些特性可以解決很多問題:
l 延長產品的生存時間,隨着時間的增加,可以不斷將新的特性添加到硬件中。
l 減小由於標准的制定和改變而帶來的硬件上的風險。
l 簡化了硬件缺陷的修復和排除。
l 避免處理器的過時。嵌入式處理器供應商通常提供一個很寬的配置選擇范圍以適應不同的客戶群。不可避免的是,某個或多個處理器有可能會因為生產計划等原因而停止供應或很難尋找。Nios II設計人員擁有在Altera FPGA上使用和配置基於 Nios II設計的永久許可。一個基於Nios II的設計可以容易地被重新移植到新系列的FPGA器件中,從而保護了對應用軟件的投資。
Ø 在產品產量增加的情況下降低成本—旦一個FPGA的設計被選定,並且打算進行大批量的生產,可以選擇將它移植到Altera的HardCopy(—種結構化的ASIC系列) 中,從而降低了成本並提升性能。Altera還可以提供Nios II處理器的ASIC制造許可,用戶可以將包含Nios II處理器、外設、Avalon交換式總線的設計移植到基於單元的ASIC中。
第2章 SOPC開發流程簡介
2.1 SOPC開發流程
SOPC設計包括以Nios II軟核處理器為核心的嵌入式系統的硬件配置、硬件設計、硬件仿真、IDE環境的軟件設計、軟件調試等。SOPC系統設計的基本軟件工具包括Quartus II,用於完成Nios II系統的分析綜合、硬件優化、適配、配置文件編程下載以及硬件系統測試等;Qsys,它是Nios II軟核處理器的開發包,用於實現Nios II系統配置、生成以及與 Nios II系統相關的監控和軟件調試平台的生成;ModelSim,用於對Qsys生成的 NiosII的HDL描述語言程序進行系統功能仿真;Matlab/DSP Builder,用於生成Nios II系統的硬件加速器,進而為Nios II系統定制新的指令;Nios II IDE,用於完成基於Nios II系統的軟件開發和調試,並可借助其自帶的Flash編程器完成對Flash以及EPCS的編程操作,此外Nios II IDE還包括一個指令集成模擬器、Microc/OS - II實時操作系統、文件系統以及小型 TCP/IP 協議棧。
SOPC的開發過程中要使用到Quartus II、Qsys以及Nios II IDE,三者之間關系如圖2. 1所示。
SOPC的開發流程通常包括2個方面:基於Quartus II、Qsys的硬件設計,基於 Nios II IDE的軟件設計。對於比較簡單的Nios II系統,一個人便可執行所有設計;對於比較復雜的系統,硬件和軟件設計可以分開進行。
2.1.1硬件開發
硬件開發使用Quartus II和Qsys。硬件設計工作如下:
(1)用Qsys軟件從Nios II處理器內核和Nios II開發套件提供的外設列表中選取合適的CPU、存儲器以及各外圍器件(如片內存儲器、PIO、定時器、UART、片外存儲器接口等),並定制和配置它們的功能;分配外設地址及中斷號;設定復位地址;最后生成系統。用戶也可以添加用戶自身定制指令邏輯到Nios II內核以加速CPU性能,或添加用戶外設以減輕CPU的任務。
(2)使用Qsys生成Nios II系統后,將其集成到整個Quartus II工程中。可以在 Quartus II工程中加入Nios II系統以外的邏輯,大多數的SOPC設計都包括NioslI系統以外的邏輯,這也是SOPC系統的優勢所在。用戶可以集成自身定制的硬件模塊到SOPC設計,或集成從Altera或第3方IP供應商中得到的其它現成知識產權設計模塊。
(3)使用Quartus II軟件來選取具體的Altera FPGA器件型號;然后為Nios II系統上的各I/O口分配引腳,另外還要根據要求進行硬件編譯選項或時序約束的設置;最后編譯Quartus II工程,在編譯過程中Quartus II將對Qsys生成系統的HDL設計文件進行布局布線,從HDL源文件綜合生成一個適合目標器件的網表,生成FPGA配置文件(.sof)。
(4)使用Quartus II編程器和Altera下載電纜(如USB Blaster),將配置文件(用戶定制的Nios II處理器系統的硬件設計)下載到目標板上。當校驗完當前硬件設計后,可將新的配置文件下載到目標板上的非易失存儲器里(如EPCS器件)。下載完硬件配置文件后,軟件開發者就可以將此目標板作為軟件開發的初期硬件平台進行軟件功能的開發驗證了。
2.1.2軟件開發
軟件開發使用Nios II IDE。它是一個基於Eclipse IDE構架的集成開發環境,包括:
Ø GNU開發工具(標准GCC編譯器、連接器、匯編器和makefile工具等);
Ø 基於GDB的調試器,包括軟件仿真和硬件調試;
Ø 提供用戶一個硬件抽象層HAL(Hardware Abstraction Layer);
Ø 提供嵌入式操作系統MicroC/OS-II和LwTCP/IP協議棧的支持;
Ø 提供幫助用戶快速入門的軟件模板;
Ø 提供 Flash 下載支持(Flash Programmer 和 Quartus II Programmer)
熟悉Linux下GNU開發工具的開發者基本上可以毫無困難地使用Nios II IDE。
使用Nios II IDE,可完成Nios II處理器系統的所有軟件開發任務。使用Qsys 生成系統后,可以直接使用Nios II IDE開始設計C/C+ +應用程序代碼。Altera提供外設驅動程序和硬件抽象層(HAL),使用戶能夠快速編寫與低級硬件細節無關的Nios II程序。除了應用代碼,用戶還可以在Nios II IDE工程中設計和使用定制庫。
如果沒有軟件開發的目標板,可以通過Nios II指令集仿真器(ISS)運行和調試代碼;ISS 可仿真處理器、存儲器和stdin/stdout/stderr流,使用戶可以檢驗程序流和算法正確性。一旦有一個目標板,用戶就可以使用下載電纜(如USB Blaster)下載軟件到目標板進行調試/ 運行。
2.1.3 SOPC基本幵發流程簡介
在開始進行SOPC設計前,讓我們先了解一下SOPC系統的基本開發流程。圖2.2所示為基於Nios II系統的SOPC開發流程。
參照圖2.2說明SOPC基本的開發流程如下:
1) 在進行SOPC開發之前,首先必須確定系統的需求,如應用系統需要的計算性能、帶寬和吞吐量、接口類型以及是否需要多線程的軟件等。完整的基於Nios II的SOPC系統是一個軟硬件復合的系統。在開發時,可分為硬件和軟件兩個部分,但在實際設計過程中,有時候所需要的功能既可以用軟件也可以用硬件來實現。具體采用什么方式,要根據系統設計要求來權衡。一般來說,用軟件實現時,在設計上容易修改或者增刪,査錯也比較容易,又幾乎不增加占用的邏輯資源,但執行速度較慢。所以,在設計規划時,在滿足性能的前提下,優先考慮軟件實現。
2) 每個開發過程開始時都應建立一個工程,Quartus II是以工程的方式對設計過程進行管理的。在工程中建立頂層模塊文件.bdf,其將整個工程的各個模塊包容在里面,編譯的時候就將這些模塊整合在一起。這個頂層文件相當於傳統電路設計中的電路板(PCB)。
3) 在Qsys中添加需要的功能模塊(Nios II及其標准外設模塊),完成后生成一個系統模塊。如果需要,用戶可以定制指令和外設邏輯。由Qsys最終生成的系統模塊相當於傳統的單片機或ARM。
4) 如果需要,可以使用Altera公司提供的LPM功能模塊。Quartus II包含了大量常用功能模塊(如計數器、累加器、比較器、譯碼器等),使用這些模塊能大大加快開發的速度。一般來說,一個設計只有很少部分的模塊需要自己從零設計。LPM功能模塊相當於傳統設計中除處理器以外的邏輯芯片(如74系列)。
5) 如果需要,建立自己的功能模塊。當設計中現有的模塊功能不能滿足設計要求時,要求用戶自己設計。可以用硬件描述語言,也可以用原理圖的輸入方法來設計自己的功能模塊。設計自己的功能模塊時,可以作為一個獨立的工程來設計,並生成模塊符號(Symbol),然后將源文件(實現該模塊的原理圖或HDL文件)拷貝到頂層模塊所在的工程目錄下,這樣在頂層模塊中就可以使用這個自定義模塊的符號。使用自定義功能模塊,相當於在傳統設計中,市面上買不到某種芯片而去定做芯片。
6) 在頂層模塊中,分別將Qsys生成的系統模塊、LPM功能模塊以及用戶自定義功能模塊添加到頂層模塊中,然后將各個功能模塊用連線連起來組成系統功能原理圖。這個過程類似傳統電路設計中,將所有要使用到的芯片焊接到電路板上,然后通過PCB上的連線將各個芯片連接起來,組成電路系統。
7) 為系統功能原理圖選擇芯片載體並為各個輸入/輸出信號分配芯片的引腳。
8) 設置編譯選項,從而讓編譯器按照用戶設定來進行編譯。
9) 編譯系統,生成硬件系統的配置文件.sof和.pof。編譯系統是一個非常復雜的過程,包括優化邏輯的組合、綜合邏輯、適配FPGA、布線以及時序分析等步驟。
10) 打開Nios II IDE軟件進行用戶程序開發。當然這1步也可以在Qsys生成系統模塊后立即進行。這個過程與傳統嵌入式系統的軟件開發類似, 唯一的不同在於,軟件所運行的嵌入式系統是自己定制的、裁剪過的,因此可能受硬件的局限會小一些。
11) 對用戶軟件進行編譯,生成可執行文件.elf。
12) 可以在IDE的指令集仿真器(ISS)上仿真軟件和運行/調試軟件。
13) 將配置文件.sof下載到FPGA,將可執行文件.elf下載到RAM(外部或內部)。
14) 在目標板上調試軟件,直到硬件和軟件設計都達到設計要求。
15) 利用IDE的編程工具將配置文件燒寫到FPGA的配置芯片或Flash。將可執行文件 .elf 編程到 Flash。
2.2 簡單SOPC實例開發任務及步驟
【任務】建立一個基於NIOS II處理器系統來控制一個LED燈閃爍。
【步驟】根據2.1.3小節,本節指導讀者完成SOPC實例開發流程,主要步驟有:
(1) 分析系統需求;
(2) 啟動Quartus II軟件和新建實例設計工程;
(3) 啟動新的Qsys系統;
(4) 在Qsys工具中定義並生成系統;
(5) 集成Qsys系統到Quartus II工程;
(6) 分析和綜合系統並分配引腳;
(7) 設置編譯選項並編譯硬件系統;
(8) 下載硬件設計到目標FPGA;
(9) 使用NIOS II Software Build Tools For Eclipse開發用戶程序;
(10) 調試用戶程序;
(11) 運行程序;
2.3 分析系統需求
每一個SOPC系統開發之前,都應該仔細分析系統需求。例如:對所設計系統的運行性能 有什么要求?系統要處理的帶寬有多大?應用要求哪種類型的接口?應用要求多線程的軟件嗎?基於這些問題,用戶可確定具體的系統要求,例如:
使用哪種Nios II處理器內核:比較小的還是比較快的?
Ø 設計要求什么外設及其數量是多少?
Ø 功耗有何要求?
Ø 使用哪種實時操作系統(RTOS)?
Ø 硬件加速邏輯在哪些方面可大大提髙系統性能?例如:增加一個DMA外設能釋放 CPU在進行數據復制時所占用的資源嗎?定制的指令能取代DSP算法嗎?
本章實例的開發任務是:
Ø 展示可用於控制LED閃爍的簡單Nios II處理器系統。
Ø 利用最通用和有效的方法來建立實際的定制Nios II系統。
Ø 整個系統僅使用片內資源,且不依賴於目標板。
Ø 析任務可以知道FPGA內硬件系統組成應包含:
Ø 帶有2 KB指令高速緩存的Nibs II/s處理器核;
Ø 2 KB片內ROM存儲器(Onchip_ROM)用於存儲程序代碼以及程序運行空間;
Ø 1 KB片內RAM存儲器(Onchip_RAM)用於變董存儲(R/W數據)、Heap、stack;
Ø 1位輸出I/O (PIO)引腳來控制LED;
Ø 系統識別外圍設備(SystemlD)(關於SystemID的功能見4.1.2小節)。
說明:由於控制LED燈閃爍的用戶程序代碼很小,所以可將代碼固化在片內ROM來執行,變量、堆棧 等空間使用片內RAM,而不使用任何片外存儲器。使用片內存儲器能獲得非常高的執行性能。
整個系統的框圖如圖2. 3所示。
圖中,其他邏輯與NiosII系統一樣可存在於FPGA中。事實上,大多數帶有Nios II系統 的FPGA設計也包括其他邏輯。Nios II系統可與其他的片內邏輯相互作用,這取決於整個系統的需要。為了簡單說明,本章的實例設計在FPGA內不包括其他邏輯。
假定讀者具有以下的軟件:
Ø Altera Quartus II軟件版本13.0或更高的版本——軟件必須被安裝在符合Quartus II 最低要求的Windows計算機上。
Ø Nios II開發套件版本13. 0或更髙的版本。
無論是否擁有一塊開發板,讀者都可以按照本章所述來進行實例設計。如果沒有目標板,
圖2.3控制LED閃爍的系統框圖
讀者仍然可以使用本章所述內容,但不能目睹實例設計在硬件上運行。取而代之,用戶將可以在Nios II指令集仿真器(ISS)上仿真軟件運行。如果讀者擁有開發板以及USB Blaster下載電纜,用戶將能目睹實例設計在硬件上運行及LED燈的閃爍。
2.4使用Quartus II建立工程
每個開發過程開始時都應建立一個Quartus II工程,Quartus II以工程的方式對設計過程進行管理,Quartus II工程包括創建FPGA配置文件需要的所有設置和設計文件。
2.4.1 打開Quartus II軟件並建立工程
雙擊Quartus II圖標打開Quartus II 15.1軟件,如圖2.4所示。
選擇【file】【New】【New Quartus Prime Project】來新建一項工程。新建工程想到說明對話框如圖2.5所示。
在新建工程向導說明對話框中可以了解在新建工程的過程中我們要完成哪些工作,這些
工作包括:
Ø 指定項目目錄、名稱和頂層實體;
Ø 指定項目設計文件;
Ø 指定該設計的Altera器件系列;
Ø 指定用於該項目的其他EDA工具,如仿真使用的Modelsim工具
Ø 項目信息報告。
任何一項設計都是一項工程(Project),必須首先為此工程建立一個放置與此工程相關的所有文件的文件夾,此文件夾將被Quartus II默認為工作庫(Work Library)。通常,不同的設計項目最好放在不同的文件夾中,而同一工程的所有文件都必須放在同一文件夾中。
不要將文件夾設在計算機已有的安裝目錄中,更不要將工程文件直接放在安裝目錄中。文件夾所在路徑名和文件夾名中不能用中文,不能用空格,不能用括號(),可用下划線“ _”。
圖2. 6第一欄用於指定工程所在的工作庫文件夾;第二欄用於指定工程名,工程名可以取任何名字,也可以直接用頂層文件的實體名作為工程名(建議使用);第三欄用於指定頂層文件 的實體名。本例工程的路徑為E:\easysopc_class\01_CoreCourse_GHRD文件夾,工程名與頂層文件的實體名同名為CoreCourse_GHRD。
這里解釋下CoreCourse_GHRD的意思,CoreCourse是芯航線的意思,GHRD叫做黃金設計頂層,GHRD是Altera首先提出的一個基於Qsys的HPS硬件參考設計工程,一般由板商提供的最基本的HPS硬件工程,開發人員可以根據要求在此基礎上添加或者刪除FPGA端 IP器件,也可以使能或者失能HPS的部分外設,配置HPS DDR3的時鍾參數。這里我們將這個概念引入到我們的開發板中,作為我們板子的一個黃金設計頂層。當然,這一個實驗中,這個黃金設計頂層只是一個框架,並沒有晚上,我們將在后續的實驗中逐步完善這個工程,當我們所有實驗結束后,整個工程將是一個復雜且完整的,具有參考和實用價值的設計工程,成為真正意義上的黃金設計頂層。
這里為選擇創建工程類型,可選項包括創建空工程(Empty Project)和使用工程模版(Project Template),由於工程模版需要在Altera官方網站下載,而且不一定適合我們,因此這里我們直接選擇空工程即可。點擊進入下一步。
由於是新建工程,暫無輸入文件,所以直接單擊,進入圖2.8所示對話框。要根據實際使用的FPGA來選擇目標器件,這里指定為Cyclone IV系列的EP4CE10F17C8。
在圖2. 8右邊的過濾器選項區域中,設計者可以通過指定封裝、引腳數以及器件
速度等級來加快器件査找的速度。 v
指定完器件后,單擊進入圖2. 9所示對話框,選擇EDA工具。
本章所述實例是利用Quartus II的集成環境進行開發,不使用任何EDA工具,基於Verilog的數字邏輯教程中常用的設置仿真工具為modelsim(altera),由於本實驗暫不涉及到用戶邏輯的開發,無需使用modelsim仿真,因此這里 不作任何設置和改動。
(7) 單擊圖2. 9中進入圖2. 10所示對話框。從圖2. 10中,設計者可以看到工程文件配置信息報告。單擊
按鈕(圖中未畫出),完成新建工程的建立。
當然,工程建立完成后,也是可以根據設計中的實際情況,通過選擇【Assignments】【Settings】來對工程進行重新設置。
2.4.2 建立頂層模塊
頂層模塊用於將整個工程的各個模塊包含在里面,Quartus II編譯時將這些模塊整合在 一起。頂層文件相當於傳統電路設計中的電路板(PCB),用於將各種功能的芯片焊接在上面。
頂層文件的實現方式有兩種,第一種是比較傳統的使用原理圖文件(.bdf),將所有的模塊生成原理圖符號,類似於一個一個的集成電路芯片,然后使用畫線的方式將各個模塊對應的端口連接起來,另一種是世界使用Verilog或者VHDL語言進行例化,將每個模塊在一個Verilog文件中例化並將相關的信號名為相同的名字以實現連接。這兩種方式各有優缺點。原理圖方式進行頂層工程設計的優勢是模塊間關系一看便知,邏輯清晰,但是缺點是不易維護,尤其是在需要例化的模塊越來越多的時候,這種方式無論是從實現效率和可移植性上,都有非常大的局限性,因此近些年來,使用的人已經越來越少。HDL文件直接例化的方式,雖然在邏輯關系上看着不如原理圖方式清晰,但是卻擁有無可匹敵的可移植行和便捷的修改特性,因此近些年來,越來越多的工程師開始選擇使用HDL文件來設計工程頂層。這里,我們也強烈推薦大家使用HDL的方式來設計頂層文件,盡量不要使用原理圖的方式。
依次點擊【File】【New】【Verilog HDL File】來創建一個新的Verilog文件,並點擊【File】【Save As】將文件保存為CoreCourse_GHRD.v
對話框,如圖2. 13所示。
在圖2. 13中接受默認的文件名,然后點擊保存即可。至此,完成了頂層模塊的建立。在2.6.1小節中將講述怎樣將QSYS生成的模塊加人到頂層模塊中。
2.5 使用 Qsys創建 Nios II 系統
2.5.1 Qsys簡介
Qsys包含在Quartus II軟件中,它為建立SOPC設計提供了圖形化環境,是早期Quartus II軟件中SOPC Builder版本的升級,在保持基本功能不變的前提下,增加了系統建設的靈活性。 SOPC由CPU、存儲器接口、標准外設和用戶自定義的外設等組件組成。Qsys允許選擇和自定義系統模塊的各個組件和接口。利用Qsys,用戶可以很方便地將處理 器、存儲器和其它外設模塊連接起來,形成一個完整的系統。Qsys中已經包含了 Nios II處理器以及一些常用的外設IP模塊,用戶也可以設計自己的外設IP。用戶在Qsys中定義Nios II系統的硬件特性,例如使用哪個Nios II內核,系統中包括什么外設。 Qsys不定義軟件操作,例如存儲器中哪里存儲指令或哪里發送stderr字符流,這些 工作在Nios II HDE中完成,見2. 9. 2小節。
Avalon總線和外設的配置是在Qsys的圖形用戶界面(GUI)中指定的。用戶 在GUI界面中指定各種參數和選項,這些參數和選項會存入一個系統qsys文件。qsys文件是一個文本文件,它完整地定義了以下內容:
(1) Avalon總線模塊結構與功能參數;
(2) 每個外設結構與功能參數;
(3) 每個外設的主/從角色;
(4) 每個外設提供的端口信號;
(5)每個可被多個主端口訪問的從端口的仲裁機制。
從內部來看,Qsys包含兩個主要部分:圖形用戶界面(GUI)和系統生成程序。 圖形用戶界面提供管理IP模塊、配置系統和報告錯誤等功能。用戶通過圖形用戶界面設計系統時,所有的設置都保存在一個以系統命名的qsys文件中,所以圖形用戶界面實際上就是qsys文件的專用編輯器。用戶通過圖形用戶界面完成設計之后,單擊Generate將啟動系統生成程序。系統生成程序完成大量的功能,創建了幾乎所有的Qsys輸出文件(HDL邏 輯文件、C程序的頭文件和庫文件、模擬仿真文件等)。
qsys文件是圖形用戶界面和系統生成程序之間的唯一交互渠道。對大部分用戶來說,僅僅了解qsys文件是由圖形用戶界面產生,並且系統生成程序要讀取qsys文件的內容就足夠 了。髙級用戶可以使用文本編輯器來修改qsys文件編輯自己的設計,而不是使用圖形用戶界面。qsys文件傳遞給HDL生成器,用來創建系統模塊實際的寄存器傳輸級(RTL)描述。
當用戶使用Qsys創建一個新的系統時,Qsys自動生成一個以系統名 命名的系統qsys文件,所有的設計信息都保存在該qsys文件中。當使用Qsys重新打開一個已有的系統時,qsys文件是Qsys工具讀取該系統具體設計信息的唯一來源。系統qsys文件的內容隨着用戶吐信用戶界面對系統的編輯而改變。
當Qsys完成一個系統的搭建並生成了系統之后,會在工程文件夾下生成如下若干文件或文件夾。例如將Qsys系統保存為mycpu.qsys,則工程文件夾下將會生成如下的文件或文件夾。
mycpu.qsys:Qsys系統文件(.qsys)——用於描述系統的硬件結構。
mycpu.sopcinfo:Sopc信息文件(.sopcinfo),Nios II IDE使用.sopcinfo文件來信息來為目標硬件編譯軟件程序。
mycpu文件夾:mycpu下包含了整個Qsys系統生成的各種詳細文件,包括整個系統的例化文件(mycpu_inst.v)以及Qsys中使用到的所有組件的硬件描述語言(HDL)文件(在synthesis文件夾中), QuartusII符號模塊文件(.bsf)——該文件中的符號(Symbol)用於在使用原理圖設計頂層時添加到Quartus II工程頂層文件,使用Verilog設計頂層的方式不使用。
所有Qsys的菜單命令如表2.1所列。:
在下一小節中,將以一個實例來講述Qsys的使用,讀者將執行下列步驟:
1) 啟動 Qsys;‘
2) 指定目標FPGA和時鍾設置;
3) 增加Nios II內核,片內存儲器和其它外設。
4) 指定基地址和中斷請求(IRQ)優先級。
5) 指定更多的Nios II設置。
6) 生成 Qsys 系統。 •
Qsys設計過程不需要按固定的順序進行,本節所述的設計步驟是常用的,便於讀者理解。然而,讀者可使用不同的順序來執行Qsys設計步驟。
表2.1 Qsys菜單命令列表
2.5.2 啟動 Qsys
打開Quartus II軟件。在Quartus II中選擇【Tools】->【Qsys】選項來啟動Qsys,建議首先新建一個Quartus II工程,然后再打開Qsys,如圖2. 14所示。 .. ,
Qsys啟動后,將自動創建好一個名為unsaved.qsys的工程,該項目中僅僅包含了一個時鍾管理單元,如下圖所示:
圖 2. 14 啟動 Qsys
這個時候我們點擊【File】【Save】即可保存當前項目,這里我們將項目命名為mysystem.qsys
圖 2. 15 保存項目對話框
在圖2.15中輸入項目名稱。在本例中項目名為mysystem。
特別注意,項目名稱不能與2.4. 2小節中建立的頂層HDL文件名同名,否則在后期Quartus II編譯該工程時將會報錯。
圖 2. 16 Qsys 界面
2.5.3指定系統輸入時鍾頻率
Qsys工具打開后,clk_0是自動添加進來的,該元件是用來對輸入的時鍾和復位信號進行處理的。我們雙擊該元件的名稱(clk_0),將會在右側彈出時鍾設置對話框,這里我們可以設置輸入時鍾頻率,因為系統默認為50MHz,而我們芯航線FPGA開發板上使用的也是50MHz的晶振,即與系統默認一致,因此,這里我們不需要修改。當讀者在使用自己的目標板時,就需要根據自己的目標板實際情況進行設置。需要注意的是,所設置的頻率一定要與系統實際運行的時鍾頻率相匹配。否則一些涉及到精確時序參數的外設(定時器、UART、SPI等等)可能無法正常工作。
2.5.4添加Nios II處理器內核
執行下面的步驟,添加Nios II/s內核到系統:
在圖2. 16所示IP Catlog欄,搜索框中輸入nios,在搜索結果中選中Nios II Processor,雙擊或者點擊Add按鈕打開NiOS II 處理器配置窗口。這里分別對該設置窗口中的一些參數進行介紹。
main:選擇NIOS II處理器的內核類型。從main選項卡可以看到,Nios II系列支持兩種類型的CPU,並給出了其支持的相關功能特性,詳細內容見3. 10節所列。根據應用要求和目標FPGA中的器件約束(邏輯資源)條件,選擇適合的CPU核。由於芯航線FPGA學習套件上使用的FPGA器件(EP4CE10)的邏輯資源比較充足(10K),因此本實例選擇快速型CPU核Nios II/f,如果用戶使用的是邏輯資源有限的器件,如EP4CE6,則使用快速型內核比較緊張,建議選擇經濟型內核。這也是我們選擇EP4CE10這款器件的原因,為了給用戶學習和使用NIOS II處理器留出相當的邏輯資源。
Vectors:設置CPU的復位向量(Reset Vevtor)、異常向量(Exception Vector)和快速TLB命中異常向量(Fast TLB Miss Exception Vector)。
Reset Vevtor:復位向量用於設置CPU復位后從何處啟動,例如我們在調試系統時,為了方便,常設置CPU的復位向量為SDRAM或SRAM,而當我們的系統開發完成后,則將CPU的復位向量設置於FLASH,例如EPCS存儲器。這樣系統即可上電后自動從FLASH中復制程序代碼到內存中並運行。該選項只有當CPU的存儲器系統就緒后方可配置,因此,當我們添加NIOS II CPU時,因為此時CPU的存儲器組件並未就緒,因此此項無法配置,只有等我們后續為NIOS II添加好存儲器組件后,再回頭來進行修改。
Exception Vector:異常向量用於存放CPU處理異常事件的代碼,例如中斷處理代碼。在一個典型的系統中,該向量應該指向一個低延遲的存儲器,例如SDRAM、SRAM、或者片上存儲器(On Chip RAM)。
Fast TLB Miss Exception Vector:快速TLB命中異常向量主要與MMU協作,管理存儲器,本書所講解的知識贊不涉及到MMU方面的內容,因此此部分內容暫不做介紹。
Caches and Memory Interfaces Tab:本選項卡主要設置CPU的數據和指令緩存部件。
Instruction cache:指令緩存用於緩存NIOS II處理器的各種指令,以提高CPU的運行效率。該緩存的大小從512字節到64K字節用戶可自定義設置,,當然也可以不使用指令緩存。當選擇不使用指令緩存時,NIOS II處理器的指令總線將會被移除,因此,我們必須要包含一個緊耦合型指令存儲器(tightly-coupled instruction memory)。關於此部分的深入應用,需要用戶扎實掌握NIOS II處理器的知識后,再來深入研究,剛開始接觸時,在芯片資源充足的情況下,使用默認設置即可。
Data cache:數據緩存用於存放數據,
Data cache數據緩存選項用於指定緩存的大小。該緩存的大小從512字節到64K字節用戶可自定義設置,當然也可以不使用指令緩存。關於此部分的深入應用,需要用戶扎實掌握NIOS II處理器的知識后,再來深入研究,剛開始接觸時,在芯片資源充足的情況下,使用默認設置即可。
Arithmetic Instructions:該選項卡用來設置NIOS II處理器實現算術指令的方式,這里我們可以通過選擇Divide Hardware來設置NIOS II處理器是否支持硬件除法運算。也可以選擇乘法、移位等運算的實現方式。
JTAG Debug選項卡
為了方便調試,為CPU加人JTAG調試模塊。JTAG調試模塊要占用較多的邏輯單元,如果整個系統已經調試完畢了,可以選用取消勾選Include JTAG Debug,以減少系統占用資源。JTAG調試模塊根據功能的不同可設置是否使用硬件斷點,使用數據觸發,跟蹤類型和跟蹤存儲等
其他選項為用戶在實際的應用情況中根據自己的需求合理設置,這里不做過多的介紹。
在本實例中,我們選擇使用Nios II/f型內核,不使用硬件除法器,指令緩存默認設置為4K字節,數據緩存默認設置為2K字節。Jtag Debug默認,其他設置不變。點擊Finish按鈕即可完成NIOS II處理器的添加。
添加完成后,系統自動將該NIOS II處理器命名為nios2_gen2_0,我們可以選中改名字,點擊鼠標右鍵選擇rename以對處理器進行重命名,這里我們不做改變,使用默認名。
注意,大家在給Qsys中創建的各個組件重命名是,名字最前面應該使用英文字母。能使用的字符只有英文字母、數字和“_”,不能連續使用“_”符號,在名字的最后也不能使用“_”。
2.5.5添加片內存儲器
眾所周知,處理器系統至少要有一個存儲器用於數據和指令。本章實例設計一個4KB 片內ROM存儲器(Onchip_ROM),用於存儲程序代碼以及程序運行空間;4KB片內RAM存 儲器(onchip_RAM)用於變童存儲(R/W數據)、Heap、stack等。
執行下列步驟來添加存儲器:
(1) 如圖,在IP Catalog中,輸入onchip來進行過濾,在搜索結果中選擇並雙擊On-Chip Memory (RAM or ROM),彈出片內存儲器配置向導對話框,如 圖2. 21所示。
(2)在Memory Type選項區域中選中ROM (read-only),即指定為ROM型。FPGA內部其實 並沒有專用的ROM硬件資源,實現ROM的思想是對RAM賦初值,並保持該初值,使其為只讀的。ROM的內容在對FPGA進行配置時,一起寫入FPGA。
(3) 在Total Memory Size文本框中輸入4096,即指定4 KB的存儲容量。
(4) 不要改變其它任何默認設置。
(5) 單擊,在激活元件窗口中出現名稱為onchip_memory2_0的片內存儲器。
(6) 右擊激活元件窗口中〇nchip_memory_0,然后選擇Rename將onchip_memory_0重命名為onchip_ROM,如圖2. 22所示。
(7)更改了ROM的名稱后,我們在此雙擊onchip_ROM以對其參數進行編輯或查看,在最底部可以看到Memory will be initialized from mysystem_onchip_ROM. hex,即onchip_ROM存儲器在上電時將使用mysystem_onchip_ROM. hex文件進行初始化。mysystem_onchip_ROM.hex在Quartus II工程目錄下,該文件可以由用戶編輯生成,也可以由IDE編譯生成,見2. 9. 3小節。在本實例中,將使用onchip_rom來存儲用戶程序,mysystem_onchip_ROM. hex將由IDE編譯生成,文件的內容即用戶程序。
使用與添加onchip_RAM相同的方法,添加一個4KB的onchip_RAM。添加步驟中不
同之處在於:
(1) 在第(2)步中,Memory Type選項區中選中RAM(writeable),即指定為RAM型;
(2) 在第(3)步中,Total Memory Size文本框中輸人4096,即指定4 KB的存儲容量。
(3) 在第(6)步中,重命名為onchip_RAM。
2.5.6 添加 PIO
PIO為Nios II處理器系統接收輸人信號以 及輸出信號提供了一種簡易的方法。本實例設計使用1個PIO來驅動1個LED。
執行下列步驟添加PIO:
(1) 如圖,在IP Catalog中,輸入PIO來進行過濾,在搜索結果中選擇PIO (Parallel I/O)並雙擊彈出PIO配置向導對話框,如 圖2. 23所示。
(2) 在Width選項區的文本框中輸人1,將 PIO的寬度改為1位;在Direction選項區選擇 Output,即僅輸出模式。Output Port Reset Value處修改值為1,即設定PIO復位時為1。這里設置為1主要是為了使系統復位后LED處於熄滅狀態。
(3) 單擊,在激活元件窗口中出現名稱為 pio_0 的 PIO。
(4) 右擊激活元件窗口中pio_0,選擇Rename將pio_0重命名為pio_led。給出硬件外設的描述名稱是一種良好的習慣。這樣會方便我們在分配引腳和編寫軟件程序時對外設的理解。
注意:在Nios II IDE的用戶程序中,將使用PIO_LED(NIOS II IDE中不論組件名的大小寫,統一使用大寫字母,無需用戶強制使用大寫字母命名)這個名稱來訪問外設,所以在這里推薦將PIO命名為pio_led當然,用戶也可以命名為其他的名稱,只是要在IDE的用戶程序中,使用相應的名稱來訪問PIO即可,由於考慮到是第一個實例,為了盡量減少學習者的出錯幾率,這里還是強烈建議大家直接使用PIO_LED或者pio_led來命名。
關於PIO的更多細節,請參見4. 1節。
2.5.7添加系統ID外設
如果系統包括系統ID外設,則當Qsys生成Nios II系統時,將為該Nios II系統生成一個標識符(ID號)。該標識符會被寫入SYSTEM ID寄存器中,供IDE編譯器和用戶辨別所運行的程序是否與目標系統匹配。在IDE中,如果用戶程序不是基於對應的Nios II系統的,那么調試時,Nios II IDE將阻止用戶下載程序到Nios II系統,當然,我們也可以在調試時選擇忽略系統ID的核對來跳過這個校驗。具體操作見后續軟件開發部分
在IP Catalog中,輸入” system id”來進行過濾,在搜索結果中選擇System ID Peripheral並雙擊彈出System ID配置向導對話框,在這里,我們可以在“32 bit System ID”處手動的輸入一個ID作為系統標識符,本實例我們設置0x00000008。
單擊,在激活元件窗口中出現名稱為sysid_qsys_0的System ID Peripheral。
右擊激活元件窗口中sysid_qsys_0,選擇Rename將sysid_qsys_0重命名為sysid。
關於系統ID外設的更多細節,請見4. 12節。
2.5.8連接各外設到Avalon MM總線上
通過以上步驟,我們完成了添加實現點亮LED燈所需的所有外設組件,然而,這些組件當前都還是各自獨立的,與系統核心NIOS II CPU並沒有關聯起來。因此我們需要使用Avalon MM總線或Avalon ST總線來將這些組件連接起來,因為本實例中不存在數據流組件,因此不涉及到Avalon ST總線的連接。
本系統中,總共涉及到Avalon MM總線的指令總線、數據總線、時鍾網絡、復位網絡和中斷網絡。一個完整的系統由至少一個主設備和至少一個從設備構成,本實例中NIOS II CPU為主設備,sysid和PIO_LED為從設備。onchip_ROM和onchip_RAM為存儲器設備。我們連接時,首先將存儲器設備的slave(s1)同時和NIOS II CPU的數據總線(data master)和指令(instruction master)總線連接,然后將pio_led和sysid的slave(s1)與NIOS II CPU的數據總線(data master)相連,不要將s1與指令總線相連接。連接總線的方法很簡單,將兩個需要連接到一起的總線交叉處的空心圓圈點擊一下,即可實現兩個網絡的連接。
關於什么時候需要連接指令總線,什么時候不需要,這里給出一個連接技巧:凡是不涉及到存儲CPU 指令的外設,如串口,定時器,SPI等非存儲器外設,只需要將s1連接到CPU的data master即可。而對於需要存儲CPU程序指令的存儲器,如EPCS、onchip_ROM、SDRAM等,需要將s1和CPU的data master 和instruction master同時連接。當然,一些明確不會存儲指令的存儲器,也不需要連接instruction master。連接完成的網絡如下圖所示:
以上完成了所有組件的數據總線和指令總線的連接,接下來還需要完成時鍾網絡和復位網絡的連接。本實例中只有一個時鍾網絡,因此將所有組件的時鍾網絡連接到一起即可,連接時鍾網絡的系統如下圖所示:
接下來我們需要連接全局復位網絡,連接復位網絡有兩種方式,第一種方式和連接時鍾網絡一樣,手動一個一個的去點擊交叉點連接。第二種方式就是直接點擊菜單欄【System】 【Create Global Reset Network】來連接復位網絡,這里推薦初次接觸Qsys的用戶使用第二種方式,以減少出錯的概率。
由於本系統中沒有添加能夠產生中斷請求的組件,因此沒有中斷網絡需要連接。關於中斷網絡的連接和中斷號的分配,我們將在后續章節講解中斷的使用的時候進行講解。
所有總線連接完成后的系統如下圖所示。
2.5.9指定基地址和中斷請求優先級
在添加和完成組件間的總線網絡連接后,我們就需要為每個外設分配基地址和中斷請求優先級,由於本實例中所有外設都不含有中斷,所以無需進行中斷優先級分配。
Qsys提供Assign Base Addresses和Assign Interrupt Numbers命令,如下圖所示,這兩個命令可以分別簡單的實現分配外設基地址和中斷優先級。
對於許多系統,包括本實例設計,Assign Base Addresses能滿足要求。當然,用戶可以自己調整基地址和中斷優先級來滿足系統的需求。NIOS II處理器的內核可尋址31位地址范圍(2G),用戶必須分配0x00000000~0x7fffffff之間的基地址。NIOS II程序使用宏定義的符號常量來訪問外設,基地址的改變不會造成程序的修改。
由於Qsys只是搭建系統,並不處理軟件操作,因此它不能做出關於最好的IRQ分配的有根據猜測,因此建議用戶不采用自動分配的方式,而是自己根據系統結構手動分配中斷優先級。
這里,我們要分配系統基地址,可以使用自動分配的方式,直接點擊【System】【Assign Base Addresses】即可。
2.5.10設置NIOS II復位和異常地址
雙擊nios2_gen2_0組件,在打開的選項卡中,點擊Vectors切換到向量設置選項卡。本實例,系統上電后,從內部ROM開始運行,所以Reset Vector的Reset Vector memory選擇onchip_ROM.s1,offset為0x00000000。異常向量表放在內部RAM里面,所以,Exception Address選擇onchip_RAM.s1,Offset地址為0x00000020。
注意:Reset Address和Exception Address的Offset只有在多處理器的系統中才進行設置,且其值必須為0x20的倍數,如果地址設置違反規則,信息窗口會給出錯誤提示。
2.5.11設置需要引出到Qsys系統頂層的信號
在最終形成的FPGA系統中,Qsys所創建的組件是以一個子模塊的形式添加到Quartus II工程中的,而作為子模塊,就存在相應的輸入輸出,在Qsys系統中,當系統組件添加完成后,還需要手動的將系統中各個組件對應的信號導出到頂層,這樣才能正常的加入到Quartus II工程中。
那么具體有哪些信號是需要導出到模塊頂層的呢?在本例中clk_0模塊的clk_in和clk_in_reset信號是需要導出到頂層的,但是這兩個信號在系統創建之時就自動存在並導出到頂層了,因此不需要我們手動再去操作。
而onchip_ROM、onchip_RAM、systemID等外設僅與CPU進行交互,沒有需要導出到系統頂層與其他模塊或引腳連接的信號,因此不用連接。pio_led作為一個輸出引腳,最終是通過引腳連接到開發板上的LED燈的控制角,因此需要導出到頂層。每一個模塊,如果有需要導出到系統頂層的信號,則有一個名為external_connection的總線名,其屬性為Conduit。因此,對於剛接觸Qsys系統的用戶,只需要認准這種屬性的信號,即為需要導出到頂層的信號。
導出這個信號,只需要在該信號的export一欄雙擊,並輸入你希望命名的信號名稱即可。例如,本實例中,我們雙擊Double-click to即可輸入信號名,這里我們雙擊並經信號名修改為pio_led即可。如下圖所示:
至此,我們整個系統就搭建完成了,接下來點擊【File】->【Save】保存當前系統,然后即可開始生產該系統對應的HDL文件了。
2.5.12 生成NIOS II系統
使用Qsys生成NIOS II系統,執行以下步驟:
1、 點擊【Generate】->【Generate HDL】打開Generation對話框。
2、 默認輸出路徑不變
3、 點擊Generate按鈕,系統生成開始。
在系統生成過程中,Qsys會執行一系列操作,Qsys會為添加的所有部件生成Verilog HDL源文件,並生成每個硬件部件以及連接部件的片內總線結構、仲裁和中斷邏輯。Qsys會為系統生成NIOS II IDE軟件開發所需的硬件抽象層(HAL)、C以及匯編頭文件。這些頭文件定義了存儲器映射、中斷優先級和每個外設寄存器空間的數據結構。這樣的自動生成過程有助於軟件設計者處理硬件潛在的變化性。如果硬件改變了,Qsys會自動更新這些頭文件。Qsys也會為系統中現有的誒個外設生成定制的C和匯編函數庫。如果添加了片內存儲器,Qsys還將為片內ROM、RAM生成其初始化所使用的HEX文件(空白文件)。在生成階段的最后一步,Qsys創建適合於系統部件的總線結構,並把所有部件連接在一起。
生成過程時間隨計算機的性能而不同,一般需要幾分鍾。生成結束后,顯示Finished: Create HDL design files for synthesis,點擊Close即可。然后關閉Qsys工具。
這時,在Quartus II工程中會彈出以下窗口提示,點擊OK即可。此時,我們一個基於NIOS II處理器的系統就搭建完成了。
NIOS II系統生成后將產生下列文件:
Qsys系統文件:mysystem.sopcinfo,它定義了Qsys生成完整系統必須的詳細信息,該文件存儲NIOS II系統的硬件內容,NIOS II IDE需要使用該文件信息來為目標硬件編譯軟件程序。詳細內容見2.9.1小節。
硬件描述語言(HDL)文件——mysystem.v以及各外設的HDL文件,這些文件是描述NIOS II系統硬件設計文件。Quartus II軟件將使用這些HDL文件來編譯整個FPGA設計。這些文件位於E:\easysopc_class\01_CoreCourse_GHRD\mysystem\synthesis路徑下。
至此,已經完成NIOS II處理器系統的創建。生成系統結束后,要將系統集成到Quartus II硬件工程並使用NIOS II IDE來開發軟件,可以先使用NIOS II IDE進行軟件開發,也可以先將系統集成到Quartus II。當然,如果是多人合作開發,兩者可同時進行。
2.6集成NIOS II系統到Quartus II工程
在2.4.2小節中已經建立好了Quartus II頂層模塊,本節的內容是將剛生產的NIOS 系統添加到頂層模塊中。
2.6.1添加NIOS II系統模塊到Quartus II頂層模塊
添加NIOS II系統模塊到Quartus II頂層模塊,需要先將生成的.qsys文件添加到工程中。
點擊【Project】->【Add/Remove Files in Project】
在打開的窗口中點擊瀏覽文件按鈕,選擇mysystem.qsys文件,然后點擊Add添加。最后點擊【Apply】【OK】即可。
接着將NIOS II系統例化到工程頂層文件中,這里可以直接打開E:\easysopc_class\01_CoreCourse_GHRD\mysystem目錄下的mysystem_inst.v文件,然后復制其中的內容,粘貼到頂層文件CoreCourse_GHRD.v中。
最后我們完成完整頂層文件的其他部分設計。首先編寫端口列表,本實例系統比較簡單,僅有時鍾(clk)、復位(reset_n)兩個輸入以及一組LED輸出。因此編寫端口列表如下:
接着我們將NIOS II系統的各個信號連接到整個系統的輸入輸出管腳上。clk_clk連接clk50M,reset_reset_n連接reset_n,pio_led_export連接到連接如下所示:
最終,整個頂層文件的代碼如下所示:
2.6.2選擇器件型號
每種型號的FPGA芯片的引腳可能都不相同,因此在進行引腳分配之前,都應該選擇相應目標FPGA芯片新號。這一步其實在2.4.1小節中已經完成,這里只是讓讀者了解,在Quartus II工程創建好后仍然可以選擇並修改器件型號。
在Quartus II菜單欄中依次點擊【Assignments】->【Device】打開器件選擇對話框,如下圖所示。在該對話框中,指定所需的目標器件型號,本實例為芯航線FPGA學習套件主板上使用的FPGA芯片EP4CE10F17C8。
2.6.3分配FPGA引腳
本實例中各引腳的命名以及與目標FPGA板卡上對應功能引腳標號如下表所示,注意,此處要根據不同的目標板進行調整。一般板卡商都會提供相應的引腳分配說明表。
分配FPGA引腳的位置,執行下面步驟:
要進行引腳分配,需要先對工程進行分析和綜合,當分析和綜合完成后,將會自動的分析得到工程中的各個端口信號。點擊鍵盤組合鍵Ctrl + K,對工程啟動分析和綜合。
分析和綜合完成后,在Quartus II菜單欄中依次點擊【Assignments】->【Pin Planner】打開引腳分配對話框,如下圖所示。
可以看到,引腳分配窗口中已經自動從我們的工程中提取出了需要分配引腳的信號。
按照下表,在Location欄中輸入對應的引腳名稱即可。
最終引腳分配結果如下圖所示:
其中前四個信號為Jtag接口相關信號,僅在針對JTAG接口有特殊應用時才需要進行引腳分配,一般情況無需分配。
分配完成后,直接關閉引腳分配對話框即可(關閉即自動保存)。
2.7編譯系統
通過Quartus II編譯器,可以檢查設計錯誤,綜合邏輯,並且為模擬、時序分析及器件配置生成輸出文件。
2.7.1設置編譯選項
在下圖中,可以通過選擇相應的設置選項進行設置。來決定對當前工程的各種編譯選項。本實例采用默認的編譯設置,不進行任何修改。若要進行編譯選項設置,請參考Altera的Quartus II Handbook。
2.7.2編譯硬件系統
在編譯過程中,編譯器定位並處理所有工程文件,生成與編譯相關的消息與報告,創建SOF文件及任何可選配置文件。
選擇Processing—>Start Compilation進行全編譯,也可以直接點擊按鈕或者直接按鍵盤組合鍵Crtl + L來啟動全編譯。在編譯系統是,狀態窗口顯示整個編譯進程及每個編譯階段所用的時間。編譯結果顯示在Compilation Report窗口中,整個編譯時間為幾分鍾到幾十分鍾,具體耗時取決於計算機性能以及編譯選項設置。
在編譯過程中,如果添加了內部存儲器,會使用onchip_ROM.hex文件對onchip_ROM進行初始化。
在編譯過程中,可能產生很多警告信息,但這些不會影響設計結果。
2.7.3查看編譯報告
編譯結束后,在Compilation Report窗口顯示編譯結果,包括編譯報告,綜合報告,適配報告,時序分析報告等。由於本設計比較簡單,器件適配,靜態時序等情況很容易滿足要求,所以在此不詳細分析這些報告。
2.8下載硬件設計到目標FPGA
成功編譯硬件系統后,將產生CoreCourse_GHRD.sof的FPGA配置文件輸出。本節簡單介紹將 SOF文件下載到目標FPGA器件的步驟9
(1)通過USB Blaster下載電纜連接目標板和主計算機,接通目標板電源。
(2)在Quartus II軟件中選擇【Tools】->【Programmer】,打開編程器窗口並自動打開配置文件(CoreCourse_GHRD.sof),如下圖所示。如果沒有自動打開配置文件,則須添加需要編程的配置文件,點擊Add File,然后選擇output files文件夾下的CoreCourse_GHRD.sof文件,選擇open即可。
(3)確保編程器窗口的Hardware Setup欄中硬件已經安裝。
(4)確保Program/Configure下的方框選中。
(5)單擊Start 按鈕,開始使用配置文件對FPGA進行配置,Progress欄顯示配置進度
本節只講述了將配置文件下載到FPGA中,掉電后FPGA中的配置數據將丟失,可以將配置文件寫人掉電保持的EPCS器件。在上電時使用EPCS對FPGA進行配置,詳細內容見《芯航線FPGA數字系統設計教程+實例解析》中第一部分“十一、芯航線FPGA學習套件配置文件固化教程”內容。
2.9 使用NIOS II IDE建立用戶程序
本節中,將啟動Nios II集成開發環境來建立和編譯一個簡單的LED燈閃爍的C語言程序。
針對NIOS II軟核,要開發一個能夠正常運行在目標板上的程序,需要同時具備用戶應用工程(Application Project)和板級支持包工程(BSP Project)。
其中板級支持包工程(BSP Project)是一個與硬件系統緊密聯系的工程,其使用我們創建Qsys系統時生成的.sopcinfo文件。BSP工程創建時會根據.sopcinfo文件中定義的NIOS II系統的硬件信息,生成對應的設備驅動(drivers)、HAL庫(HAL)以及硬件信息頭文件(System.h)。
2.9.1創建一個新的C/C+ +應用工程
啟動一個新的C/C++應用工程時,Nios II IDE需要使用Qsys系統文件 (.sopcinfo)。在目標硬件上運行和調試應用工程之前,軟件設計者需要先使用FPGA配置文件(.sof)配置FPGA。
IDE可產生下面列出的幾個輸出,但不是所有的工程都要求這些輸出。
> System.h文件——為系統中的硬件信息進行宏定義,幫助軟件設計者處理硬件潛在的變化性,軟件設計者可以使用這些宏定義而不是具體的硬件信息(如地址值、中斷號等)。該文件也可用於査閱系統中的硬件。創建一個新板級支持包(BSP)工程時,1DE自動生成該文件。
>可執行的連接文件(.elf)—是編譯C/C+ +應用工程的結果,可直接將它下載到 Nios II處理器。
>存儲器初始化文件(.hex)——如果添加的片內存儲器,片內存儲器可在上電時預定義存儲器的內容。IDE可生成片內存儲器的初始化文件,該存儲器支持初始化的內容。
> Flash編程數據——IDE包括Flash編程器,利用IDE的Flash編程器可以寫程序到 Flash存儲器。用戶也可以使用Flash編程器來寫任意二進制數據到Flash存儲器。
本章僅討論直接下載.elf文件到Nios II系統。關於使用IDE中Flash編程器進行編 程的詳細內容請參考本書相關章節(待定)。
執行下面的步驟來創建一個新的C/C+ +應用工程:
(1) 在Quartus II軟件菜單欄中,依次點擊【Tools】->【Nios II Software Build Tools for Eclipse】啟動Nios II IDE。
(2)在彈出的Workspace Launcher對話框中,單擊按鈕,設置工作空間為Quartus II工程的文件夾(E:\easysopc_class\01_CoreCourse_GHRD),如圖2.41所示,這樣便於管理。然后點擊OK進入Nios II IDE編輯界面。
(3)在該界面中選擇 File—New—Nios II Application and BSP from Template(圖 2. 42),打開新建工程向導,如圖2.43所示。
圖2. 42打開新建C/C+ +工程向導
(4)單擊SOPC Information File name選項區中的.按鈕,打開選擇文件對話框,選擇當前工程目錄下的mysystem.sopcinfow文件,(注意,一定要核對當前sopcinfo文件的路徑是否正確,軟件會默認記錄上次打開的sopcinfo文件路徑,如果不注意這一點,會經常容易出錯)。選擇完成后,軟件會自動識別當前硬件系統中的CPU名稱,如下圖所示:
圖2.44選擇硬件目標文件
(5)選擇Project Template 列表框中的 Hello World。並在Project Name 欄中輸入hello_led_0,選中Use Dafault Location復選框,單擊按鈕,完成工程創建。
向導中的Select Project Templates—欄中是已經設計好的軟件工程,用戶可以選擇其中的一個,把它當作模板來創建自己的工程。當然也可以選擇Blank Project(空白工程),完全由 用戶寫所有的代碼。本例中選取了 Hello World工程,然后在此基礎上進行適當的修改,一般情況下這比空白工程更加容易,也更方便。
圖2.45完成設置后的工程向導
創建工程后,在Nios II IDE主界面左側的C/C++ Projects選項卡中顯示兩個新的工程:hello_led_0 和 hello_led_0_BSP。hello_led_0 是 C/C+ +應用工程,而 hello_led_0_BSP是描述CoreCourse_GHRD系統硬件細節的系統庫。
Nios II IDE中每個工作界面都包括一個或多個窗口,每個窗口都有其特定的功能。在工作界面中包括的主要窗口有編輯器窗口和一個或多個瀏覽器。編輯器可用於打開並編輯一個工程。瀏覽器用於對編輯器提供各種支持,可由用戶根據需要進行選擇。
用戶可以同時打開多個編輯器,但在同一時刻只能有一個編輯器處於激活狀態。在工作界面上的主菜單和工具條的各種操作只對處於激活狀態的編輯器起作用。在編輯區中的各個
標簽上是當前被打開的文件名,帶有“*”號的標簽表示這個編輯器中的內容還沒有被保存。
在編譯工程前,要養成先對各文件進行保存的好習慣。
未完待續…………………………