2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  摘 要</b></p><p>  MCS-51單片機是在一塊芯片中集成了CPU、RAM、ROM、定時器/計數(shù)器和多功能I/O等一臺計算機所需要的基本功能部件,是業(yè)界廣泛使用的單片機系列。基于FPGA平臺的8051單片機CPU核與傳統(tǒng)MCS-51單片機完全兼容,但速度約為傳統(tǒng)單片機的 20倍,且在FPGA內(nèi)可輕松的集成許多高性能系統(tǒng)功能,這將使系統(tǒng)的設計效率和

2、系統(tǒng)性能獲得極大的提高,這也是現(xiàn)代電子設計技術的發(fā)展方向。本課題用硬件描述語言設計MCS-51 CPU核,從CPU的總體結構到局部功能的實現(xiàn)采用了自頂向下的設計方法和模塊化的設計思想,利用FPGA,設計實現(xiàn)了八位CPU核。本設計的CPU兼容51指令,在時鐘頻率和指令的執(zhí)行效率指標上均優(yōu)于傳統(tǒng)的MCS-51CPU。本設計以硬件描述語言代碼形式存在,可與任何綜合庫、工藝庫以及FPGA結合開發(fā)出用戶需要的固核和硬核,可讀性好,易于擴展使用,易

3、于升級,比較有實用價值。本設計通過FPGA驗證。</p><p>  關鍵字:Verilog HDL; CPU; FPGA</p><p><b>  ABSTRACT</b></p><p>  MCS-51 MCU is a single chip integrated CPU, RAM, ROM, timer / counters

4、 and multi-function I / O such as a computer's basic features required, is the industry's widely used microcontroller series. 8051 FPGA-based CPU platform with the traditional core is fully compatible with MCS-51

5、 microcontroller, but the speed is about 20 times that of traditional single chip, and the FPGA can be easily integrated within a number of high-performance system functions, which will enable the design of the system &l

6、t;/p><p>  Keywords: Verilog HDL ; CPU ; FPGA</p><p><b>  目 錄</b></p><p><b>  摘 要</b></p><p><b>  Abstract</b></p><p>

7、;  第1章 緒論...1</p><p>  1.1選題背景……………………………………………………………………………………1</p><p>  1.2國內(nèi)外發(fā)展及現(xiàn)狀…………………………………………………………………………1</p><p>  1.3課題的主要內(nèi)容……………………………………………………………………………2</p><p

8、>  第2章CPU的結構及設計…………………………………………………………..4</p><p>  2.1 CPU的簡介…………………………………………………………………………………4</p><p>  2.2 CPU的結構…………………………………………………………………………………4</p><p>  2.2.1 時鐘發(fā)生器…………………………………

9、………………………………………..4 2.2.2 指令寄存器…………………………………………………………………………..5</p><p>  2.2.3 累加器………………………………………………………………………………..6</p><p>  2.2.4 算術運算器…………………………………………………………………………..6</p><p>  2.2.5

10、數(shù)據(jù)控制器…………………………………………………………………………..7</p><p>  2.2.6 地址多路器……………………………………………………………………………8</p><p>  2.2.7程序計數(shù)器……………………………………………………………………………8</p><p>  2.2.8 狀態(tài)控制器……………………………………………………………

11、……………..9</p><p>  2.2.9 外圍模塊…………………………………………………………………………….11</p><p>  第3章 CPU的功能………………………………………………………………….13</p><p>  3.1 CPU的操作………………………………………………………………………………….13</p><p&g

12、t;  3.1.1 系統(tǒng)的復位和啟動操作……………………………………………………………..13</p><p>  3.1.2 總線讀操作…………………………………………………………………………..13</p><p>  3.1.3 總線寫操作……………………………………………………………………………13</p><p>  3.2 CPU的尋址方式和指令集………

13、………………………………………………………… 14</p><p>  3.3 匯編…………………………………………………………………………………………14</p><p>  第4章 CPU的仿真和驗證…………………………………………………………...16</p><p>  4.1 CPU模塊的仿真…………………………………………………………………………… 16

14、</p><p>  4.2 CPU模塊的綜合…………………………………………………………………………… 18</p><p>  4.3 CPU模塊的優(yōu)化和優(yōu)局布線……………………………………………………………… 25</p><p>  第5章 總結和展望…………………………………………………………………...27</p><p>  參

15、考文獻……………………………………………………………………………..28</p><p>  致 謝…………………………………………………………………………………29</p><p><b>  第1章 緒論</b></p><p><b>  1.1選題背景</b></p><p>  單片機自

16、從被推出后開始迅速發(fā)展,應用領域也在不斷擴大,現(xiàn)己成為微型計算機的重要分支,單片機處理數(shù)據(jù)的能力在不斷提高,速度也越來越快,長期以來被廣泛的應用在各領域。 同時隨著集成電路和計算機技術的飛速發(fā)展,電子設計自動化(EDA)以計算機的硬件和軟件為基本的工作平臺,已經(jīng)發(fā)展成為可以代 替設計者完成電子系統(tǒng)設計的重要工具。其中FPGA是一種新興的可編程邏輯器件(PLD),與其它可編程邏輯器件(PLD)相比,具有更高的密度、更快的工作速度和更大的編

