|
例說FPGA連載52:NAND Flash實例之總線的概念 特權同學,版權所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1c0nf6Qc
關于總線,比較官方的說法是:總線(Bus)是計算機各種功能部件之間傳送信息的公共通信干線。說到計算機,大家不要下意識的就以為只是特指每天我們都要面對的電腦。比較高端的計算機,火箭用的叫箭載計算機,衛星上用的叫星載計算機;稍微遜色一點的,工業上用的叫工控機,我們家里用的叫PC機、筆記本;而嵌入式用的計算機更是數不勝數了,PDD、GPS和手機,MP3、MP4和電紙書,電梯、冰箱和微波爐的電子控制部分,細細找找,發現生活中凡是涉及電的還真沒有一樣離得開“微電”的控制。提到控制,那么肯定或大或小有個CPU,一旦和CPU搭上邊好歹也要算個小型計算機了。計算機不僅有CPU,還需要有各種外設配合CPU與外界通信,那么CPU與外設之間的通信靠什么,總線?YES,雖然不是每一個系統中都要有總線,但凡大一點的系統都會有總線,因為總線能夠很好的銜接管理各個外設與CPU之間的通信,能夠簡化硬件電路設計和系統結構。所以,廢話了這么多,你該領悟總線很重要了吧。 光說重要你肯定感覺不過癮,要打破沙鍋問到底,總線到底如何工作?如何連接CPU和外設? 廣義上來說,任何銜接多個外設甚至是多個相同外設的一組信號都可以稱為“總線”,比如CAN總線、USB總線、IIC總線等等。但在這里所論述的總線,主要是針對CPU與外設之間的總線。在嵌入式系統應用中,最簡單也許大家都接觸過的有INTEL總線和MOTOROLA總線。這兩類總線最初應用于INTEL和MOTOROLA 兩家公司生產的處理器,最為典型的是早期的PC系列處理器如INTEL的8086和MOTOROLA的MC6800,以至于后來的很多單片機乃至外設芯片的并口通信都能夠兼容這兩種模式的總線。為了更好的理解總線的概念,不妨讓我們看看這兩種總線的工作機制。如圖6.4和圖6.5所示,是一顆支持與單片機的INTEL和MOROROLA接口連接的芯片的讀寫時序圖。習慣上,大家一談到8080總線就認定是INTEL總線,6800總線也就是MOTOROLA總線。從這兩個時序圖上,我們看到的區別恐怕主要是讀寫選通的區別。INTEL總線分別使用讀選通信號RD#和寫選通信號WR#兩個信號的低電平狀態來表示當前處于讀或寫選通狀態。而MOTOROLA總線則只使用一條RW#信號來表示當前的讀寫狀態,當總線選通期間,若RW#為高電平則表示讀狀態,低電平則為寫狀態。除此以外,規范的INTEL總線和MOTOROLA總線在地址和數據總線的使用上也是有所區別的。 另外,我們需要從這兩個時序圖中看到一個基本的“總線雛形”。也就是說,一條規范的總線,無外乎控制信號(有時候我們也習慣的稱之為控制總線,但是此總線非彼總線,大家注意區分)、地址信號、數據信號這三類信號組成。如INTEL總線的控制信號主要有片選信號CS#、寫選通信號WR#、讀選通RD#和地址/數據選擇信號RS,他們的功能就是用于指示當前的總線處于怎樣的狀態——是正在讀取數據、正在寫入數據、正在寫入地址還是閑置中。他們的地址信號和數據信號是復用(很多總線的地址和數據信號不是復用的,如Avalon總線就是分離的)的,即時序圖中的DB[15:0]。在一次讀寫操作中,如果RS為高電平,則表示當前操作為命令的讀或寫;如果RS低高電平,則表示當前操作為數據的讀或寫。
圖6.4 INTEL總線時序圖
圖6.5 MOTOROLA總線時序圖 INTEL總線和MOTOROLA總線在嵌入式系統中仍大行其道,甚至于隨處可見,不信你可以隨便download個芯片的datasheet看看。對我們的學習而言,認識一條總線的目的不在于領會總線本身的工作機制而已,尤其是要成為一名FPGA工程師,我們常常要和底層的硬件打交道。因此,我們學習的最終目的是學以致用。在筆者所著的《深入淺出玩轉FPGA》筆記8的“單向控制信號檢測”小節里就講述了一種用FPGA邏輯來設計INTEL/MOTOROLA總線的從機。 其實上面提到的INTEL總線和MOTOROLA總線是CPU和外設數據交互的一種方式,在硬件工程師的板級設計中看得到固定信號連接的通信方式。而在我們后面將要重點討論的這種CPU與外設的互連總線卻是硬件工程師在PCB板上看不到的。也就是說,我們這里的外設不在“外”而在“內”,這些外設是集成在CPU內部的,而CPU內部的總線互連架構是板級設計的工程師們無法直觀看到的。但是作為Qsys系統架構的工程師,我們就必須深入的研究這些互聯總線的工作機理。畢竟,完全DIY出來的Qsys硬件系統中所有的組件都是我們根據系統需求精挑細選出來的,那么他們之間的銜接和數據交換也必須是我們能夠去“設計”的一部分。 先不討論在Altera的Qsys平臺主流的Avalon總線,我們可以去研究一下ARM7系統中常見的內部系統總線是什么樣的。如圖6.6所示,這是NXP公司推出的一款內嵌ARM7TDMI-S內核的控制器內部功能框圖。
圖6.6 ARM芯片內部功能框圖 在這個框圖里,我們不是很關心它都集成了哪些外設,而是要看看它的處理器內核與其他外設以及外設與外設之間是如何互連的。簡單的看,從內核引出的兩條總線分別是Local bus和Advanced high-performance bus(AHB),Local bus即本地總線上掛靠的都是一些實時性要求最高、數據吞吐量最大的“外設”。毫無疑問,在一個系統中,這種實時性最高、數據吞吐量最大的“外設”非存儲器莫屬,因為程序運行、數據變量讀寫都要頻繁的訪問ROM或RAM。除此之外,我們也看到有一個高速GPIO模塊也“運行”在這條“高速公路”上,該款芯片特別的增強了GPIO的性能,那一定是為滿足一些特定的應用需求而設計的。除了存儲器,其實這條高速總線是可以掛靠任何符合總線通信規范的外設組件的,但是一旦這條“高速公路”的“車”多了,就不可避免的發生擁堵,那么所謂“高速”就名不副其實了。 那怎么辦,系統還有一大堆外設需要掛靠呢?不是還有一條AHB總線嗎,這也是一條高性能總線,雖然可能和本地總線比還是要差點。這條總線上掛著一個中斷向量控制器(VECTORED INTERRUPT CONTROLLER)和一個橋(AHB TO APB BRIDGE)。無疑的,系統的中斷需要第一時間得到響應,因此它也就被掛在離處理器內核最近的總線上。最后來看那個AHB2APB橋,我們知道一般的嵌入式外設速度都不高,因此在這個系統內部,就把所有余下的外設組件都掛在了一條叫做APB的總線上,而這條APB總線最終也是需要掛在與CPU直接相連的AHB總線上。那么,AHB2APB橋所做的就是連接APB總線和AHB總線,并且它還要像CPU本身一樣作為APB總線的主機,來統管各個外設。 費了這么些篇幅,好歹我們講到CPU內部的片上總線了。除了ARM7上流行的AMBA總線外,還有Silicore的WISHBONE總線(很多開源設計都采用此總線)、IBM的CoreConnect總線,然后就是Altera的Avalon總線。不同總線各有特點,適用范圍也有不同。Avalon總線就是Altera公司主推的應用于其軟核處理器NIOS II上的總線,主要包括Avalon-MM總線和Avalon-ST總線,下面我們就去認識他們。 基于NIOS II處理器的片內系統互連主要靠的就是Avalon-MM總線和Avalon-ST總線。如圖6.7所示,一個典型的NIOS II系統,NIOS II處理器和各外設之間通過Avalon-MM總線進行交互,而外設之間的點到點數據傳輸則可以通過Avalon-ST總線來完成。Avalon-MM (Avalon Memory Mapped Interface)總線是一種基于地址讀寫的主從互連的機制。Avalon-ST(Avalon Streaming Interface)總線主要應用于單向數據流傳輸,可以完成點到點的大數據量吞吐。另外也略帶提一下,在Avalon總線規范里,還有Avalon-MM Tristate和Conduit接口。前者主要是Avalon-MM的一個擴展,也可以理解為它是Avalon-MM的一個“集線器”,對一個Avalon-MM從機進行復用,這樣做的好處是減少從機接口的數量,用一套總線信號就可以掛接多個從機。比如在接口信號的數量緊張時,尤其是連接到FPGA外部引腳上的多個存儲器(如圖中的SRAM和FLASH),此時就可以復用到一個Avalon-MM Tristate接口上。而Conduit接口則是Avalon-MM從機引出的可以連接到FPGA其它邏輯模塊或是FPGA外部引腳上的信號接口。
圖6.7 典型NIOS II系統 |