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