17、程靈活性。FPGA是一種新興的可編程邏輯器件,可以取代現(xiàn)有的全部微機接口芯片,實現(xiàn)微機系統(tǒng)中的存儲器、地址譯碼等多種功能,具有更高的密度、更快的工作速度和更大的編程靈活性,被廣泛應用于各種電子類產(chǎn)品中。單片機具有性能價格比高、功能靈活、易于人機對話、良好的數(shù)據(jù)處理能力特點;FPGA則具有高速、高可靠以及開發(fā)便捷、規(guī)范等優(yōu)點。以此兩類器件相結合的電路結構會有很多的發(fā)展空間。</p><p>  基于FPGA的高密度

18、、高速度、現(xiàn)場可編程的能力和單片機強大的數(shù)據(jù)處理功能設計的CPU采用了與傳統(tǒng)單片機不同的實現(xiàn)架構,利用FPGA的邊沿觸發(fā)的特點,單周期單指令,因而無論在時鐘頻率還是在匯編指令的執(zhí)行效率上都明顯優(yōu)于傳統(tǒng)的MCS-51單片機。這個設計的擴展接口控制器部分很好地擴充了傳統(tǒng)單片機的功能,而且由于具有 較好的可移植性,可以只利用擴展接口控制器部分實現(xiàn)對現(xiàn)有的單片機進行升級,節(jié)約更換高性能CPU而帶來的產(chǎn)品提升,達到適應新的要求。目前以硬件描述語言

19、所完成的電路設計,可以經(jīng)過簡單的綜合與布局,快速的燒錄至 FPGA 上進行測試,是現(xiàn)代 IC 設計驗證的技術主流。</p><p>  1.2國內(nèi)外發(fā)展及現(xiàn)狀</p><p>  微控制器簡稱MCU,又稱單片機,是指將計算機的CPU、RAM、ROM、定時計數(shù)器和多種I/O接口集 成在一塊芯片上,形成芯片級的計算機。單片機的出現(xiàn)的初衷是面向工業(yè)控制,目前它己經(jīng)廣泛應用于各個領域及各個行業(yè)。

20、</p><p>  1976年Intel公司推出低檔8位單片機 (MCS-48系列)。在1980年Intel公司推出了 比MCS-48系列性能更為優(yōu)越的8位單片機8051(MCS-51系列)。1983年Intel公司又推 出了CMOS型80C51、16位單片機5096(MCS-96系列)。眾多公司先后推出了32位單片機、 64位單片機。盡管單片機的設計技術在不斷的發(fā)展,處理能力越來越強,從4位到8位,再到16位

21、、32位,甚至出現(xiàn)了64位,但有一個現(xiàn)象卻十分有趣,8位單片機在經(jīng)歷了 三十多年之后,依然顯示出強大而旺盛的生命力,其市場占有率一直高居榜首。與從8位機迅速向16位、32位、64位過渡的通用計算機相比,8位微控制器從20 世紀70年代初期誕生至今,雖歷經(jīng)從單片微型計算機到微控制器、單片機和SoC的變遷, 8位機始終是嵌入式低端應用的主要機型,而且在未來相當長的時間里,仍會保持這個勢頭。這是因為嵌入式系統(tǒng)和通用計算機系統(tǒng)有完全不同的應用特

22、性,從而走向完全不同的技術發(fā)展道路。在8位單片機能基本滿足其響應速度要求后,數(shù)據(jù)寬度不是技術發(fā)展的主要矛盾。因此8位微控制器會穩(wěn)定下來,其技術發(fā)展方向轉為最大限度地滿</p><p>  現(xiàn)今市場上流行的典型的8位微控制器,與傳統(tǒng)的8位單片機相比,大多數(shù)是由VerilogHDL實現(xiàn)的軟處理器IP Core,可以在各種FPGA上實現(xiàn),設計靈活方便而且易于進行功能擴展。因此,這些單片機將在基于可編程邏輯的應用領域中發(fā)

23、揮積極的作用。各大單片機廠家都推出了自己的8位單片機內(nèi)核,如飛思卡爾的RS08內(nèi)核、NEC的78K0、Actel的Corc8051、Mkcrochip的PIC內(nèi)核等。因此研究8位單片機內(nèi)核具有廣泛的現(xiàn)實意義。由于其具有較高的處理性能和較少的資源占用,故具有更加廣泛的應用前景。 </p><p>  1.3課題的工作內(nèi)容 </p><p>  本次畢業(yè)設計主要是對MCS-51單片機 進行研究

24、。用硬件描述語言設計MCS-51 CPU核,對于CPU核的結構進行深入了解和認知,討論并設計CPU的運算邏輯單元、取址模塊、譯碼執(zhí)行模塊,確定正確的方案。對于硬件描述語言和相關仿真軟件進行討論確定,并調(diào)試代碼,仿真通過。以MCS-51系列單片機的指令集為藍本,利用原理框圖和硬件描述語言的輸入方式完成實現(xiàn)了處理器的各種功能。在 ASIC或者FPGA 上進行測試,完成所需要的邏輯功能。課題工作內(nèi)容如下,共分為以下幾步:</p>

