零基礎學(xué)FPGA (十九) 探秘SOPC
今天是來(lái)北京的第8天了,想想過(guò)的蠻快的,在這8天里呢,由于這邊正在開(kāi)SOPC的課程,自己對這方面之前只是了解過(guò),知道有SOPC這回事,但是從來(lái)沒(méi)有接觸過(guò),正好有這個(gè)機會(huì )讓我蹭了幾天的課,算是對這東西有了深入的了解吧。課程講的很快,短短4天的功夫就從入門(mén)講到了我認為比較難懂的方面,不過(guò)還好,經(jīng)過(guò)我這幾天的消化,之前也有點(diǎn)基礎,理解一下還是沒(méi)什么問(wèn)題的,只不過(guò)讓我去操作一個(gè)有點(diǎn)難度的外設的話(huà),我估計還得下點(diǎn)功夫了~
本文引用地址:http://dyxdggzs.com/article/274620.htm講SOPC的郝老師跟我住一個(gè)屋,郝老師人很不錯,也很年輕,也是個(gè)90后,這幾天跟著(zhù)郝老師學(xué)到了不少東西,不僅僅是SOPC方面的,更多還有對工程師這個(gè)行業(yè),對這個(gè)社會(huì )的一些新的認識。
由于我也是剛接觸SOPC,不能像大神們講的那么井井有條,思路嚴謹,我只是把我最近幾天學(xué)到的東西跟大家分享一下,也作為自己的一份筆記。再下面的幾篇文章中,我都會(huì )給大家發(fā)一些SOPC的筆記,從基本的概念,到基本硬件系統的搭建,一些常用IP核的應用,像什么PIO核,UART核,USB,EPCS控制器,SDRAM控制器等,還有后面的自定義外設等,估計用四五篇文章的長(cháng)度來(lái)講這部分吧。
學(xué)這一部分知識要軟硬結合,硬件相信大家都沒(méi)問(wèn)題了,軟件呢需要用到C語(yǔ)言的知識,由于我之前很久沒(méi)用C語(yǔ)言了,如果大家對C語(yǔ)言還不是很熟的話(huà),建議大家回去補一下C語(yǔ)言的課,雖然我們是搞硬件的,但是越到后面,軟硬就不分了~
第一篇文章我就先來(lái)說(shuō)說(shuō)我理解中的SOPC,再教大家手把手搭建一個(gè)硬件平臺,這個(gè)硬件平臺搭建好了,我們以后的軟件就全部是基于這個(gè)平臺的編程了。
一、我理解中的SOPC
SOPC呢,也就是所謂的可編程片上系統,通常一個(gè)系統所包含的,什么CPU,存儲器,DSP和一些IO外設等都放在FPGA的周?chē)?,這樣大大增加的系統的面積從而增加了系統的成本,SOPC技術(shù)呢就是把CPU,DSP,定時(shí)器,IO模塊都放到FPGA里面,通過(guò)Quartus II提供的SOPC builder這個(gè)工具,在里面嵌入NIOS II處理器和一些常用的IP 核,NIOS II處理器作為主機,其他外設作為從機,主機和從機之間通過(guò)AVALON MM總線(xiàn)進(jìn)行通信與訪(fǎng)問(wèn),每一個(gè)外設都有一個(gè)地址,NIOS II處理器可以通過(guò)這條總線(xiàn)對外設進(jìn)行操作,但是每次只能訪(fǎng)問(wèn)一個(gè)外設,系統硬件搭建好了之后,通過(guò)Quartus II對其進(jìn)行綜合,布局布線(xiàn),時(shí)序約束等硬件系統搭建工作,然后我們用C語(yǔ)言通過(guò)NIOS II eclipse 這個(gè)工具來(lái)給我們的硬件系統編程,并進(jìn)行運行調試,最后將我們設計好的硬件與軟件文件燒入FPGA的配置芯片或者FILASH中,通過(guò)相應的總線(xiàn)來(lái)控制相應的外設。下面是我畫(huà)的一個(gè)關(guān)系圖

下面我們就通過(guò)一個(gè)具體的實(shí)例來(lái)理解這個(gè)過(guò)程
二 、硬件系統搭建

