小墨同學(xué) 不得不說(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ò)程,希望大家大力支持,下面附上部分仿真的圖片和測試結果供大家參考 波形仿真 ![]() 此外,以后小墨同學(xué)的文章將北京至芯科技官方技術(shù)論壇更新,至芯科技的官方技術(shù)論壇也有很多的資料供大家下載,里面也有小墨的專(zhuān)題板塊,希望廣大網(wǎng)友和愛(ài)好者的大力支持~ http://www.fpgaw.com/ 小墨同學(xué)專(zhuān)版網(wǎng)址 http://www.fpgaw.com/thread-78527-1-1.html 下面是至芯科技官方網(wǎng)站,夏宇聞教授和那里的老師都超好的~有意愿接受FPGA培訓的可以找工作人員咨詢(xún) http://www.zxopen.com/ 以后小墨同學(xué)的教程會(huì )跟這款開(kāi)發(fā)板配套,想跟小墨同學(xué)一起學(xué)習,一起進(jìn)步的的可以考慮一下購買(mǎi)一塊開(kāi)發(fā)板,畢竟學(xué)習要舍得投資嘛,下面是開(kāi)發(fā)板淘寶鏈接 http://item.taobao.com/item.htm?spm=a230r.1.14.18.YdZFbX&id=40547871864&ns=1&abbucket=13#detail |