25、<p>  (1)確定CPU的總體結構,劃分與定義各個層次模塊的結構和功能。根據(jù)設計的需要設計CPU體系架構形式,并選取與MCS-51兼容的指令集作為設計的指令集。 </p><p>  (2)研究MCS-51CPU的硬件架構及所有指令的工作過程,深入理解工作 原理和設計方法,完成各個層次模塊功能的劃分與定義。</p><p>  (3)使用硬件描述語言對CPU核進行具體的描述

26、,書寫代碼。</p><p>  (4) 調(diào)試代碼,仿真通過。搭建測試平臺,對設計完成的CPU進行完備的功能測試。 </p><p>  (5) 對通過功能測試的進行優(yōu)化、布局布線,進行硬件驗證。</p><p>  第2章 CPU的結構及設計</p><p>  2.1 CPU的簡介</p><p>  CPU是一個

27、復雜的數(shù)字邏輯電路,包含八個基本部件:</p><p><b>  1)時鐘發(fā)生器</b></p><p><b>  2)指令寄存器</b></p><p><b>  3)累加器</b></p><p>  4)算術邏輯運算單元</p><p&g

28、t;<b>  5)數(shù)據(jù)控制器</b></p><p><b>  6)狀態(tài)控制器</b></p><p><b>  7)程序計數(shù)器</b></p><p><b>  8)地址多路器</b></p><p>  各部件的具體結構和邏輯關系在下面

29、的小節(jié)里逐一進行介紹。</p><p>  2.2 CPU的結構</p><p>  2.2.1 時鐘發(fā)生器</p><p>  圖2-1 時鐘發(fā)生器</p><p>  時鐘發(fā)生器 clkgen (如圖2-1所示)利用外來時鐘信號clk 來生成一系列時鐘信號clk1、fetch、alu_clk 送往CPU的其他部件。其中fetch是外來時

30、鐘 clk 的八分頻信號。利用fetch的上升沿來觸發(fā)CPU控制器開始執(zhí)行一條指令,同時fetch信號還將控制地址多路器輸出指令地址和數(shù)據(jù)地址。clk1信號用作指令寄存器、累加器、狀態(tài)控制器的時鐘信號。alu_clk 則用于觸發(fā)算術邏輯運算單元。</p><p>  時鐘發(fā)生器clkgen的波形見下圖 2-2所示:</p><p>  其Verilog HDL程序見下面的模塊:</p

31、><p>  2.2.2 指令寄存器</p><p>  圖2-3 指令寄存器</p><p>  指令寄存器如圖2-3所示,主要用于寄存指令。</p><p>  指令寄存器的觸發(fā)時鐘是clk1,在clk1的正沿觸發(fā)下,寄存器將數(shù)據(jù)總線送來的指令存入高8位或低8位寄存器中。但并不是每個clk1的上升沿都寄存數(shù)據(jù)總線的數(shù)據(jù),因為數(shù)據(jù)總線上有時

32、傳輸指令,有時傳輸數(shù)據(jù)。什么時候寄存,什么時候不寄存由CPU狀態(tài)控制器的load_ir信號控制。load_ir信號通過ena 口輸入到指令寄存器。復位后,指令寄存器被清為零。</p><p>  每條指令為2個字節(jié),即16位。高3位是操作碼,低13位是地址。(CPU的地址總線為13位,尋址空間為8K字節(jié)。)本設計的數(shù)據(jù)總線為8位,所以每條指令需取兩次。先取高8位,后取低8位。而當前取的是高8位還是低8位,由變量s

33、tate記錄。state為零表示取的高8位,存入高8位寄存器,同時將變量state置為1。下次再寄存時,由于state為1,可知取的是低8位,存入低8位寄存器中。</p><p><b>  2.2.3 累加器</b></p><p>  圖2-4 累加器</p><p>  累加器如圖2-4所示,用于存放當前的結果,它也是雙目運算其中一個

34、數(shù)據(jù)來源。復位后,累加器的值是零。當累加器通過ena口收到來自CPU狀態(tài)控制器load_acc信號時,在clk1時鐘正跳沿時就收到來自于數(shù)據(jù)總線的數(shù)據(jù)。</p><p>  2.2.4 算術運算器</p><p>  圖2-5 算術運算器</p><p>  算術邏輯運算單元(如圖2-5所示) 根據(jù)輸入的8種不同操作碼分別實現(xiàn)相應的加、與、異或、跳轉等8種基本操作

35、運算。利用這幾種基本運算可以實現(xiàn)很多種其它運算以及邏輯判斷等操作。</p><p>  2.2.5 數(shù)據(jù)控制器</p><p>  圖2-6 數(shù)據(jù)控制器</p><p>  數(shù)據(jù)控制器如圖2-6,它的作用是控制累加器數(shù)據(jù)輸出,由于數(shù)據(jù)總線是各種操作時傳送數(shù)據(jù)的公共通道,不同的情況下傳送不同的內(nèi)容。有時要傳輸指令,有時要傳送RAM區(qū)或接口的數(shù)據(jù)。累加器的數(shù)據(jù)