上面這個(gè)圖就是我們要搭建的硬件系統,硬件系統的搭建需要用到Quartus II軟件 和它提供的SOPC builder 工具,一步步來(lái),Quartus II建立工程就不說(shuō)了,建立工程之后,tool ——sopc builder,按照上面的框圖一個(gè)個(gè)添加我們需要的IP
首先我喜歡添加時(shí)鐘,即PLL,直接在左上方的搜索框里輸入PLL雙擊即可,至于PLL的配置方法我就不說(shuō)了,相信大家都已經(jīng)很熟了,由于我們的輸入時(shí)鐘是50M,我們需要的內部時(shí)鐘主要用來(lái)控制各種IP,用50M的c0時(shí)鐘,但是我們系統設計SDRAM,我們需要100M的c1時(shí)鐘來(lái)控制SDRAM控制器,即SDRAM接口,同樣還需要一個(gè)時(shí)鐘輸出到FPGA芯片外部來(lái)控制SDRAM芯片,我們用C2時(shí)鐘,C2時(shí)鐘跟C1時(shí)鐘同頻不同相,根據經(jīng)驗值,這個(gè)相位偏移我們選-75deg,頻率100M

接著(zhù)添加定時(shí)器,在搜索框輸入timer 配置定時(shí)單位,位寬,這里我們設置為1ms,32位,在硬件選項對話(huà)框里一般選擇 full—featured,當然也可以手動(dòng)配置一些參數選custom

然后我們可以配置SDRAM,即我們的內存,SDRAM的配置參數是按照我們板子上芯片的具體參數配置的,由于系統提供的SDRAM芯片跟我們不匹配,所以我們用custom手動(dòng)配置

之后可以配置EPCS控制器啊,JTAG控制器,UART,PIO,sysid等相應IP
EPCS控制器是我們要控制控制片外的EPCS芯片用到的一個(gè)IP核,由于我們的CPU每次運行起來(lái)都是從內存,即SDRAM中讀取數據的,而我們要做的就是將FPGA的硬件配置文件和我們的軟件配置文件燒入到EPCS芯片中,這樣CPU運行的時(shí)候就需要從EPCS芯片中將數據搬運到SDRAM中運行,從而提高運行速度,EPCS芯片控制器不需要配置,直接添加即可。
JTAG控制器是我們調試用的,包括我們將軟件代碼下載的時(shí)候,在窗口返回的一些數據就是通過(guò)JTAG口傳回的,這個(gè)IP也不需要配置,直接添加即可
UART控制器即串口,為我們以后做串口調試實(shí)驗做好硬件基礎,這里大家可以手動(dòng)配置波特率,和相應數據位
sysID說(shuō)白了就是我們這個(gè)系統的標號,跟身份證差不多意思,即一個(gè)系統對應一個(gè)標號,標號我們可以隨便取
PIO外設即我們的IO口,分為輸入輸出,我們可以手動(dòng)配置他們的輸入輸出,位寬等參數,輸出沒(méi)什么說(shuō)的,說(shuō)一下輸入,輸入我們主要是按鍵輸入,我的開(kāi)發(fā)板上是4位按鍵,所以位寬設為4,由于是按鍵輸入,所以我們要檢測的是按鍵的下降沿,而且是沿中斷而不是電平中斷,這里我們需要手動(dòng)改一下。PIO外設我們可以隨便加,包括什么數碼管,蜂鳴器,鍵盤(pán),led等

最后我們添加CPU,即我們的NIOS II 處理器,NIOS II處理器分為三種模式,即經(jīng)濟型,穩定型和快速型,當然越高端的類(lèi)型所占的邏輯資源就越多,我們做一些小實(shí)驗用經(jīng)濟型或者穩定型就夠了

還有一點(diǎn)要注意,配置參數中的兩個(gè)選項,Reset Vector——復位向量
Exception Vector——執行向量,我們分別選EPCS和SDRAM,即我們復位的時(shí)候,CPU從EPCS中將數據搬入SDRAM中重新執行,不復位的過(guò)程中,CPU從SDRAM中執行(這個(gè)地方可能理解的不對,望大神指點(diǎn))
全部配置完成之后,我們需要對每一個(gè)IP核改下名字,右鍵,rename改成我們習慣的名字,不改的話(huà)后面總是跟著(zhù)一些后綴。其實(shí)配置完成之后,系統就自動(dòng)將這些模塊連接好了,我們需要做的就是改一下時(shí)鐘,讓內部處理SDRAM控制器模塊的其他IP用PLL模塊輸出的c0時(shí)鐘,SDRAM控制器用c1時(shí)鐘

