(心得)不求甚解之NiosII
我想用一種比較有效的方式來描述關於系統設計的一些事情。設計是沒有一個固定規則的過程,否則也就沒有樂趣可言了。雖然有很多標准,有很多限制,但是依然有非常多的變化空間。其實最重要的事情,是知道什麼是重要的,什麼是次要的。精力應該集中在重要的東西上面,而不是一些細節。做系統設計需要有一種大的氣魄,一些不拘小節的氣質,當然,還需要別出心裁的創意。FPGA本身提供了一個非常靈活的平臺,如何最大化的利用這個平臺,是我們脫離呆板的嵌入式系統的一個重要關鍵,也是如何玩轉系統的關鍵。
不求甚解之NiosII
所有的系統都是由模塊組成的,或大或小的模塊,拼接成一個大積木。所以我們首先需要了解這些模塊 (IP)。關於怎麼去了解一個IP,其實是很重要的問題。NiosII CPU作為一個比較大型的模塊,可以作為一個例子來講。一個關鍵詞是不求甚解。不求甚解的目的,並不是偷懶,而是更准確,更有針對性,更快捷。IP的作用就是為了完成一個特定的功能,所以我們並不需要知道它是如何實現的,事實上,由於很多的IP都是加密的代碼,所以也不可能知道具體的電路狀態。同時也不需要花很多的時間把文檔裏面的每一行都了解清楚。作為工程師,大家的脾氣一般都是一種超強的好奇心和鑽研精神的集合。而往往會鑽進牛角尖裏面。而作為系統設計,是需要有一種粗曠型的大氣魄,不需要在細節上浪費時間。你會發現很多的細節是沒有意義的。並不是說我們不需要去研究細節,細節是很重要的,但是細節需要在被用到的時候才去關注就好了。
作為一個IP,最重要的,其實是接口。因為你最重要的是需要知道是怎麼讓它工作起來,而不是它怎麼工作的。所以在看文檔的時候,最主要看的就是接口信號,對所有的信號的作用有一個了解。NiosII使用的是Avalon MM 點對點接口,這其實是一個非常有趣的接口,因為它的交流更加短平快一些。它與普通的PCI接口不同的地方是,他可以支持同時多線控制。因為它沒有總線的概念,不會在總線被占據的時候,其他任何通訊都無法進行。NiosII是在SOPC builder 中被直接使用的,我們不需要知道具體有哪些信號,因為沒有非常需要,我們是看不到這些接口的。在NiosII中,我們有兩個Master Avalon MM 接口,一個是Instruction Master Port, 這是CPU用來讀取指令的接口。CPU通過這個端口從Memory上讀取指令。另一個是Data master port, 很簡單,這是用來連接數據通道的。比如說你要讀取的數據,你要存儲的數據,都是走這個通道。這兩個端口可以連接同一個內存,在這種時候需要特別小心,很有可能自己把自己的指令給改掉了。但是反過來思考一下,其實我們可以做什麼?可以按照狀況改變軟件代碼。NiosII中還有第三個端口,這是用來做Debug用的端口。還有其他的一些接口,比如TCM接口。我們需要知道這些接口的存在,但是不需要知道細節,只有在用到的時候再去看相關的文檔就好了。
第二個需要關注的問題就是參數設置。這裏面是有講究的。IP是廠家做出來的通用模塊,不是為你而特制的,所以必然有一些是你不需要的方面。我們可以通過參數的修改,讓它盡量的接近我們的需求。有很多人在做設計的時候是有思維定勢的,而且這種定勢的頑固性很強。這很容易對環境產生一種叛逆思想。就是說除了他自己假想出來的做法,其他的一切都
是不對的,或者說不好的。而這在使用IP的時候,會遭遇到意想不到的痛苦的。所以,盡量不要依靠假設來臆想了模塊的設置。而是盡量的適應環境,來配置自己的設計。作為一個FPGA的玩家,這種依照環境來改變的能力是必須的。
NiosII的參數中首先是指令集或者說CPU複雜度的選擇,有三個選擇,根據不同的選擇,CPU的能力會有不同,當然使用的資源也是完全不一樣的
�) NiosII/E (經濟型)能力最弱,當然資源也最小(600-700 LE )
�) NiosII/S (中間型) 中庸配置,資源消耗是1200-1400 LE
�) NiosII/F (快速型) 能力最強配置,資源消耗是 1400-1800LE
然後我們考慮Cashes的設置,Cash 有兩種,一種是用來做指令緩存的,一種是用來做數據緩存的。Cash的大小對程序的運行速度是有影響的。當然也沒必要使用過多的資源。夠用就好了。
再了解一下Jtag Debug的模式選擇,一共有五個等級的選擇。和選擇CPU一樣,從簡單到複雜。一般來說選擇Level2 也就夠用的。
自定義指令設置。這是最有價值的設置。別忘記了,我們是在FPGA的世界裏。所以CPU並不像在其他地方那樣的鐵板一塊。我們可以選擇使用自定義的指令。所謂自定義指令,並不是一個軟件宏或者函數。而是一塊硬件。當CPU調用到這個指令的時候,事實上它調用的就是這個硬件模塊,它被嵌入在CPU中。而這其實就是NiosII好玩的地方。
好了,現在我們要考慮的問題,就是使用。使用CPU的方法,當然就是軟件編程。NiosII的軟件其實是非常簡單的。就是普通的C,或者C++,需要做的就是不斷的對端口的地址讀啊,寫啊,計算數據,就好了。但也可能非常的複雜,因為你不僅需要了解軟件編程,你更需要了解你使用的那些硬件,那些外設模塊。NiosII的編程很硬件的依賴性是很強的。針對比較大型的一些外設,可以寫一些HAL 程序。這是類似於驅動的一些指令。而軟件只需要調用這些API就可以了。大部分的NiosII程序是不需要使用操作系統的,作為一個嵌入式系統的控制核心,更多的是一些存儲式的讀寫,算法的計算的操作。除非你需要運行一些網絡協議啊,什麼的。但其實我們可以用更加解構的方式來看待一個操作系統。操作系統其實就是給我們提供了一大堆的操作指令而已。沒什麼更特別的作用了。所以,思考一下吧。
我用了不求甚解的方式來介紹了一下NiosII。這是一種偷懶的方式。我要做的,其實就是把一些關鍵的點指出來,大家可以去看,同時不把時間消耗在細枝末節上面。要把NiosII完整的說清楚,當然不是這麼三言兩語的就可以的了,否則事情也太簡單了些了。我希望可以對大家有所幫助的地方就是,對一件複雜的事情,找一個聰明的方式。