36、只有在需要往RAM區(qū)或端口寫時才允許輸出,否則應呈現(xiàn)高阻態(tài),以允許其它部件使用數(shù)據(jù)總線。 所以任何部件往總線上輸出數(shù)據(jù)時,都需要一控制信號。而此控制信號的啟、停,則由CPU狀態(tài)控制器輸出的各信號控制決定。數(shù)據(jù)控制器何時輸出累加器的數(shù)據(jù)則由狀態(tài)控制器輸出的控制信號datactl_ena決定。</p><p>  2.2.6 地址多路器</p><p>  圖2-7 地址多路器</p&

37、gt;<p>  地址多路器如圖2-7,它用于選擇輸出的地址是PC(程序計數(shù))地址還是數(shù)據(jù)/端口地址。每個指令周期的前4個時鐘周期用于從ROM中讀取指令,輸出的應是PC地址。后4個時鐘周期用于對RAM或端口的讀寫,該地址由指令中給出。地址的選擇輸出信號由時鐘信號的8分頻信號fetch提供。</p><p>  2.2.7 程序計數(shù)器</p><p>  圖2-8 程序計數(shù)器

38、</p><p>  程序計數(shù)器如圖2-8,它用于提供指令地址。以便讀取指令,指令按地址順序存放在存儲器中。有兩種途徑可形成指令地址:其一是順序執(zhí)行的情況,其二是遇到要改變順序執(zhí)行程序的情況,例如執(zhí)行JMP指令后,需要形成新的指令地址。下面就來詳細說明PC地址是如何建立的。</p><p>  復位后,指令指針為零,即每次CPU重新啟動將從ROM的零地址開始讀取指令并執(zhí)行。每條指令執(zhí)行完需

39、2個時鐘,這時pc_addr已被增2,指向下一條指令。(因為每條指令占兩個字節(jié)。)如果正執(zhí)行的指令是跳轉語句,這時CPU狀態(tài)控制器將會輸出load_pc信號,通過load口進入程序計數(shù)器。程序計數(shù)器(pc_addr)將裝入目標地址(ir_addr),而不是增2。</p><p>  2.2.8 狀態(tài)控制器</p><p>  圖2-9 狀態(tài)控制器</p><p>

40、  狀態(tài)控制器如圖2-9,它由兩部分組成:</p><p>  1)狀態(tài)機(上圖中的MACHINE部分)</p><p>  2)狀態(tài)控制器(上圖中的MACHINECTL部分)</p><p>  狀態(tài)機控制器接受復位信號RST,當RST有效時通過信號ena使其為0,輸入到狀態(tài)機中停止狀態(tài)機的工作。</p><p>  狀態(tài)控制器的Veril

41、ogHDL程序見下面模塊:</p><p>  //------------------------------------------------------//</p><p>  module machinectl( ena, fetch, rst);</p><p>  output ena;</p><p>  input fe

42、tch, rst;</p><p><b>  reg ena;</b></p><p>  always @(posedge fetch or posedge rst)</p><p><b>  begin</b></p><p><b>  if(rst)</b><

43、/p><p><b>  ena<=0;</b></p><p><b>  else</b></p><p><b>  ena<=1;</b></p><p><b>  end</b></p><p><b>

44、;  endmodule</b></p><p>  //------------------------------------------------------//</p><p>  狀態(tài)機是CPU的控制核心,用于產(chǎn)生一系列的控制信號,啟動或停止某些部件。CPU何時進行讀指令讀寫I/O端口,RAM區(qū)等操作,都是由狀態(tài)機來控制的。狀態(tài)機的當前狀態(tài),由變量state記錄,s

45、tate的值就是當前這個指令周期中已經(jīng)過的時鐘數(shù)(從零計起)。 </p><p>  指令周期是由8個時鐘周期組成,每個時鐘周期都要完成固定的操作。</p><p>  1)第0個時鐘,因為CPU狀態(tài)控制器的輸出:rd和load_ir為高電平,其余均為低電平。指令寄存器寄存由ROM送來的高8位指令代碼。</p><p>  2)第1個時鐘,與上一時鐘相比只是inc_

46、pc從0變?yōu)?故PC增1,ROM送來低8位指令代碼,指令寄存器寄存該8位代碼。</p><p>  3)第2個時鐘,空操作。</p><p>  4)第3個時鐘,PC增1,指向下一條指令。若操作符為HLT,則輸出信號HLT為高。如果操作符不為HLT,除了PC增一外(指向下一條指令),其它各控制線輸出為零。</p><p>  5)第4個時鐘,若操作符為AND、ADD

47、、XOR或LDA,讀相應地址的數(shù)據(jù);若為JMP,將目的地址送給程序計數(shù)器;若為STO,輸出累加器數(shù)據(jù)。</p><p>  6)第5個時鐘,若操作符為ANDD、ADD或XORR,算術運算器就進行相應的運算;若為LDA,就把數(shù)據(jù)通過算術運算器送給累加器;若為SKZ,先判斷累加器的值是否為0,如果為0,PC就增1,否則保持原值;若為JMP,鎖存目的地址;若為STO,將數(shù)據(jù)寫入地址處。</p><p

