FPGA工程師的NIOS II學(xué)習(xí)筆記

又一篇關(guān)于NIOS的舊文,雖然現(xiàn)在開(kāi)發(fā)環(huán)境已經(jīng)升級(jí)變化了,但還是有些參考價(jià)值的。
來(lái)源:嵌入式在線 作者:山城棒棒兒軍 發(fā)布時(shí)間:2009-09-22 12:29:31
Nios Development Board Reference Manual, Stratix II Edition
在使用Nios II SDK Shell試運(yùn)行.grestore_my_flash時(shí),發(fā)現(xiàn)restore_my_flash會(huì)區(qū)分目錄名的大小寫(xiě),因此使用Nios II SDKShell時(shí)最好注意大小寫(xiě)一致。
restore_my_flash.pl為perl腳本,可以直接修改后直接執(zhí)行。
restore_my_flash不能正常取得命令行參數(shù),但這不影響恢復(fù)出廠設(shè)置的操作,因?yàn)閞estore_my_flash可以不依靠命令行參數(shù)來(lái) 執(zhí)行。
最好不要移動(dòng)NiosII的安裝目錄,例如restore_my_flash就會(huì)從目錄名中提取內(nèi)容生成需要的文件名。
恢復(fù)出廠設(shè)置需 要.sof和.flash兩個(gè)文件,估計(jì).sof用于生成最小的nios系統(tǒng),以便將.flash文件下載到Flash中。 (restore_my_flash提示使用J24 JTAG連接器,該連接器是用于配置StratixII器件的。)
Creating Multiprocessor NiosII Systems Tutorial
在standard設(shè)計(jì)的基礎(chǔ)上修改了Nios II系統(tǒng),又添加了兩個(gè)Nios II處理器及各自的定時(shí)器、共享互斥鎖、消息緩沖區(qū)。編譯、運(yùn)行和調(diào)試了hello_world_multi程序。
SOPC Builder中設(shè)置的NiosII的Reset和Exception地址很重要;
QuartusII生成的編程文件中包含有NiosII處理器的 復(fù)位地址;
NiosII IDE的編譯會(huì)生成絕對(duì)地址的代碼和數(shù)據(jù);
NiosII IDE通過(guò)NiosII處理器中的jtag_debug_module重定向程序的執(zhí)行地址;
上電或復(fù)位后,NiosII處理器從復(fù)位地址(通常指 向Flash)處執(zhí)行Boot Loader,將程序拷貝到Ram中并在Ram中執(zhí)行;
Exception地址確定了程序拷貝到Ram中的位置,Exception地址的低位總是 0x20,NiosII處理器跳轉(zhuǎn)到Ram執(zhí)行時(shí)先執(zhí)行低位地址為0x00的指令(用于初始化指令cache),之后執(zhí)行低位地址為0x20處的系統(tǒng)啟動(dòng)代碼。
Nios II多處理器設(shè)計(jì)的注意點(diǎn):
不支持SMP(對(duì)稱(chēng)多處理),只支持不對(duì)稱(chēng)的(每個(gè)處理器執(zhí)行不同的程序);
處理器之間可以不共享資源;
同一程序存儲(chǔ)器中的各處理器的代碼空間不能重合(通過(guò)Reset和Exception地址實(shí)現(xiàn));
共享數(shù)據(jù)存儲(chǔ)器最好用硬件共享互斥鎖 結(jié)合軟件操作的方式來(lái)實(shí)現(xiàn),不支持純硬件的共享方式(如果軟件不使用硬件互斥鎖,仍然會(huì)有訪問(wèn)沖突),純軟件的共享方式有使用限制并且較復(fù)雜;
軟件 共享互斥鎖只適用于同一處理器的不同進(jìn)程之間共享資源;
Nios II HAL library不支持共享外設(shè)(涉及中斷處理、外設(shè)輸入數(shù)據(jù)的處理等),Altera建議由固定的處理器管理相應(yīng)的外設(shè),其他處理器要使用該外設(shè)可以通過(guò) 消息緩沖區(qū)的方式;
不同于單處理器設(shè)計(jì),多處理器設(shè)計(jì)一定要明確規(guī)定每個(gè)組件的總線連接點(diǎn);
只要由不同的處理器訪問(wèn),兩個(gè)組件可以有相同的地址;
由設(shè)計(jì)人員保證各處理器使用的代碼空間是足夠的、不發(fā)生覆蓋的;
多處理器的軟件的運(yùn)行、調(diào)試可以一起或分別啟動(dòng)、終止,NiosII 5.0暫不支持一起暫停、再繼續(xù),“一起”不是“同時(shí)”。
Nios II Flash Programmer User Guide
Quartus II的Programmer只支持FPGA和配置器件;
Flash Programmer只支持CFI接口的Flash或EPCS配置器件,但可燒入配置文件、軟件代碼和任意數(shù)據(jù);
使用Flash Programmer需要生成Target Board及生成Flash Programmer可編程邏輯設(shè)計(jì),并在實(shí)際項(xiàng)目SOPC Builder流程中指定該Target Board;
Boot-Copier Program是Nios II IDE自帶的,當(dāng)軟件代碼位于Flash或EPCS中時(shí)由Flash Programmer自行使用,不同的是對(duì)Flash而言Boot-Copier Program放在Flash中,對(duì)EPCS而言Boot-Copier Program放在EPCS serial flash controller包含的on-chip ROM中;
上電或復(fù)位時(shí),Nios II從Boot-Copier Program開(kāi)始執(zhí)行(不論是Flash或EPCS),這要求SOPC Builder流程中指定復(fù)位地址為Flash或EPCS serial flash controller。
Simulating Nios II Embedded Processor Designs
仿真NiosII設(shè)計(jì)包括三種方式:
“NiosII IDE Debugger + Signal Tap II + 物理板”的軟硬件聯(lián)調(diào)方式;
“NiosII IDE Debugger +指令集仿真器ISS”的軟件調(diào)試方式(ISS可對(duì)部分組件建模);
使用ModelSim-Altera進(jìn)行的RTL級(jí)的功能仿真方式(可以調(diào)試處理器及其 外設(shè)之間的交互情況)。本文針對(duì)RTL級(jí)仿真方式。
存儲(chǔ)器的初始化:含有軟件代碼的存儲(chǔ)器都應(yīng)被初始化,不論是片上還是片外存儲(chǔ)器;軟件代碼相關(guān)的存儲(chǔ)器初始化文件由NiosII IDE編譯軟件時(shí)生成。
JTAG UART和PIO在SOPC Builder中都可設(shè)置仿真選項(xiàng),ModelSim-Altera還可根據(jù)仿真選項(xiàng)調(diào)出UART交互終端窗口。
需要在SOPC Builder中設(shè)置ModelSim的路徑和使能Simulation,之后SOPC Builder會(huì)生成仿真用的ModelSim項(xiàng)目文件、ModelSim宏命令、UART等組件的初始化文件。
需要在Nios II IDE中為System Library屬性打開(kāi)“ModelSim only,no hardware support”開(kāi)關(guān),這樣在編譯軟件時(shí)才會(huì)生成代碼相關(guān)的存儲(chǔ)器初始化文件,但生成的代碼不含啟動(dòng)代碼(指令和數(shù)據(jù)Cache沒(méi)有初始化、BSS段也不清除),以便加速仿真。因此,如果要下載代碼到硬件板,必須關(guān)掉“ModelSim only,no hardware support”開(kāi)關(guān)并且重編譯,以便生成完整的代碼。
在Nios II IDE中以NiosII ModelSim方式運(yùn)行(需設(shè)置ModelSim的路徑),將使ModelSim編譯setup_sim.do并接管后續(xù)的仿真運(yùn)行工作。
較重要的ModelSim宏(SOPC Builder生成):s、w、jtag_uart_drive。
一定要從Nios II IDE運(yùn)行ModelSim,jtag_uart_drive宏才能正常運(yùn)行。其他仿真步驟都可單獨(dú)使用ModelSim打開(kāi)該項(xiàng)目,在執(zhí)行完setup_sim.do后運(yùn)行。
應(yīng)該可以在SOPC Builder生成TestBench文件后修改該文件,以便進(jìn)行Nios II和片上其他邏輯的聯(lián)合仿真。(因?yàn)槭荢OPC Builder生成的TestBench文件,并沒(méi)有在Quartus II中生成,所以不一定是完整的片上設(shè)計(jì)的TestBench文件。)
NIOS和NIOS II都使用了Avalon總線,這是一種交換式架構(gòu)的片內(nèi)總線
該總線形式和PCI、ISA等板間互連總線的最大區(qū)別在于:主從設(shè)備之間有緊密耦合關(guān)系。Avalon總線架構(gòu)中,由硬件設(shè)計(jì)人員通過(guò)SOPC Builder規(guī)定互連的主從設(shè)備(包括數(shù)據(jù)、控制信號(hào)、片選、地址的互連),不連接的設(shè)備之間是互相看不到的。
每個(gè)Avalon主設(shè)備端有多路復(fù)用器,用來(lái)從多個(gè)從設(shè)備的數(shù)據(jù)總線中選擇當(dāng)前要訪問(wèn)的數(shù)據(jù)——這也是“交換”的含義所在。可見(jiàn)多路復(fù)用器的接口引 線相當(dāng)多,這只能在連線資源豐富的FPGA內(nèi)實(shí)現(xiàn)。所以說(shuō),Avalon總線架構(gòu)是適用FPGA設(shè)計(jì)的。片外的交換式總線也有,但都是串行接口的,主要是 為了降低PCB布線難度,如:PCI Express、以太網(wǎng)等。由于,Avalon總線架構(gòu)中所有設(shè)備沒(méi)有實(shí)現(xiàn)全互連,也就不存在“全交換”。但即使這樣,不同的主設(shè)備訪問(wèn)不同的從設(shè)備也是 可以同時(shí)的、并發(fā)的。
每個(gè)Avalon從設(shè)備都有仲裁器,仲裁各主設(shè)備的訪問(wèn),確保訪問(wèn)周期的完整性和正確性。我們可以認(rèn)為訪問(wèn)周期是“原子”的,即不被其他主設(shè)備破壞的。
軟件對(duì)共享資源的訪問(wèn),通常要求一個(gè)序列的多個(gè)訪問(wèn)不能被其他CPU打斷,這不是“原子”級(jí)的訪問(wèn)周期設(shè)計(jì)能保證的,這也是SOPC Builder中提供了硬件共享互斥鎖的由來(lái)。
各CPU上運(yùn)行的軟件都可對(duì)某個(gè)硬件共享互斥鎖進(jìn)行SET和TEST操作,以爭(zhēng)取對(duì)資源的占用能力。由于對(duì)硬件共享互斥鎖的訪問(wèn)周期是“原子”,所以硬件共享互斥鎖能保證多CPU設(shè)計(jì)中軟件級(jí)別的共享資源互斥訪問(wèn)。
NIOS II設(shè)計(jì)的靈活性是我感興趣的主要原因。只要有足夠的邏輯資源余量,NIOS II的設(shè)計(jì)是可以不斷更新的,設(shè)計(jì)人員不用為自己的設(shè)計(jì)能力、CPU版本的升級(jí)擔(dān)心,這放開(kāi)了我們的“思維”約束。