零基礎學(xué)FPGA(十四)第一片IC——精簡(jiǎn)指令集RISC_CPU設計精講

發(fā)布時(shí)間:2016-2-19 09:04    發(fā)布者:designapp
關(guān)鍵詞: FPGA , RISC
  不得不說(shuō),SDRAM的設計是我接觸FPGA以來(lái)調試最困難的一次設計,早在一個(gè)多月以前,我就開(kāi)始著(zhù)手想做一個(gè)SDRAM方面的教程,受特權同學(xué)影響,開(kāi)始學(xué)習《高手進(jìn)階,終極內存技術(shù)指南》這篇論文,大家都知道這篇文章是學(xué)習內存入門(mén)的必讀文章,小墨同學(xué)花了一些時(shí)間在這上面,說(shuō)實(shí)話(huà)看懂這篇文章是沒(méi)什么問(wèn)題的,文件講的比較直白,通俗易懂,很容易入手。當了解了SDRAM工作方式之后,我便開(kāi)始寫(xiě)代碼,從特權同學(xué)的那篇經(jīng)典教程里面,我認真研讀代碼的來(lái)龍去脈,終于搞懂了特權同學(xué)的設計思想,并花了一些時(shí)間將代碼自己敲一遍,并加上自己的注釋
  


  然而設計并沒(méi)有像我想象的那么簡(jiǎn)單,代碼設計好之后還要經(jīng)過(guò)仿真,時(shí)序約束,仿真總體來(lái)說(shuō)還好,但是時(shí)序約束我接觸的很少,于是又去學(xué)時(shí)序約束方面的知識,由于控制SDRAM時(shí)鐘跑到了100MHZ,時(shí)序約束對這個(gè)設計來(lái)說(shuō)可以算是關(guān)鍵部分了,之前的設計由于對時(shí)序要求的不高,所以不用約束就可以實(shí)現。學(xué)習時(shí)序約束可以算是一個(gè)漫長(cháng)的過(guò)程,經(jīng)過(guò)這段時(shí)間的學(xué)習,小墨同學(xué)也開(kāi)始反思,是不是自己的跨度有點(diǎn)大,設計SDRAM的過(guò)程確實(shí)有些吃力,所以,小墨同學(xué)決定暫時(shí)放棄SDRAM的教學(xué),等以后發(fā)Nios II的文章的時(shí)候再來(lái)談SDRAM。
  這次我們先來(lái)學(xué)習一個(gè)CPU的設計,這個(gè)設計看似簡(jiǎn)單,但是真要一步步做完還是需要點(diǎn)耐心和精力的。本篇文章我們主要介紹Risc_CPU的設計過(guò)程以及代碼分析,下一篇文章小墨同學(xué)主要和大家分享test bench的書(shū)寫(xiě)與仿真測試,幫助大家一步一步學(xué)會(huì )這個(gè)cpu的設計,那么,我們開(kāi)始今天的教學(xué)吧~
  一、 設計前的準備
  設計開(kāi)始之前,我們得先知道什么是CPU,cpu即中央處理器,是計算機的核心部件。cpu的工作過(guò)程,小墨同學(xué)簡(jiǎn)單說(shuō)一下。首先我們計算機的程序和數據是存在我們計算機的內存中的,上電后cpu就需要從第一條指令的地址開(kāi)始取指令,即取指令。取出的指令需要經(jīng)過(guò)指令譯碼來(lái)告訴cpu這條指令是用來(lái)干什么的,即分析指令。當得知指令內容以后,cpu需要產(chǎn)生操作指令來(lái)完成相應的操作,即執行指令。所以,任何一種CPU內部,至少應該包含下列這些部件:
  1.算數運算器
  2.累加器
  3.指令計數器
  4.指令寄存器和譯碼器
  5.時(shí)序控制器
  二. 工作原理
  在本次設計中,我們假設ROM中裝的是我們的程序指令,等會(huì )我們會(huì )往里面裝數據,程序指令是16位的,cpu每次讀取8位,分兩次讀完,讀出來(lái)的數據存到指令寄存器中。
  這16位數據的高三位代表指令碼
  HLT = 3'b000,
  SKZ = 3'b001,
  ADD = 3'b010,
  AND = 3'b011,
  XOR = 3'b100,
  LDA = 3'b101,
  STO = 3'b110,
  JMP = 3'b111;
  后13位代表地址碼,指令寄存器將讀回來(lái)的數據分成指令碼opcode[2:0]和地址碼ir_addr[12:0],狀態(tài)控制器讀回指令碼進(jìn)行譯碼,看是什么指令,然后根據指令的內容操作其他部件,若為寫(xiě)數據則打開(kāi)RAM進(jìn)行寫(xiě)數據,若為計算則將數據送到算數運算器進(jìn)行算數運算,若為跳轉指令則地址指向下一地址,下次讀取指令的時(shí)候就跳過(guò)一個(gè)地址執行等等
  三、各模塊精講
  本次設計的cpu共包含8個(gè)模塊,下面我來(lái)一一講解
  1.時(shí)鐘發(fā)生器
  


  本模塊的用來(lái)產(chǎn)生分頻信號,外部50M的時(shí)鐘,做8分頻輸出,此8分頻信號用來(lái)控制地址多路器的輸出,由于之后我們要用到8狀態(tài)的狀態(tài)機,因此這里做成8分頻,至于具體原因,我們后面再講,然后是一個(gè)算數運算器的使能信號,每一個(gè)8分頻信號到來(lái)之前有一個(gè)算術(shù)運算器使能信號的高脈沖,意思就是,每一此狀態(tài)機循環(huán)開(kāi)始之前做一次運算
  


  


  才有狀態(tài)機的方式來(lái)設計分頻信號避免了使用計數器計數的方法來(lái)延時(shí),提高了程序的可讀性和速度
  2.指令寄存器
  


  本模塊的作用是將來(lái)自ROM的16位數據寄存并分為高三位的指令碼和低13位的地址碼
  


  指令寄存器分兩次讀取ROM中的數據
  3.累加器
  


  算數運算器的初值位0,來(lái)自ROM的數據經(jīng)算數運算器處理之后輸出到累加器,累加器使能信號到來(lái)時(shí),再將這份數據送到算數運算器作為初值,與下次從ROM中讀回的數據進(jìn)行算數運算
  


  4.算數運算器
  


  算術(shù)運算器先判斷來(lái)自ROM的高三位指令碼是何種指令,然后將來(lái)自ROM中的數據和來(lái)自累加器中的數據進(jìn)行算數運算,并將結果輸出。如果算數運算器中的數據是0的話(huà),那么有一個(gè)高脈沖zero輸出
  


  5.數據控制器
  


  如果想將算數運算器的結果保存起來(lái),輸出到RAM,那么可以選通數據控制器,將數據輸出到RAM,配合指令STO
  


  6.地址多路器
  


  8分頻時(shí)鐘的前半周期用來(lái)讀取ROM中指定地址的數據,后半周期用來(lái)進(jìn)行指令操作,所以前半個(gè)周期需要從指定ROM中讀數據,所以輸出地址應為pc_addr,后半個(gè)周期用來(lái)處理指令,那么要操作的肯定是從ROM中讀回的13位地址,即ir_addr,并將其輸出
  


  7.程序計數器
  


  剛開(kāi)始從ROM中讀取數據的地址是pc_addr,是0地址,若為跳轉指令,則需要將從ROM中讀回的13位地址碼作為新地址給pc_addr,等下一個(gè)8分頻時(shí)鐘到來(lái)時(shí)就讀取該地址的指令,實(shí)現跳轉指令的目的。如果不是跳轉指令,那么pc_addr加1指向下一地址,繼續執行
  


  8.狀態(tài)控制器
  


  狀態(tài)控制器,即我們的狀態(tài)機,使我們本次設計的核心部件,狀態(tài)機共用了8個(gè)狀態(tài)
  前兩個(gè)狀態(tài)用來(lái)讀取ROM中的16位數據,需要兩個(gè)時(shí)鐘,也就是需要兩個(gè)狀態(tài)。
  第三個(gè)狀態(tài)等待一個(gè)時(shí)鐘周期,目的是要湊夠8個(gè)狀態(tài),因為8分頻時(shí)鐘的后半個(gè)周期需要4個(gè)狀態(tài)來(lái)完成,故前半周期也需要4個(gè)狀態(tài),由于前半周期只需要讀取數據和地址指向下一地址即可,故需湊一個(gè)狀態(tài)
  第四個(gè)狀態(tài)地址加1 ,指向下一地址
  第五到八個(gè)狀態(tài)用來(lái)分析指令和執行指令,若為跳轉指令,則控制程序計數器改變目標地址,若為跳過(guò)下一條指令,則控制程序計數器pc_addr地址加4,若為運算指令,則將控算數運算器進(jìn)行相應的邏輯運算,若為L(cháng)DA寫(xiě)入指令,則將讀回的數據放入累加器中等等,具體操作指令的含義見(jiàn)下圖
  


  各個(gè)模塊設計好之后將其組裝便完成了我們的cpu設計,組裝后的頂層模塊見(jiàn)下圖
  


  這樣,我們的cpu就設計完成了,當然設計完成之后還要進(jìn)行仿真,要仿真就還需要外圍電路,包括存期指令程序ROM,存取數據的RAM,地址譯碼器等,由于ROM和RAM是不可綜合的,但是我們可以在仿真的時(shí)候模擬。
  由于每篇文章最多只能上傳20張圖片,所以今天的教程就到此為止吧,具體的仿真過(guò)程和ROM、RAM的設計小墨同學(xué)將在下一篇文章中介紹,下一篇文章中將會(huì )提到modolsim SE的使用,test bench的書(shū)寫(xiě),前面的博客中雖然也略有提及,但并不系統,下一篇文章將會(huì )以本次設計為例,給大家介紹仿真的全過(guò)程,希望大家大力支持,下面附上部分仿真的圖片和測試結果供大家參考
  波形仿真
  


  謝謝各位大神的支持,這篇文章寫(xiě)了幾個(gè)小時(shí),純手打~
                               
               
本文地址:http://selenalain.com/thread-160918-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页