48、>  7)第6個時鐘,空操作。</p><p>  8)第7個時鐘,若操作符為SKZ且累加器值為0,則PC值再增1,跳過一條指令,否則PC無變化。</p><p>  2.2.9 外圍模塊</p><p>  為了對CPU進行測試,需要有存儲測試程序的ROM和裝載數(shù)據(jù)的RAM、地址譯碼器。</p><p><b>  (1).

49、地址譯碼器</b></p><p>  module addr_decode( addr, rom_sel, ram_sel);</p><p>  output rom_sel, ram_sel;</p><p>  input [12:0] addr;</p><p>  reg rom_sel, ram_sel;</p

50、><p>  always @( addr )</p><p><b>  begin</b></p><p>  casex(addr)</p><p>  13'b1_1xxx_xxxx_xxxx:{rom_sel,ram_sel}<=2'b01;</p><p>  13&

51、#39;b0_xxxx_xxxx_xxxx:{rom_sel,ram_sel}<=2'b10;</p><p>  13'b1_0xxx_xxxx_xxxx:{rom_sel,ram_sel}<=2'b10;</p><p>  default:{rom_sel,ram_sel}<=2'b00;</p><p>&l

52、t;b>  endcase</b></p><p><b>  end</b></p><p><b>  endmodule</b></p><p>  地址譯碼器用于產(chǎn)生選通信號,選通ROM或RAM。</p><p>  FFFFH---1800H RAM</p>

53、<p>  1800H---0000H ROM</p><p>  (2).RAM和ROM</p><p>  module ram( data, addr, ena, read, write );</p><p>  inout [7:0] data;</p><p>  input [9:0] addr;</p>

54、<p>  input ena;</p><p>  input read, write;</p><p>  reg [7:0] ram [10'h3ff:0];</p><p>  assign data = ( read && ena )? ram[addr] : 8'hzz;</p><p&g

55、t;  always @(posedge write)</p><p><b>  begin</b></p><p>  ram[addr]<=data;</p><p><b>  end</b></p><p><b>  endmodule</b></p&g

56、t;<p>  module rom( data, addr, read, ena );</p><p>  output [7:0] data;</p><p>  input [12:0] addr;</p><p>  input read, ena;</p><p>  reg [7:0] memory [13'

57、h1fff:0];</p><p>  wire [7:0] data;</p><p>  assign data= ( read && ena )? memory[addr] : 8'bzzzzzzzz;</p><p><b>  endmodule</b></p><p>  ROM用于裝

58、載測試程序,可讀不可寫。RAM用于存放數(shù)據(jù),可讀可寫。</p><p>  第3章 CPU的功能</p><p><b>  3.1 CPU操作</b></p><p>  1含U一個微機系統(tǒng)為了完成自身的功能,需要CPU執(zhí)行許多操作。以下是CPU的主要操作:</p><p> ?。?)系統(tǒng)的復位和啟動操作;</p

59、><p><b> ?。?)總線讀操作;</b></p><p><b> ?。?)總線寫操作。</b></p><p>  3.1.1 系統(tǒng)的復位和啟動操作</p><p>  CPU的復位和啟動操作是通過reset引腳的信號觸發(fā)執(zhí)行的。當reset信號一進入高電平, CPU就會結束現(xiàn)行操作,并且只要

60、reset停留在高電平狀態(tài),CPU就維持在復位狀態(tài)。在復位狀態(tài),CPU各內(nèi)部寄存器都被設為初值,全部為零。數(shù)據(jù)總線為高阻態(tài),地址總線為0000H,所有控制信號均為無效狀態(tài)。reset回到低電平后,接著到來的第一個fetch上升沿將啟動RISC_CPU開始工作,從ROM的000處開始讀取指令并執(zhí)行相應操作。</p><p>  3.1.2 總線讀操作</p><p>  每個指令周期的前0-

61、-3個時鐘周期用于讀指令,在狀態(tài)控制器一節(jié)中已詳細講述,這里就不再重復。第3.5個周期處,存儲器或端口地址就輸出到地址總線上,第4--6個時鐘周期,讀信號rd有效,數(shù)據(jù)送到數(shù)據(jù)總線上,以備累加器鎖存,或參與算術、邏輯運算。第7個時鐘周期,讀信號無效,第7.5個周期,地址總線輸出PC地址,為下一個指令做好準備。</p><p>  3.1.3總線寫操作</p><p>  每個指令周期的第3

62、.5個時鐘周期處,寫的地址就建立了,第4個時鐘周期輸出數(shù)據(jù),第5個時鐘周期輸出寫信號。至第6個時鐘結束,數(shù)據(jù)無效,第7.5時鐘地址輸出為PC地址,為下一個指令周期做好準備。</p><p>  3.2 CPU尋址方式和指令集</p><p>  CPU的指令格式如下圖3-1所示:</p><p>  圖3-1 CPU的指令格式</p><p&g

