- 片上系統(tǒng)設(shè)計(jì)思想與源代碼分析
- 陳曦 黃毅
- 4801字
- 2018-12-27 17:52:42
1.2 片上系統(tǒng)DemoSoC
1.2.1 嵌入式控制器簡(jiǎn)介
本書(shū)將片上系統(tǒng)中最常見(jiàn)的模塊組織起來(lái)構(gòu)成一個(gè)完整的SoC,該SoC被命名為DemoSoC,是一個(gè)嵌入式控制器。后文將以DemoSoC為例講述片上系統(tǒng)的設(shè)計(jì)思想和設(shè)計(jì)方法學(xué)。
嵌入式系統(tǒng)是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),并且軟硬件可裁剪,適用于應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。它一般由嵌入式微處理器、外圍硬件設(shè)備、嵌入式操作系統(tǒng)及用戶的應(yīng)用程序4部分組成,用于實(shí)現(xiàn)對(duì)其他設(shè)備的控制、監(jiān)視或管理等功能。
不管是在手機(jī)、電視、工業(yè)控制設(shè)備、網(wǎng)絡(luò)設(shè)備還是在家用微波爐中,都可以看到嵌入式控制技術(shù)的影子,嵌入式控制技術(shù)已經(jīng)成功地應(yīng)用在各種領(lǐng)域中,并且越來(lái)越廣泛地進(jìn)入到人們的生活中。
嵌入式控制器是各種嵌入式系統(tǒng)的“心臟”,從8位單片機(jī)到32位多核,嵌入式控制器正變得越來(lái)越豐富強(qiáng)大。嵌入式控制器也稱作嵌入式微控制器,英文簡(jiǎn)稱Embedded Controller,全稱為Embedded Microcontroller Unit,因此,嵌入式控制器實(shí)際上就是常說(shuō)的單片機(jī)。
嵌入式控制器是一個(gè)完整的片上系統(tǒng),根據(jù)特定應(yīng)用所對(duì)應(yīng)的功能需求的不同而有所不同。本書(shū)將以32位嵌入式控制器為例,講述片上系統(tǒng)的設(shè)計(jì)思想和設(shè)計(jì)方法學(xué)。
1.2.2 片上系統(tǒng)DemoSoC的架構(gòu)
片上系統(tǒng)DemoSoC的整體架構(gòu)如圖1-1所示。

