<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 汽車電子 > 設(shè)計應(yīng)用 > 基于FPGA的八位RISC CPU的設(shè)計

          基于FPGA的八位RISC CPU的設(shè)計

          ——
          作者:張杰 時間:2007-07-30 來源:微計算機信息 收藏
              1  引 言

            隨著數(shù)字通信和工業(yè)控制領(lǐng)域的高速發(fā)展,要求專用集成電路(ASIC)的功能越來越強,功耗越來越低,生產(chǎn)周期越來越短,這些都對芯片設(shè)計提出了巨大的挑戰(zhàn),傳統(tǒng)的芯片設(shè)計方法已經(jīng)不能適應(yīng)復(fù)雜的應(yīng)用需求了。SoC(System on a Chip)以其高集成度,低功耗等優(yōu)點越來越受歡迎。開發(fā)人員不必從單個邏輯門開始去設(shè)計ASIC,而是應(yīng)用己有IC芯片的功能模塊,稱為核(core),或知識產(chǎn)權(quán)(IP)宏單元進行快速設(shè)計,效率大為提高。 的IP核是SoC技術(shù)的核心,開發(fā)出具有自主知識產(chǎn)權(quán)的 IP核對我國在電子技術(shù)方面跟上世界先進的步伐,提高信息產(chǎn)業(yè)在世界上的核心竟爭力有重大意義。

            精簡指令集計算機(Reduced Instruction Set Computer)是針對復(fù)雜指令集計算機CISC(Complex Instruction Set Computer)提出的,具備如下特征1)一個有限的簡單的指令集; 2)強調(diào)寄存器的使用或配備大量的能用的寄存器;3)強調(diào)對指令流水線的使用。

            2  CPU IP核的組成

             盡管各種CPU的性能指標和結(jié)構(gòu)細節(jié)不同,但所要完成的基本功能相同,從整體上可分為八個基本的部件:時鐘發(fā)生器、指令寄存器、累加器、 CPU算術(shù)邏輯運算單元、數(shù)據(jù)控制器、狀態(tài)控制器、程序控制器、程序計數(shù)器、地址多路器。狀態(tài)控制器負責(zé)控制每一個部件之間的相互操作關(guān)系,具體的結(jié)構(gòu)和邏輯關(guān)系如圖1所示。

            時鐘發(fā)生器利用外部時鐘信號,經(jīng)過分頻生成一系列時鐘信號給CPU中的各個部件使用。為了保證分頻后信號的跳變性能,在設(shè)計中采用了同步狀態(tài)機的方法。

            指令寄存器在觸發(fā)時鐘clk1的正跳變觸發(fā)下,將數(shù)據(jù)總線送來的指令存入寄存器中。數(shù)據(jù)總線分時復(fù)用傳遞數(shù)據(jù)和指令,由狀態(tài)控制器的load_ir信號負責(zé)判別。load_ir信號通過使能信號ena口線輸入到指令寄存器。復(fù)位后,指令寄存器被清為零。每條指令為兩個字節(jié)16位,高3位是操作碼,低13位是地址線。CPU的地址總線為是13位,位尋址空間為8K 字節(jié)。本設(shè)計的數(shù)據(jù)總線是8位,每條指令取兩次,每次由變量state控制。

            累加器用于存放當前的運算結(jié)果,是雙目運算中的一個數(shù)據(jù)來源。復(fù)位后,累加器的值為零。當累加器通過使能信號ena 口線收到來自CPU狀態(tài)控制器load_acc 信號后,在clk1時鐘正跳沿時就接收來自數(shù)據(jù)總線的數(shù)據(jù)。

           CPU結(jié)構(gòu)圖

            圖1  CPU結(jié)構(gòu)圖                

            算術(shù)邏輯運算單元根據(jù)輸入的不同的操作碼分別實現(xiàn)相應(yīng)的加、與、異或、跳轉(zhuǎn)等基本運算。

            數(shù)據(jù)控制器其作用是控制累加器的數(shù)據(jù)輸出,由于數(shù)據(jù)總線是各種操作傳送數(shù)據(jù)的公共通道,分時復(fù)用,有時傳輸指令,有時要傳送數(shù)據(jù)。其余時候,數(shù)據(jù)總線應(yīng)呈高阻態(tài),以允許其他部件使用。所以,任何部件向總線上輸出數(shù)據(jù)時,都需要一個控制信號的,而此控制信號的啟、停則由CPU狀態(tài)控制器輸出的各信號控制決定。控制信號datactl_ena決定何時輸出累加器中的數(shù)據(jù)。

            地址多路器用于輸出的地址是PC(程序計數(shù)器)地址還是數(shù)據(jù)/端口地址。每個指令周期的前4個時鐘周期用于從ROM中讀取指令,輸出的應(yīng)是PC地址,后4個時鐘周期用于對RAM或端口的讀寫,該地址由指令給出,地址的選擇輸出信號由時鐘信號的8分頻信號fecth提供。

            程序計數(shù)器用于提供指令地址,以便讀取指令,指令按地址順序存放在存儲器中,有兩種途徑可形成指令地址,一是順序執(zhí)行程序的情況,二是執(zhí)行JMP指令后,獲得新的指令地址。

            狀態(tài)機控制器接受復(fù)位信號RST,當RST有效時,能通過信號ena使其為0 ,輸入到狀態(tài)機中以停止狀態(tài)機的工作。狀態(tài)機是CPU 的控制核心,用于產(chǎn)生一系列的控制信號,啟動或停止某些部件,CPU何時進行讀指令來讀寫I/O端口及RAM區(qū)等操作,都是由狀態(tài)機來控制的。狀態(tài)機的當前狀態(tài),由變量state記錄,state的值就是當前這個指令周期中已經(jīng)過的時鐘數(shù)。指令周期是由8 個時鐘組成,每個時鐘都要完成固定的操作。

            3  系統(tǒng)時序

             CPU的復(fù)位和啟動操作是通過rst引腳的信號觸發(fā)執(zhí)行的,當rst信號一進入高電平,RISC CPU就會結(jié)束現(xiàn)行操作,并且只要rst停留在高電平狀態(tài),CPU就維持在復(fù)位狀態(tài),CPU各狀態(tài)寄存器都設(shè)為無效狀態(tài)。當信號rst回到低電平,接著到來的第一個fetch 上升沿將啟動RISC CPU開始工作,從ROM的000處的開始讀取指令并

          執(zhí)行相應(yīng)的操作。

            讀指令時序,每個指令的前3個時鐘周期用于讀指令,4~6周期讀信號rd有效,第7 個周期讀信號無效,第8個周期地址總線輸出PC地址,為下一個指令作準備。

            寫指令時序,每個指令的第3.5個時鐘周期建立寫地址,第四個周期輸出數(shù)據(jù),第5個時鐘周期輸出寫信號,第6個時鐘結(jié)束,第7.5個時鐘周期輸出為PC地址,為下個指令做準備。

            如圖2 所示,這是ModelSim SE6.0進行波形仿真的結(jié)果。

            4  微處理器指令

            數(shù)據(jù)處理指令:數(shù)據(jù)處理指令完成寄存器中數(shù)據(jù)的算術(shù)和邏輯操作,其他指令只是傳送數(shù)據(jù)和控制程序執(zhí)行的順序.因此,數(shù)據(jù)處理指令是唯一可以修改數(shù)據(jù)值的指令,數(shù)據(jù)處理指令一般需兩個源操作數(shù),產(chǎn)生單個結(jié)果.所有的操作數(shù)都是8位寬,或者來自寄存器,或者來自指令中定義的立即數(shù).每一個源操作數(shù)寄存器和結(jié)果寄存器都在指令中獨立的指定。

           讀寫指令時序

            圖2  讀寫指令時序

            數(shù)據(jù)傳送和控制轉(zhuǎn)移類指令:共有17條,不包括按布爾變量控制程序轉(zhuǎn)移的指令。其中有全存儲空間的長調(diào)用、長轉(zhuǎn)移和按2KB分塊的程序空間內(nèi)的絕對調(diào)用和絕對轉(zhuǎn)移;全空間的長度相對

          轉(zhuǎn)移及一頁范圍內(nèi)的短相對轉(zhuǎn)移;還有條件轉(zhuǎn)移指令。這類指令用到的助記符有ACALL, AJMP, LCALL, LJMP, SJMP, M, JZ, JNZ, ONE,DJNZ??刂妻D(zhuǎn)移類指令主要用來修改1x指針從而達到對程序流的控制,所用到的寄存器主要有sp, pc, ir等寄存器。

            指令由操作碼和操作數(shù)組成,取指令電路的目的就是把指令碼和操作數(shù)分開。組成電路由如圖3所示。取指令電路由程序指針,程序指針解析模塊、ROM, IR(指令寄存器),控制器狀態(tài)寄存器組成。取指令指令的過程如下:PC指針的值經(jīng)過pc_mux模塊賦值,把ROM中的指令取出來,送到指令寄存器的數(shù)據(jù)輸入口。指令寄存器受狀態(tài)寄存器的控制,當取指令信號有效時,ROM中的指令碼被保存在指令寄存器中,然后經(jīng)控制器譯碼,產(chǎn)生控制信號,對PC指針的增量加以控制取出下一條指令。

          取指令電路

            圖3 取指令電路

              5  匯編

            匯編程序是為了調(diào)試軟核而開發(fā)的,手工編寫機器碼很容易出錯并且工作量很大。在調(diào)試過程中修改指令集時,匯編程序也要作相應(yīng)的修改。所以要求編譯器的結(jié)構(gòu)簡單性能可靠,在程序中必要的地方可以用堆疊代碼方法實現(xiàn),不必考慮編程技巧和匯編器效率問題。匯編程序用于測試RISC CPU的基本指令集,如果CPU的各條指令執(zhí)行正確,停止在HLT指令處。如果程序在其它地址暫停運行,則有一個指令出錯。程序中,@符號后的十六進制表示存儲器的地址,每行的//后表示注釋。下面是一小段程序代碼,編譯好的匯編機器代碼裝入虛擬ROM,要參加運算的數(shù)據(jù)裝入虛擬RAM就可以開始進行仿真。

            機器碼                地址             匯編助記符                    注釋

            @00  //地址聲明

            101_11000       //00           BEGIN: LDA DATA_2

            0000_0001      

            011_11000       //02           AND DATA_3

            0000_0010

            100_11000       //04            XOR DATA_2

            0000_0001        001_00000       //06            SKZ

            0000_0000      

            000_00000       //08            HLT                           //AND does't work

            6  調(diào)試

            最基本的調(diào)試手段 是基于 廠商提供的開發(fā)和仿真環(huán)境,用硬件描述語言編寫TESTBENCH,構(gòu)成一個最小運行環(huán)境。TESTBENCH產(chǎn)生對目標軟核的激勵,同時記錄軟核的輸出,和預(yù)期值進行比對,可以確定核的設(shè)計錯誤。這種方法的好處是實現(xiàn)容易,結(jié)果準確,但硬件描述語言編碼量較大。為了仿真結(jié)果的準確性,無論功能仿真還是時序仿真,仿真的步長都不能太小,結(jié)果導(dǎo)致整個系統(tǒng)仿真時間太長。本設(shè)計中先對RISC CPU的各個子模塊進行了分別綜合,檢查正確性,如果發(fā)現(xiàn)錯誤可以在較小的范圍內(nèi)來檢查并驗證。子模塊綜合完畢后,把要綜合的RISC CPU的模塊與外圍器件以及測試模塊分離出來組成一個大模塊,綜合后的的RISC CPU模塊如圖4所示,這是Xilinx ISE7.1 所綜合生成的技術(shù)原理圖。

            綜合的結(jié)果只是通用的門級網(wǎng)表,只是一些與、或、非門的邏輯關(guān)系,和芯片實際的配置情況還有差距。此時應(yīng)該使用/CPLD廠商提供的實現(xiàn)與布局布線工具,根據(jù)所選芯片的型號,進行芯片內(nèi)部功能單元的實際連接與映射。這種實現(xiàn)與布局布線工具一般要選用所選器件的生產(chǎn)商開發(fā)的工具,因為只有生產(chǎn)者最了解器件內(nèi)部的結(jié)構(gòu),如在ISE的集成環(huán)境中完成實現(xiàn)與布局布線的工具是Flow Engine。
          CPU技術(shù)原理圖
            圖4  CPU技術(shù)原理圖

            STA(Static Timing Analysis)靜態(tài)時序分析,完成設(shè)計時必須的一個步驟。在FPGA加約束、綜合、布局布線后,在ISE中可以運行Timing Analyzer生成詳細的時序報告,本設(shè)計中Minimum period: 12.032ns (Maximum Frequency: 83.112MHz),Minimum input arrival time before clock: 6.479ns,Maximum output required time after clock: 9.767ns。然后,設(shè)計人員檢查時序報告,根據(jù)工具的提示找出不滿足Setup/Hold time的路徑,以及不符合約束的路徑,進行修改保證數(shù)據(jù)能被正確的采樣。在后仿真中將布局布線的時延反標到設(shè)計中去,使仿真既包含門延時,又包含線延時信息。這種后仿真是最準確的仿真,能真實地反映芯片的實際工作情況。

            7   結(jié) 論

            復(fù)雜的RISC CPU設(shè)計是一個從抽象到具體的過程,本文根據(jù)FPGA的結(jié)構(gòu)特點,圍繞在FPGA上設(shè)計實現(xiàn)八位微處理器軟核設(shè)計方法進行探討,研究了片上系統(tǒng)的設(shè)計方法和設(shè)計復(fù)用技術(shù),并給出了指令集和其調(diào)試方法,提出了一種基于FPGA的微處理器的IP的設(shè)計方法。本文作者創(chuàng)新點是:根據(jù)Spartan II 的內(nèi)部結(jié)構(gòu),在編碼階段實現(xiàn)了地址和數(shù)據(jù)的優(yōu)化,實現(xiàn)階段對內(nèi)部布局布線進行重新配置,設(shè)計實現(xiàn)的微處理器僅占用78個slices,1個Block RAM,在10萬門的芯片實現(xiàn),占用6%的資源。

          參考文獻:

            [1] 夏宇聞.Verilog數(shù)字系統(tǒng)設(shè)計教程[M].北京: 北京航空航天大學(xué)出版社,2003. [2] 袁俊泉 孫敏琪 曹瑞 Verilog數(shù)字系統(tǒng)設(shè)計教程[M].西安: 西安電子科技大學(xué)出版社,2002.

            [3] J.Bhasjer 著 孫海平 等譯 Verilog HDL綜合實用教程[M].北京: 清華大學(xué)出版社,2004.

            [4] 楊厚俊 張公敬 張昆藏 編著  計算機系統(tǒng)結(jié)構(gòu)---奔騰PC[M].北京: 科學(xué)出版社,2004.

            [5] 馮海濤 王永綱 石江濤 顏天信 王硯方. 基于FPGA的32位整數(shù)微處理器的設(shè)計與實現(xiàn)[J]. 小型微型計算機系統(tǒng), 2005, 26(6): 1113-1117.

            [6] 王喆.八位CPU IP核的研究與設(shè)計[D].大連:大連理工大學(xué),2005

            [7] http://www.xilinx-china.com/

            [8] 袁本榮 劉萬春 賈云得 朱玉文 用Verilog HDL進行FPGA設(shè)計的一些基本方法[J].微計算機信息,2004,20(6):93-95

          fpga相關(guān)文章:fpga是什么




          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();