63、t;  它的指令系統(tǒng)僅由8條指令組成。</p><p>  1) HLT停機操作。該操作將空一個指令周期,即8個時鐘周期。</p><p>  2) SKZ為零跳過下一條語句。該操作先判斷當前alu中的結果是否為零,若是零就跳過下一條語句,否則繼續(xù)執(zhí)行。</p><p>  3) ADD相加。該操作將累加器中的值與地址所指的存儲器或端口的數(shù)據(jù)相加,結果仍送回累

64、加器中。</p><p>  4) AND相與。該操作將累加器的值與地址所指的存儲器或端口的數(shù)據(jù)相與,結果仍送回累加器中。</p><p>  5) XOR異或。該操作將累加器的值與指令中給出地址的數(shù)據(jù)異或,結果仍送回累加器中。</p><p>  6) LDA讀數(shù)據(jù)。該操作將指令中給出地址的數(shù)據(jù)放入累加器。</p><p>  7)

65、STO寫數(shù)據(jù)。該操作將累加器的數(shù)據(jù)放入指令中給出的地址。</p><p>  8) JMP無條件跳轉語句。該操作將跳轉至指令給出的目的地址,繼續(xù)執(zhí)行。</p><p>  CPU是8位微處理器,一律采用直接尋址方式,即數(shù)據(jù)總是放在存儲器中,尋址單元的地址由指令直接給出。這是最簡單的尋址方式。</p><p><b>  3.3匯 編</b>

66、</p><p>  匯編程序是為了調(diào)試軟核而開發(fā)的,手工編寫機器碼很容易出錯并且工作量很大。在調(diào)試過程中修改指令集時,匯編程序也要作相應的修改。所以要求編譯器的結構簡單性能可靠,在程序中必要的地方可以用堆疊代碼方法實現(xiàn),不必考慮編程技巧和匯編器效率問題。匯編程序用于測試CPU的基本指令集,如果CPU的各條指令執(zhí)行正確,停止在HLT指令處。如果程序在其它地址暫停運行,則有一個指令出錯。程序中,@符號后的十六進制表

67、示存儲器的地址,每行的//后表示注釋。下面是本文設計的一小段程序代碼,編譯好的匯編機器代碼裝入虛擬ROM,要參加運算的數(shù)據(jù)裝入虛擬RAM就可以開始進行仿真。 </p><p>  機器碼 地址 匯編助記符 注釋 @00 //地址聲明 101_11000 //00 BEGIN: LDA DATA_2 0000_0001 011_11000 //02 AND DATA_3 0000_0010 100_11

68、000 //04 XOR DATA_2 0000_0001 001_00000 //06 SKZ 0000_0000 000_00000 //08 HLT //AND does't work</p><p>  第4章CPU模塊的仿真和驗證</p><p>  4.1 CPU模塊的仿真</p><p>  為了對所設計的CPU模型進行驗證,需要把CP

69、U包裝在一個模塊下,這樣其內(nèi)部連線就隱蔽起來,從系統(tǒng)的角度看就顯得簡潔,還需要建立一些必要的外圍器件模型,例如儲存程序用的ROM模型、儲存數(shù)據(jù)用的RAM和地址譯碼器等。這些模型都可以用VerilogHDL描述,由于不需要綜合成具體的電路只要保證功能和接口信號正確就能用于仿真。也就是說,用虛擬器件來代替真實的器件對所設計的CPU模型進行驗證,檢查各條指令是否執(zhí)行正確,與外圍電路的數(shù)據(jù)交換是否正常??稍谙旅娴姆抡嬷衼泶嬲鎸嵉钠骷?,用于驗證

70、CPU模型是否能正確地運行裝入ROM和RAM的程序。在CPU的電路圖上加上這些外圍電路把有關的電路接通,見圖4-1。最核心的就是的左邊RSC模塊,對指令的譯碼和執(zhí)行都是在RSC模塊內(nèi)部完成的,而且RSC模塊還對其余三個模塊進行控制。 圖右上角是一塊有著256個字節(jié)的裝載數(shù)據(jù)的RAM,RSC有四個信號對它實現(xiàn)了讀寫操作。第一個信號就是寫使能write_ram;第二個信號就是讀使能read_ram;第三個信號是RAM的地址信號_addr_r

71、am<9..0>;最后一個就是通用數(shù)據(jù)總線data_ram<7..0>。圖右</p><p>  圖4-1 CPU總體模塊圖</p><p>  按照CPU總體模塊圖,可實現(xiàn)CPU模塊的仿真。步驟如下:首先按照表示各模塊之間連線的電路圖編制測試文件,即定義Verilog的wire變量作為連線,連接各功能模塊之間的引腳,并將輸入信號引入,輸出信號引出。如若需要,可加

72、入必要的語句顯示提示信息。例如, cpu 的測試文件就是cputop.v。其次,使用仿真軟件進行仿真,,以下介紹Modelsim的使用。在進入Modelsim的環(huán)境之后,在file項選擇change direction來確定編制的文件所在的目錄,然后在design項選擇或創(chuàng)建一個library,完成后即可開始編譯。在design項選compile…項,進入編譯環(huán)境,選定要編譯的文件進行編譯。完成編譯后,還是在compile…項,選擇lo

