關鍵詞: FPGA , SOPC
今天是來北京的第8天了,想想過的蠻快的,在這8天里呢,由于這邊正在開SOPC的課程,自己對這方面之前只是了解過,知道有SOPC這回事,但是從來沒有接觸過,正好有這個機會讓我蹭了幾天的課,算是對這東西有了深入的了解吧。課程講的很快,短短4天的功夫就從入門講到了我認為比較難懂的方面,不過還好,經過我這幾天的消化,之前也有點基礎,理解一下還是沒什么問題的,只不過讓我去操作一個有點難度的外設的話,我估計還得下點功夫了~
講SOPC的郝老師跟我住一個屋,郝老師人很不錯,也很年輕,也是個90后,這幾天跟著郝老師學到了不少東西,不僅僅是SOPC方面的,更多還有對工程師這個行業,對這個社會的一些新的認識。
由于我也是剛接觸SOPC,不能像大神們講的那么井井有條,思路嚴謹,我只是把我最近幾天學到的東西跟大家分享一下,也作為自己的一份筆記。再下面的幾篇文章中,我都會給大家發一些SOPC的筆記,從基本的概念,到基本硬件系統的搭建,一些常用IP核的應用,像什么PIO核,UART核,USB,EPCS控制器,SDRAM控制器等,還有后面的自定義外設等,估計用四五篇文章的長度來講這部分吧。
學這一部分知識要軟硬結合,硬件相信大家都沒問題了,軟件呢需要用到C語言的知識,由于我之前很久沒用C語言了,如果大家對C語言還不是很熟的話,建議大家回去補一下C語言的課,雖然我們是搞硬件的,但是越到后面,軟硬就不分了~
第一篇文章我就先來說說我理解中的SOPC,再教大家手把手搭建一個硬件平臺,這個硬件平臺搭建好了,我們以后的軟件就全部是基于這個平臺的編程了。
一、我理解中的SOPC
SOPC呢,也就是所謂的可編程片上系統,通常一個系統所包含的,什么CPU,存儲器,DSP和一些IO外設等都放在FPGA的周圍,這樣大大增加的系統的面積從而增加了系統的成本,SOPC技術呢就是把CPU,DSP,定時器,IO模塊都放到FPGA里面,通過Quartus II提供的SOPC builder這個工具,在里面嵌入NIOS II處理器和一些常用的IP 核,NIOS II處理器作為主機,其他外設作為從機,主機和從機之間通過AVALON MM總線進行通信與訪問,每一個外設都有一個地址,NIOS II處理器可以通過這條總線對外設進行操作,但是每次只能訪問一個外設,系統硬件搭建好了之后,通過Quartus II對其進行綜合,布局布線,時序約束等硬件系統搭建工作,然后我們用C語言通過NIOS II eclipse 這個工具來給我們的硬件系統編程,并進行運行調試,最后將我們設計好的硬件與軟件文件燒入FPGA的配置芯片或者FILASH中,通過相應的總線來控制相應的外設。下面是我畫的一個關系圖
下面我們就通過一個具體的實例來理解這個過程
二 、硬件系統搭建
上面這個圖就是我們要搭建的硬件系統,硬件系統的搭建需要用到Quartus II軟件 和它提供的SOPC builder 工具,一步步來,Quartus II建立工程就不說了,建立工程之后,tool ——sopc builder,按照上面的框圖一個個添加我們需要的IP
首先我喜歡添加時鐘,即PLL,直接在左上方的搜索框里輸入PLL雙擊即可,至于PLL的配置方法我就不說了,相信大家都已經很熟了,由于我們的輸入時鐘是50M,我們需要的內部時鐘主要用來控制各種IP,用50M的c0時鐘,但是我們系統設計SDRAM,我們需要100M的c1時鐘來控制SDRAM控制器,即SDRAM接口,同樣還需要一個時鐘輸出到FPGA芯片外部來控制SDRAM芯片,我們用C2時鐘,C2時鐘跟C1時鐘同頻不同相,根據經驗值,這個相位偏移我們選-75deg,頻率100M
接著添加定時器,在搜索框輸入timer 配置定時單位,位寬,這里我們設置為1ms,32位,在硬件選項對話框里一般選擇 full—featured,當然也可以手動配置一些參數選custom
然后我們可以配置SDRAM,即我們的內存,SDRAM的配置參數是按照我們板子上芯片的具體參數配置的,由于系統提供的SDRAM芯片跟我們不匹配,所以我們用custom手動配置
之后可以配置EPCS控制器啊,JTAG控制器,UART,PIO,sysid等相應IP
EPCS控制器是我們要控制控制片外的EPCS芯片用到的一個IP核,由于我們的CPU每次運行起來都是從內存,即SDRAM中讀取數據的,而我們要做的就是將FPGA的硬件配置文件和我們的軟件配置文件燒入到EPCS芯片中,這樣CPU運行的時候就需要從EPCS芯片中將數據搬運到SDRAM中運行,從而提高運行速度,EPCS芯片控制器不需要配置,直接添加即可。
JTAG控制器是我們調試用的,包括我們將軟件代碼下載的時候,在窗口返回的一些數據就是通過JTAG口傳回的,這個IP也不需要配置,直接添加即可
UART控制器即串口,為我們以后做串口調試實驗做好硬件基礎,這里大家可以手動配置波特率,和相應數據位
sysID說白了就是我們這個系統的標號,跟身份證差不多意思,即一個系統對應一個標號,標號我們可以隨便取
PIO外設即我們的IO口,分為輸入輸出,我們可以手動配置他們的輸入輸出,位寬等參數,輸出沒什么說的,說一下輸入,輸入我們主要是按鍵輸入,我的開發板上是4位按鍵,所以位寬設為4,由于是按鍵輸入,所以我們要檢測的是按鍵的下降沿,而且是沿中斷而不是電平中斷,這里我們需要手動改一下。PIO外設我們可以隨便加,包括什么數碼管,蜂鳴器,鍵盤,led等
最后我們添加CPU,即我們的NIOS II 處理器,NIOS II處理器分為三種模式,即經濟型,穩定型和快速型,當然越高端的類型所占的邏輯資源就越多,我們做一些小實驗用經濟型或者穩定型就夠了
還有一點要注意,配置參數中的兩個選項,Reset Vector——復位向量
Exception Vector——執行向量,我們分別選EPCS和SDRAM,即我們復位的時候,CPU從EPCS中將數據搬入SDRAM中重新執行,不復位的過程中,CPU從SDRAM中執行(這個地方可能理解的不對,望大神指點)
全部配置完成之后,我們需要對每一個IP核改下名字,右鍵,rename改成我們習慣的名字,不改的話后面總是跟著一些后綴。其實配置完成之后,系統就自動將這些模塊連接好了,我們需要做的就是改一下時鐘,讓內部處理SDRAM控制器模塊的其他IP用PLL模塊輸出的c0時鐘,SDRAM控制器用c1時鐘
接下來我們需要系統自動分配基地址和中斷號,其實細心的朋友可能發現,在右面IRQ一欄下有些中斷號是重復的,所以我們要系統重新分配一下中斷優先級。點system——Assign base address 和 Assign interrupt numbers 即可,最后點下面的generate生成我們的系統即可
這樣我們在sopc builder里的工作就完成了,硬件一旦生成,就不要輕易改了,剩下的事就是我們要在軟件里折騰。
其實還可以這么理解,我們剛剛生成的系統就相當于一個集合了各種IP的模塊,我們直接拿來調用即可。打開文件目錄下后綴名為.inst的文件,就例化了我們剛才生成的系統,我們在quartus II頂層文件中調用這個系統,生成頂層模塊,配置好管腳,這樣我們的硬件部分才算是真的完成了
三、軟件部分
硬件搞好了就要做軟件,養成一個好的習慣,在工程目錄中建立一個文件夾,專門放軟件部分的文件
做軟件,無非就是訪問我們硬件系統中的寄存器,用C語言來控制,這里我們先簡單做一個控制PIO核的小工程,通過控制PIO核來控制LED
軟件方面的工程建立我不想多說,只想跟大家談一下學習方法,當我們拿到一個外設,肯定要首先看一下他的datasheet,看他的寄存器映射圖,拿PIO這個核來說,我們可以從網上下載n2cpu_nii5v3這個文件,里面詳細介紹了各種IP核的資料
看datasheet 一般先看他的overview嘛,英文功底還是有的
然后我們需要看他的軟件文件software files,即控制這個IP核需要的頭文件,這里是altera_avalon_pio_regs.h
然后就是看寄存器視圖了,寄存器視圖告訴了我們如何具體操縱這個IP以及相應位的介紹
例如,第一個寄存器是數據寄存器,可以用來讀寫數據,只要我們知道這個PIO核的基址,再知道它的寄存器偏移我們就可以往數據寄存器里讀寫數據了,至于基址是多少,我們在定義硬件系統的時候系統已經自動生成,我們到時候只要調用就好了
再例如第二個寄存器是向量寄存器,即控制IO口的數據流方向,第三個寄存器是中斷寄存器等等
代碼部分我們來看一下
首先是初始化,我們調用函數找到我們PIO核的基址,并給我們的pio口賦初值0,至于PIO核的基址在頭文件system.h中有定義
system .h中定義了我們硬件系統中所有IP的相關參數,我們可以直接拿來調用
初始化之后呢就進入while循環,循環移位就是我們所說的流水燈了。由于工程比較簡單,按理說還需要調試,這里我們就不調試了,下板即可,先將我們的硬件下到板子了,即我們的SOF文件,然后再下我們的軟件,右鍵我們的工程名,run as——NIOS II hardware
這篇文章主要是講了硬件系統的搭建,其實硬件系統一搭建起來,我們以后的工程都可以用這個硬件系統,其實我自己也感覺這種用文字描述的方式來教大家做確實是不好理解,有些東西也不好用文字描述,上傳的圖片也是有限的,所以我中間也省了不少的步驟,包括一些常見錯誤的處理方法,工程文件的導入等,這些希望大家自己找資料了解,具體細節如果用文字描述起來更是繁瑣,能看視頻教學最好了。
下面的文章我們主要是在軟件上折騰,包括定時器中斷的使用啊,串口收發代碼的講解啊,還有自定義外設AD,DA芯片的控制啊,這些我們后續再談吧~寫了也不少了,暫時收工吧。
評論
查看更多