圖1-1 DemoSoC整體架構(gòu)
在DemoSoC中,各個(gè)模塊通過(guò)一個(gè)高速的系統(tǒng)總線和一個(gè)低速的外設(shè)總線相連接,這是SoC的核心特征之一;在DemoSoC中還包括一個(gè)32位處理器,控制所有外設(shè)協(xié)調(diào)工作,這是SoC的核心特征之二。DemoSoC各個(gè)子模塊描述如下:
1.32位開(kāi)源處理器核OR1200,處理器核是整個(gè)SoC的核心控制單元
除CPU核外,該處理器內(nèi)部還集成了定時(shí)器(用于操作系統(tǒng)“心跳”中斷)、中斷控制器、節(jié)電控制模塊(電源管理模塊)。該處理器是哈佛架構(gòu),指令和數(shù)據(jù)分開(kāi),分別通過(guò)指令總線接口單元(Bus Interface Unit)和數(shù)據(jù)總線接口單元連接到片上總線,這兩個(gè)總線接口單元都是總線組設(shè)備。
2.NandFlash控制器
連接到NandFlash,實(shí)現(xiàn)到NandFlash的訪問(wèn)。大容量閃存(掉電后數(shù)據(jù)可保存,加電后可讀取和修改)集成電路包括NorFlash和NandFlash兩大類。NorFlash的寫過(guò)程復(fù)雜,但是讀取過(guò)程簡(jiǎn)單,可以當(dāng)做靜態(tài)RAM來(lái)讀取,因此可以用做啟動(dòng)ROM,其缺點(diǎn)是存儲(chǔ)容量受限。而NandFlash的存儲(chǔ)容量非常大,是U盤的核心器件,其寫入和讀取過(guò)程復(fù)雜度相當(dāng),因此一般不能直接用做啟動(dòng)ROM,必須輔助以其他手段才能用于啟動(dòng)ROM。后文將詳細(xì)講述。
3.外部存儲(chǔ)器控制EMC模塊,其內(nèi)部包括SDRAM控制器和OnChipROM控制器
OnChipROM用于存儲(chǔ)處理器啟動(dòng)后執(zhí)行的最初代碼,完成整個(gè)系統(tǒng)最基本的初始化工作。RAM是動(dòng)態(tài)大容量隨機(jī)存取存儲(chǔ)器,其特點(diǎn)是掉電后數(shù)據(jù)消失。SRAM與SDRAM的區(qū)別是SDRAM的單個(gè)存儲(chǔ)單元比SRAM面積小,因此SDRAM的容量大,讀寫速度較快,這是高性能計(jì)算機(jī)系統(tǒng)所需要的。SDRAM的缺點(diǎn)也是控制相對(duì)復(fù)雜。SDRAM與NandFlash相互配合,構(gòu)成了現(xiàn)代高性能嵌入式系統(tǒng)的存儲(chǔ)系統(tǒng)。嵌入式系統(tǒng)與PC相比較,SDRAM是內(nèi)存,而NandFlash則等價(jià)于硬盤。
4.IIS音頻控制器
IIS是Inter-IC Sound的簡(jiǎn)寫,該接口是數(shù)字音頻到音頻編解碼器之間的接口,用于在它們之間傳送立體聲音頻。類似于IIS,AC97同樣是另外一種音頻接口標(biāo)準(zhǔn)。AC97在個(gè)人計(jì)算機(jī)系統(tǒng)中應(yīng)用較多,而IIS更多的見(jiàn)諸于嵌入式系統(tǒng)。高等級(jí)的音頻有時(shí)采用SPDIF接口。
5.12Mbps USB Device+Host控制器
12Mbps USB接口最初在USB 1.1中定義為全速,而USB 2.0在USB 1.1的基礎(chǔ)上定義了480Mbps的高速。在一些文獻(xiàn)中也稱12Mbps是USB 2.0,這有偷換概念之嫌疑。本書(shū)中不再區(qū)分USB 1.1與USB 2.0,而直接稱為12Mbps USB Device+Host控制器。顧名思義,該模塊包括USB從設(shè)備和主設(shè)備兩個(gè)部分。在嵌入式系統(tǒng)中,USB從設(shè)備一般用于取代串口實(shí)現(xiàn)更高速度的嵌入式設(shè)備與PC之間的連接,用于設(shè)備調(diào)試;而USB主設(shè)備接口則用于連接一些性能不高的USB外設(shè),包括U盤和其他設(shè)備。在DemoSoC中,480Mbps的高速USB設(shè)備(包括主設(shè)備和從設(shè)備)可連接到PCI Host接口。
6.總線橋和DMA
在嵌入式系統(tǒng)中,總線橋和DMA雖然不直接連接外部,但也是必不可少的。總線橋的作用是將高速總線和低速總線區(qū)分開(kāi)。在一般的高性能嵌入式系統(tǒng)中,高速總線的速度一般是低速總線的2倍、4倍、8倍可調(diào)節(jié),而CPU的時(shí)鐘頻率是高速總線的1倍、2倍、4倍可調(diào)節(jié)。這樣設(shè)計(jì)的目的是節(jié)省電源。總線橋的第一個(gè)核心設(shè)計(jì)目的是節(jié)電,第二個(gè)目的是減少高速總線的容性負(fù)載,第三個(gè)目的是實(shí)現(xiàn)高速總線和低速總線的速率解耦,目的三是目的一的代價(jià)。總線在一個(gè)片上系統(tǒng)中是邏輯最簡(jiǎn)單、調(diào)試最困難的部件之一。DMA用于在設(shè)備之間搬運(yùn)數(shù)據(jù),從而將處理器解放出來(lái)處理更重要的任務(wù)。一般DMA放置于總線橋中,這是因?yàn)榭偩€橋是最方便訪問(wèn)兩個(gè)總線的位置,只有放在總線橋中,DMA才能最高效,這將在后文中詳細(xì)講述。
7.LCD控制器
根據(jù)是否自帶顯存,LCD可以分為RGB接口LCD和智能LCD。RGB接口LCD不帶顯存,必須依賴總線主設(shè)備上的存儲(chǔ)器作為顯存,因此,RGB接口LCD控制器模塊是一個(gè)總線主設(shè)備,當(dāng)顯存刷新失敗時(shí)將產(chǎn)生中斷等待處理器進(jìn)行處理。智能LCD自帶顯存,處理器只根據(jù)顯示的需要對(duì)顯存的特定像素寄存器和其他控制器進(jìn)行簡(jiǎn)單的操作即可。考慮到顯存的價(jià)格因素,智能LCD更多在低端嵌入式設(shè)備中采用,屏幕尺寸一般較小。
8.手機(jī)鍵盤控制器
手機(jī)鍵盤是4×6的小型掃描鍵盤。手機(jī)鍵盤控制器的設(shè)計(jì)要點(diǎn)在于鍵盤的防抖。
9.IIC接口模塊
在DemoSoC中,IIC接口用于連接實(shí)時(shí)時(shí)鐘控制器。實(shí)時(shí)時(shí)鐘是許多便攜式嵌入式系統(tǒng)必備的模塊。實(shí)時(shí)時(shí)鐘控制器通過(guò)IIC接口與嵌入式控制器相連接。IIC是Inter-IC Communication的縮寫,其特點(diǎn)是管腳數(shù)只有兩個(gè)。IIC已經(jīng)成為許多嵌入式控制器的必備模塊。
10.定時(shí)器和PWM
定時(shí)器為系統(tǒng)提供定時(shí)功能,如協(xié)議的超時(shí),串口速率的自動(dòng)檢測(cè)等。PWM是脈沖寬度調(diào)制的縮寫,典型的應(yīng)用之一為控制LCD背光的亮度。PWM脈沖一般基于定時(shí)器產(chǎn)生。
11.JTAG模塊
JTAG接口模塊的用途為在線調(diào)試、跟蹤、寄存器訪問(wèn)。一方面JTAG模塊可以取代處理器訪問(wèn)總線上的設(shè)備;另一方面,它可以與處理器的開(kāi)發(fā)接口相連接,實(shí)現(xiàn)端點(diǎn)、單步、跟蹤等調(diào)試功能,這些是處理器調(diào)試所必需的。
12.SPI接口模塊
SPI接口的作用為對(duì)LCD內(nèi)部控制器芯片、基帶芯片等進(jìn)行初始化。
13.UART模塊
實(shí)現(xiàn)RS232串口,多用于開(kāi)發(fā)過(guò)程的調(diào)試,有時(shí)也用于數(shù)據(jù)輸入,如全球定位系統(tǒng)(GPS)模塊的輸出就是通過(guò)串口。
14.PS/2接口模塊
連接鍵盤和鼠標(biāo)。
15.PCI Host模塊
PCI Host模塊實(shí)現(xiàn)PCI總線到片內(nèi)總線的橋接功能,實(shí)現(xiàn)PCI主設(shè)備邏輯,通過(guò)PCI Host模塊,DemoSoC可以連接到其他具有PCI接口的設(shè)備,如RTL8139C 10/100Mbps自適應(yīng)以太網(wǎng)、ISP1561480Mbps USB從設(shè)備等。
16.GPIO模塊
GPIO模塊是通用輸入輸出接口,可以連接鍵盤等慢速設(shè)備。
17.復(fù)位和時(shí)鐘模塊
理想的復(fù)位邏輯是異步產(chǎn)生,同步取消,因而必須對(duì)輸入的復(fù)位信號(hào)進(jìn)行處理,包括去抖動(dòng)等。時(shí)鐘模塊將主時(shí)鐘進(jìn)行合成后產(chǎn)生不同頻率的時(shí)鐘信號(hào)供不同的外設(shè)使用。
1.2.3 片上系統(tǒng)DemoSoC的存儲(chǔ)器映射
在一個(gè)片上系統(tǒng)中,所有的主和從設(shè)備都連接到總線上。所有從設(shè)備被映射到相互不重疊的地址空間供主設(shè)備訪問(wèn),從設(shè)備地址空間的設(shè)計(jì)稱作片上系統(tǒng)的存儲(chǔ)器映射。
除了處理器,其他的主設(shè)備首先也是一個(gè)從設(shè)備,因?yàn)樗鼈兌加信渲眉拇嫫鞴┨幚砥骺刂破涔ぷ鞣绞胶蜖顟B(tài)。
幾乎每一個(gè)外設(shè)都包括配置寄存器,即使是存儲(chǔ)器接口,當(dāng)支持多種不同類型的存儲(chǔ)器時(shí)也要進(jìn)行配置。以SDRAM存儲(chǔ)器控制器為例,也需要配置寄存器控制器SDRAM的工作方式和狀態(tài)。假設(shè)一個(gè)SDRAM的地址空間為16MB,即使SDRAM控制器的配置寄存器只有一個(gè),為了地址譯碼的簡(jiǎn)化或?qū)⑷縎DRAM的空間利用起來(lái),也需要另外一個(gè)16MB的空間供這一個(gè)寄存器使用。當(dāng)類似的設(shè)備較多時(shí),地址空間的浪費(fèi)就會(huì)顯著增加。另外一種設(shè)備是主設(shè)備,如RGB接口的LCD控制器,主設(shè)備的控制寄存器并不多,但是需要一個(gè)單獨(dú)的從設(shè)備接口訪問(wèn)這些寄存器,從而增加了邏輯設(shè)計(jì)難度和總線負(fù)載。
一種設(shè)計(jì)選擇是將所有的從設(shè)備的寄存器集中起來(lái)構(gòu)成一個(gè)單獨(dú)的從設(shè)備,而從設(shè)備本身只完成必須的工作,不包括控制寄存器。比如將SDRAM控制器的寄存器、LCD控制器的寄存器放在一起構(gòu)成一個(gè)專用寄存器模塊,而SDRAM控制器空間只包含存儲(chǔ)器訪問(wèn),LCD控制器只留下主設(shè)備接口。這樣設(shè)計(jì)的好處是節(jié)省了地址空間,減少了從設(shè)備的個(gè)數(shù);缺點(diǎn)是專用寄存器模塊需要與多個(gè)模塊相連接,模塊的獨(dú)立性被破壞,后端設(shè)計(jì)更加復(fù)雜。
另外一種選擇是類似DemoSoC的設(shè)計(jì),每一個(gè)模塊的相關(guān)控制寄存器和模塊本身放在一起,雖然從設(shè)備的個(gè)數(shù)較多,地址空間顯得浪費(fèi),但是模塊的獨(dú)立性和可移植性好。
下面講述DemoSoC的地址空間映射。
處理器在系統(tǒng)加電復(fù)位后,總是執(zhí)行地址0或地址0附近的代碼,因此地址0或地址0附近的代碼必須是在系統(tǒng)復(fù)位后就已經(jīng)存在,通常地址0起始的空間存放的是片內(nèi)或片外的OnChipROM。OnChipROM的職責(zé)有兩個(gè),一個(gè)是完成將程序代碼從不可啟動(dòng)Flash存儲(chǔ)器,如NandFlash讀出并送到主存儲(chǔ)器如SDRAM中,然后讓處理器從SDRAM重新啟動(dòng);另一個(gè)是能夠通過(guò)網(wǎng)口、USB口將代碼從主計(jì)算機(jī)下載到Flash存儲(chǔ)器中。當(dāng)然設(shè)計(jì)者也可以通過(guò)JTAG將代碼從主計(jì)算機(jī)下載到Flash存儲(chǔ)器中,但是下載速度較慢,對(duì)于一些用戶來(lái)講可能難以接受。
在DemoSoC中,在系統(tǒng)復(fù)位后,OnChipROM位于第一個(gè)4×8KB,SDRAM位于0x20000000~3FFFFFFF,處理器的復(fù)位向量的初始地址為0x00000100,即OpenRISC 1200在啟動(dòng)后執(zhí)行的第一行代碼來(lái)源于0x00000100。此時(shí)運(yùn)行的代碼的任務(wù)為將程序代碼從NandFlash移到SDRAM中,OnChipROM的最后一行代碼為向0x3FFFFFF0寫入1,該寄存器操作會(huì)觸發(fā)處理器復(fù)位邏輯重新啟動(dòng)處理器和地址譯碼邏輯,此后,地址譯碼器將OnChipROM從系統(tǒng)中刪除,將SDRAM映射到0x00000000~1FFFFFFF,注意SDRAM實(shí)際上只有16MB。
因此,OnChipROM和SDRAM的地址在系統(tǒng)啟動(dòng)時(shí)是變化,系統(tǒng)自動(dòng)重新進(jìn)行了映射。考慮到地址重新映射的方便,這里將SDRAM控制器和OnChipROM用一個(gè)EMC模塊包封起來(lái)。當(dāng)在FPGA運(yùn)行DemoSoC時(shí),考慮到SDRAM的速度問(wèn)題,若不進(jìn)行地址重新映射,可以將OnChipROM用FPGA中可以使用下載文件初始化的RAM代替,此時(shí)代碼空間只有32KB。
除了OnChipROM和SDRAM,所有其他外設(shè)的地址是固定的。外設(shè)地址空間的定義取決于設(shè)計(jì)者的偏好,一般是將地址高位的若干比特用于區(qū)分不同的設(shè)備。
1.2.4 總線優(yōu)先級(jí)
總線優(yōu)先級(jí)分為以下幾種。
● LCDC最高優(yōu)先級(jí)
● DMA次高優(yōu)先級(jí)
● Ethernet第三優(yōu)先級(jí)
● 處理器最低優(yōu)先級(jí)
一般地,初學(xué)者可能認(rèn)為處理器的優(yōu)先級(jí)應(yīng)該是最高的,但是實(shí)際上恰恰相反。在調(diào)試模式下,JTAG單獨(dú)擁有總線,其他主設(shè)備不能訪問(wèn)總線。LCDC的優(yōu)先級(jí)高是因?yàn)槠聊皇怯脩襞c系統(tǒng)的重要接口,LCD工作是否正常直接影響到用戶體驗(yàn)。高LCDC優(yōu)先級(jí)保證LCD屏幕能夠得到及時(shí)刷新。這里的LCD是需要將SDRAM作為顯存RGB接口LCD,而智能LCD自帶顯存,是一個(gè)從設(shè)備。
DMA第三優(yōu)先級(jí)高是因?yàn)镈MA常常對(duì)應(yīng)一些實(shí)時(shí)業(yè)務(wù),如音樂(lè)播放。
Ethernet的業(yè)務(wù)類型是盡力而為,丟包只需重傳,因此被設(shè)為第三優(yōu)先級(jí)。
處理器的優(yōu)先級(jí)最低,是因?yàn)樘幚砥魇侵骺卦O(shè)備,軟件完全可以通過(guò)對(duì)外設(shè)的控制實(shí)現(xiàn)對(duì)總線的“高優(yōu)先級(jí)”占有。
1.2.5 片上系統(tǒng)的代碼更新與調(diào)試
在一般嵌入式系統(tǒng)中,常見(jiàn)兩種啟動(dòng)方式,一是正常啟動(dòng),二是調(diào)試啟動(dòng)。
1.正常啟動(dòng)過(guò)程。
如前所述,處理器在系統(tǒng)加電復(fù)位后,總是執(zhí)行地址0或地址0附近的代碼,因此地址0或地址0附近的代碼必須是在系統(tǒng)復(fù)位后就已經(jīng)存在,通常地址0起始的空間存放的是片內(nèi)OnChipROM或片外的BootROM(此處不妨稱為ROM)。在DemoSoC中,在系統(tǒng)復(fù)位后,OnChipROM位于第一個(gè)32KB,SDRAM位于0x20000000~3FFFFFFF,處理器的復(fù)位向量的初始地址為0x00000100。此時(shí)所運(yùn)行的代碼的任務(wù)為將程序代碼從NandFlash移到SDRAM中,NandFlash的數(shù)據(jù)按照塊方式存儲(chǔ),作為一個(gè)大容量非易失性存儲(chǔ)器,NandFlash并不能保證隨著時(shí)間的推移每一個(gè)存儲(chǔ)塊的內(nèi)容都是永遠(yuǎn)正確的,但是能保證NandFlash的第一個(gè)塊總是正確的。通常,NandFlash每一個(gè)塊由64個(gè)頁(yè)組成,每個(gè)頁(yè)通常2KB。在DemoSoC的設(shè)計(jì)中,頁(yè)0不用,頁(yè)1~63存儲(chǔ)管理信息。由軟件的設(shè)計(jì)者給出程序代碼的長(zhǎng)度(PRM_LENGTH_ADD地址所存儲(chǔ)的內(nèi)容)和第一個(gè)塊所在NandFlash中的位置(BLOCK_INFO_ADDR所存儲(chǔ)的內(nèi)容)信息。BLOCK_INFO_ADDR+4i中存儲(chǔ)的是程序的第i個(gè)block的起始地址。OnChipROM的最后一行代碼為向0xFFFFFFF0寫入1,該寄存器操作會(huì)觸發(fā)處理器復(fù)位邏輯重新啟動(dòng)處理器和地址譯碼邏輯,此后,地址譯碼器將ROM從系統(tǒng)中刪除,將SDRAM映射到0x00000000~1FFFFFFF。
當(dāng)用戶在系統(tǒng)正常啟動(dòng)后,可通過(guò)以太網(wǎng)口或USB口更新NandFlash,然后手動(dòng)讓系統(tǒng)重新復(fù)位,從而完成代碼更新。
2.調(diào)試啟動(dòng)過(guò)程
系統(tǒng)加電后,正常啟動(dòng),OnChipROM被屏蔽,SDRAM被映射到地址0起始的空間。用戶通過(guò)JTAG接口即可控制整個(gè)處理器的狀態(tài)。調(diào)試啟動(dòng)的過(guò)程如下:
(1)通過(guò)JTAG更新SDRAM的內(nèi)容;
(2)通過(guò)JTAG寫REG32(0x3FFFFFF0)=1,該操作導(dǎo)致處理器被復(fù)位。
此后系統(tǒng)自動(dòng)啟動(dòng),直接執(zhí)行SDRAM的內(nèi)容。
- 演進(jìn)式架構(gòu)(原書(shū)第2版)
- Python科學(xué)計(jì)算(第2版)
- Python快樂(lè)編程:人工智能深度學(xué)習(xí)基礎(chǔ)
- Python自然語(yǔ)言處理(微課版)
- C++程序設(shè)計(jì)基礎(chǔ)教程
- Apache Mesos Essentials
- Canvas Cookbook
- Appcelerator Titanium:Patterns and Best Practices
- Arduino電子設(shè)計(jì)實(shí)戰(zhàn)指南:零基礎(chǔ)篇
- Akka入門與實(shí)踐
- 從零開(kāi)始構(gòu)建深度前饋神經(jīng)網(wǎng)絡(luò):Python+TensorFlow 2.x
- Swift High Performance
- Android熱門應(yīng)用開(kāi)發(fā)詳解
- Python 3.6從入門到精通(視頻教學(xué)版)
- 編程風(fēng)格:程序設(shè)計(jì)與系統(tǒng)構(gòu)建的藝術(shù)(原書(shū)第2版)