接下來(lái)我們需要系統自動(dòng)分配基地址和中斷號,其實(shí)細心的朋友可能發(fā)現,在右面IRQ一欄下有些中斷號是重復的,所以我們要系統重新分配一下中斷優(yōu)先級。點(diǎn)system——Assign base address 和 Assign interrupt numbers 即可,最后點(diǎn)下面的generate生成我們的系統即可
這樣我們在sopc builder里的工作就完成了,硬件一旦生成,就不要輕易改了,剩下的事就是我們要在軟件里折騰。
其實(shí)還可以這么理解,我們剛剛生成的系統就相當于一個(gè)集合了各種IP的模塊,我們直接拿來(lái)調用即可。打開(kāi)文件目錄下后綴名為.inst的文件,就例化了我們剛才生成的系統,我們在quartus II頂層文件中調用這個(gè)系統,生成頂層模塊,配置好管腳,這樣我們的硬件部分才算是真的完成了

三、軟件部分
硬件搞好了就要做軟件,養成一個(gè)好的習慣,在工程目錄中建立一個(gè)文件夾,專(zhuān)門(mén)放軟件部分的文件
做軟件,無(wú)非就是訪(fǎng)問(wèn)我們硬件系統中的寄存器,用C語(yǔ)言來(lái)控制,這里我們先簡(jiǎn)單做一個(gè)控制PIO核的小工程,通過(guò)控制PIO核來(lái)控制LED
軟件方面的工程建立我不想多說(shuō),只想跟大家談一下學(xué)習方法,當我們拿到一個(gè)外設,肯定要首先看一下他的datasheet,看他的寄存器映射圖,拿PIO這個(gè)核來(lái)說(shuō),我們可以從網(wǎng)上下載n2cpu_nii5v3這個(gè)文件,里面詳細介紹了各種IP核的資料

看datasheet 一般先看他的overview嘛,英文功底還是有的
然后我們需要看他的軟件文件software files,即控制這個(gè)IP核需要的頭文件,這里是altera_avalon_pio_regs.h

然后就是看寄存器視圖了,寄存器視圖告訴了我們如何具體操縱這個(gè)IP以及相應位的介紹

例如,第一個(gè)寄存器是數據寄存器,可以用來(lái)讀寫(xiě)數據,只要我們知道這個(gè)PIO核的基址,再知道它的寄存器偏移我們就可以往數據寄存器里讀寫(xiě)數據了,至于基址是多少,我們在定義硬件系統的時(shí)候系統已經(jīng)自動(dòng)生成,我們到時(shí)候只要調用就好了
再例如第二個(gè)寄存器是向量寄存器,即控制IO口的數據流方向,第三個(gè)寄存器是中斷寄存器等等
代碼部分我們來(lái)看一下

首先是初始化,我們調用函數找到我們PIO核的基址,并給我們的pio口賦初值0,至于PIO核的基址在頭文件system.h中有定義
system .h中定義了我們硬件系統中所有IP的相關(guān)參數,我們可以直接拿來(lái)調用

初始化之后呢就進(jìn)入while循環(huán),循環(huán)移位就是我們所說(shuō)的流水燈了。由于工程比較簡(jiǎn)單,按理說(shuō)還需要調試,這里我們就不調試了,下板即可,先將我們的硬件下到板子了,即我們的SOF文件,然后再下我們的軟件,右鍵我們的工程名,run as——NIOS II hardware

這篇文章主要是講了硬件系統的搭建,其實(shí)硬件系統一搭建起來(lái),我們以后的工程都可以用這個(gè)硬件系統,其實(shí)我自己也感覺(jué)這種用文字描述的方式來(lái)教大家做確實(shí)是不好理解,有些東西也不好用文字描述,上傳的圖片也是有限的,所以我中間也省了不少的步驟,包括一些常見(jiàn)錯誤的處理方法,工程文件的導入等,這些希望大家自己找資料了解,具體細節如果用文字描述起來(lái)更是繁瑣,能看視頻教學(xué)最好了。
下面的文章我們主要是在軟件上折騰,包括定時(shí)器中斷的使用啊,串口收發(fā)代碼的講解啊,還有自定義外設AD,DA芯片的控制啊,這些我們后續再談吧~寫(xiě)了也不少了,暫時(shí)收工吧。
fpga相關(guān)文章:fpga是什么
可控硅相關(guān)文章:可控硅工作原理
c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
蜂鳴器相關(guān)文章:蜂鳴器原理
評論