73、ad new design項,選中編譯后提示的top module的名字,然后開始仿真。在view項可選波形顯示,信號選擇,功能和操作簡單明了,下圖4-2這是ModelSim SE6.0進行波形仿真的結果。在ISE中可以運行Timing Analyzer生成詳細的時序報告,本設計中Minimum period: 12.032ns (Max</p><p>  圖4-2 仿真時序圖</p><

74、;p>  4.2 CPU模塊的綜合</p><p>  在對所設計的CPU模型進行驗證后,如沒有發(fā)現(xiàn)問題就可開始做下一步的工作即綜合。綜合工作往往要分階段來進行,這樣便于發(fā)現(xiàn)問題。</p><p><b>  所謂分階段就是指:</b></p><p>  第一階段:先對構成CPU模型的各個子模塊,如狀態(tài)控制機模塊(包括machine模塊

75、,machinectl模塊)、指令寄存器模塊(register模塊)、算術邏輯運算單元模塊(alu模塊)等,分別加以綜合以檢查其可綜合性,綜合后及時進行后仿真,這樣便于及時發(fā)現(xiàn)錯誤,及時改進。</p><p>  第二階段:把要綜合的模塊從仿真測試信號模塊和虛擬外圍電路模型(如ROM模塊、RAM模塊、顯示部件模塊等)中分離出來,組成一個獨立的模塊,其中包括了所有需要綜合的模塊。然后給這個大模塊起一個名字,如本章中

76、的例子,我們要綜合的只是CPU并不包括虛擬外圍電路,可以給這一模塊起一個名字,例如稱它為RSC_CHIP模塊。如用電路圖描述的話,我們還需給它的引腳加上標準的引腳部件并加標記,見圖4-3。</p><p>  圖4-3 RSC模塊</p><p>  第三階段:加載需要綜合的模塊到綜合器,本例所使用的綜合器是 Synplify, 選定的 FPGA 是 Altera FLEX10K,

77、針對它的庫進行綜合。</p><p>  也可以使用QuartusII或其他綜合工具進行綜合。綜合器綜合的結果會產(chǎn)生一系列的文件,其中有一個文件報告用了所使用的基本單元,各部件的時間參數(shù)以及綜合的過程。見下面的報告,它就是這個CPU芯片所用的綜合報告,綜合所用的庫為Altera FLEX10K系列的FPGA庫,約定的失蹤頻率為80MHz。</p><p>  //-------------

78、--- CPU芯片綜合結果報告開始-----------------//</p><p>  #Program:Synplify Pro 8.1</p><p>  #OS:Windows_NT</p><p>  $ Start of Compile</p><p>  #Fri Jul 01 10:11:03 2009</p>

79、<p>  Synplify Verilog Compiler, version 3.1.0, Build 049R,built May 3 2005</p><p>  Copyright (C) 1994-2005, Synplicity Inc. All Rights Reserved</p><p>  @I::”C:\Program File\Synplicity

80、\fpga_81\lib\altera\altera.v”</p><p>  @I::”C:\Program File\Synplicity\fpga_81\lib\altera\altera_mf.v”</p><p>  @I::”C:\Program File\Synplicity\fpga_81\lib\altera\altera_lpm.v”</p><p&

81、gt;  @I::”C:\vlogexe\ex17_2\cpu.v”</p><p>  @I:”C:\ vlogexe\ex17_2\cpu.v”:“C:\vlogexe\ex17_2\clk_gen.v”</p><p>  @I:”C:\ vlogexe\ex17_2\cpu.v”:“C:\vlogexe\ex17_2\accum.v”</p><p>  …

82、………………………</p><p>  …………………………</p><p>  Verilog syntax check successful!</p><p>  Compiler output is up to date. No re-compile necessary</p><p>  Selecting top level mod

83、ule cpu</p><p>  @N:”C:\vlogexe\ex17_2\clk_gen.v”:2:7:2:13︱Synthesizing module clk_gen</p><p>  @N: CL201:“C:\vlogexe\ex17_2\clk_gen.v”:18:0:18:5︱Trying to extract state machine for register sta

84、te</p><p>  Extracted state machine for register state</p><p>  State machine has 9 reachable states with original encodings of:</p><p><b>  00000000</b></p><

85、p><b>  00000001</b></p><p><b>  00000010</b></p><p><b>  …………</b></p><p><b>  …………</b></p><p>  @N:”C:\vlogexe\ex17_2

86、\register.v”:4:7:4:14︱Synthesizing module register</p><p><b>  …………</b></p><p><b>  …………</b></p><p>  @N: CL201:“C:\vlogexe\ex17_2\machine.v”:44:0:44:5︱Tryin

87、g to extract state machine for register state</p><p>  Extracted state machine for register state</p><p>  State machine has 8 reachable states with original encodings of:</p><p>&l

88、t;b>  000</b></p><p><b>  001</b></p><p><b>  010</b></p><p><b>  …</b></p><p>  @N:”C:\vlogexe\ex17_2\datactl.v”:11:7:11:1

89、3︱Synthesizing module datactl</p><p>  @N:”C:\vlogexe\ex17_2\adr.v”:10:8:10:10︱Synthesizing module adr</p><p><b>  …………</b></p><p><b>  …………</b></p>&

90、lt;p><b>  @END</b></p><p>  Process took 0h:00m:01s realtime,0h:00m:01s cputime</p><p>  #Fri Jul 01 10:11:03 2009</p><p>  ##########################################

91、#########[</p><p>  Version8.1</p><p>  Synplicity Altera Technology Mapper,Version8.1.0,Build 539R,Built May 6 2005</p><p>  Copyright(C)1994-2005,Synplicity Inc. All Rights Reserv

92、ed</p><p>  Automatic dissolve at startup in view:work.cup(verilog) of m_counter(counter)</p><p>  Automatic dissolve at startup in view:work.cpu(verilog) of m_adr(adr)</p><p><b

93、>  …………</b></p><p><b>  …………</b></p><p>  RTL optimization done.</p><p>  @N:”C:\vlogexe\ex17_2\counter.v”:19:0:19:5︱Found counter in view:work.cpu(verilog) ins

94、t m_counter.pc_addr[12:0]</p><p>  Encoding state machine work.clk_gen(verilog)-state[8:0]</p><p>  Original code->new code</p><p>  00000000->000000000</p><p>  

95、00000001->000000011</p><p><b>  …………</b></p><p>  Encoding state machine work.machine_synplcty(verilog)-state[7:0]</p><p>  Original code->new code</p><

96、p>  000->00000000</p><p>  001->00000011</p><p><b>  …………</b></p><p>  Writing Analyst data base C:\vlogexe\ex17_2\rev_1\cpu.srm</p><p>  Writing V

97、erilog Netlist and constraint files</p><p>  Writing.vqm output for Quartus</p><p>  Writing Cross reference file for Quartus to C:\vlogexe\ex17_2\rev_1\cpu.xrf</p><p>  Writing Ve

98、rilog Simulation files</p><p>  Found clock cpu︱clk with period 12.50ns</p><p>  Found clock machine︱inc_pc_derived_clock with period 12.50ns</p><p>  #####START OF TIMING REPORT###

99、##[</p><p>  #Timing Report written on Fri Jul 01 10:11:03 2009</p><p>  Top view: cpu</p><p>  Requested Frequency: 80.0MHz</p><p>  Wire load mode:

100、 top</p><p>  Paths requested: 5</p><p>  Constraint File(s):</p><p>  @N:MT195︱This timing report estimates place and route data.Please look at the place and route timing re

101、port for final timing..</p><p>  @N:MT197︱Clock constraints cover only FF-to-FF paths associated with the clock..</p><p>  Performance Summary</p><p>  ************************</

102、p><p>  Worst slack in design:10.158</p><p>  Requested Estimated Requested Estimate Clock Clock</p><p>  Starting Clock Frequency Frequency Period Period Sla

103、ck Type Group</p><p>  …………………………………………………………………………………………………………………….</p><p>  cpu︱clk 80.0MHz 427.0MHz 12.500 2.342 10.158 inferred Inferrd_clkgroup_0</p><

104、;p>  machine︱inc_pc_derived_clock 80.0MHz 427.0MHz 12.500 2.342 10.158 derived Inferrd_clkgroup_0</p><p>  Clock Relationships</p><p>  *****************************</p><p>&l

105、t;b>  …………</b></p><p><b>  …………</b></p><p>  Detailed Report for Clock:cpu︱clk</p><p>  Starting Points with Worst Slack</p><p>  *****************

106、*****************</p><p>  Starting Arrival</p><p>  Instance Reference Type Pin Net Time Slack</p><p><b>  Cl

107、ock</b></p><p>  …………………………………………………………………………………………………</p><p>  m_accum.accum[0] cpu︱clk stratixii_lcell_ff regout accum_0 0.095 10.158</p><p>  m_accum.accum[1] cpu︱clk strat

108、ixii_lcell_ff regout accum_1 0.095 10.194</p><p><b>  …………</b></p><p><b>  …………</b></p><p>  Ending Points with Worst Slack</p><p>  ***********

109、*******************</p><p><b>  …………</b></p><p><b>  …………</b></p><p>  Worst Path Information</p><p>  *******************************</p>

110、<p>  Path information for path number 1:</p><p>  Requested Period: 12.500</p><p>  -Setup time: 0.403</p><p> 

111、 =Required time: 12.097</p><p>  -Propagation time: 1.939</p><p>  =Slack (critical): 10.158</p><p

112、>  Number of logic level(s): 9</p><p>  Starting point: m_accum.accum[0]/regout</p><p>  Ending point: m_alu.alu_out[7]/adatasda

113、ta</p><p>  The start point is clocked by cpu︱clk[rising]on pin clk</p><p>  The end point is clocked by cpu︱clk[rising]on pin clk</p><p>  Instance/Net

114、 Pin Pin Arrival No. of</p><p>  Name Type Name Dir Delay Time Fan Out(s)</p><p>  ……………………………………………………………………………………………………</p><p> 

115、 m_accum.accum[0] stratixii_lcell_ff regout Out 0.095 0.095 –</p><p>  accum_0 Net - - 0.621 - 4</p><p>  m_alu.un2_alu_out_carry_0 st

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論