基于FPGA的計算器設(shè)計_第1頁
基于FPGA的計算器設(shè)計_第2頁
基于FPGA的計算器設(shè)計_第3頁
基于FPGA的計算器設(shè)計_第4頁
基于FPGA的計算器設(shè)計_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、研究生課程論文課程名稱 fpga及片上系統(tǒng)sopc應用授課學期 學年 第 一 學期學院 x 專 業(yè) c 學號 c1 姓名 c 任課教師 c 論文題目基于fpga的計算器設(shè)計交稿日期 2014年01月09日 成績 x基于fpga的計算器設(shè)計研究生:xx 指導老師:xx摘要 本文介紹了一個簡單計算器的設(shè)計,基于硬件描述語言vhdl采用了現(xiàn)場可編程邏輯器件fpga進行設(shè)計,并在altera公司的quartus 軟件上實現(xiàn)仿真。系統(tǒng)由鍵控模塊、運算、存儲模塊和譯碼顯示模塊四個部分組成,計算部分為加法器、減法器、乘法器和除法器,存儲部分需要3個存儲器來實現(xiàn):內(nèi)部累加器(acc)、輸入寄存器(reg)以及

2、結(jié)果暫存器(ans)。顯示部分由四個七段譯碼管組成,分別來顯示輸入數(shù)字,輸入部分采用外接鍵盤,外部的8個按鍵他們能以單鍵和組合鍵的形式完成09999之內(nèi)的 加、減、乘、除、符號變換、存儲數(shù)據(jù)和讀取數(shù)據(jù)等七種功能運算其結(jié)構(gòu)簡單,易于實現(xiàn)。 關(guān)鍵詞:fpga;vhdl;計算器;設(shè)計the design of calculator based on fpgagraduate student: dongdong fan supervisor: shuxiang songabstract this article describes the design of a simple calculator,

3、the design uses field programmable gate array fpga based on vhdl hardware description language to design and altera's quartus in software for emulation. this system is componented by the key control module, computing, storage and decoding display module of the four parts, the computing part incl

4、ude adder, subtractor, multiplier and divider,storage part needs three memory to help achieved: internal accumulator (acc), input register (reg) as well as the results of registers (ans). display part is made up four decoder of 7 sections, respectively to show the number of input. the 8 keys they ca

5、n by single combined key forms to be completed addition, multiplication, division arithmetic operator and symbol transform,stored data and read seven function of operation within 0 to 9999 numbers.its structure is simple and easy to implement.key words:fpga; vhdl; calclute ; design目錄摘要i目錄ii第1章 引言11.

6、1 課程設(shè)計的目的與意義11.2 國內(nèi)外發(fā)展現(xiàn)狀1第2章fpga技術(shù)及硬件描述語言22.1 eda技術(shù)及其發(fā)展22.2 fpga技術(shù)22.3硬件描述語言vhdl3第3章 系統(tǒng)總體設(shè)計43.1 計算器的計算部分43.2 計算器的存儲部分43.3 計算器的顯示部分53.4 計算器的輸入部分6第4章 計算器的vhdl設(shè)計74.1加法器的設(shè)計與仿真74.2減法器的設(shè)計與仿真84.3乘法器的設(shè)計與仿真94.4 除法器的設(shè)計與仿真10第5章 結(jié)束語11參考文獻:11ii第1章 引言1.1 課程設(shè)計的目的與意義在人類學會交易的時候,計算也隨之產(chǎn)生,而算盤作為計算最實用的工具存在了幾千年。算盤亦稱珠算,是中國

7、人民創(chuàng)造的一種計算工具,素有“中國計算機”之稱。算盤產(chǎn)生于漢代之前,是由古代的“籌算”演變而來的,珠算一詞,最早見于漢末三國時代徐岳撰數(shù)術(shù)記遺,書中有“珠算,控帶四時,經(jīng)緯三才”的記述。明清時期,算盤的應用已很廣泛,關(guān)于算盤制造規(guī)格,后來出現(xiàn)的各種規(guī)格的算盤,都是在此基礎(chǔ)上發(fā)展起來的。算盤構(gòu)造簡單,便于掌握,使用方便,成為計算理財不可缺少的工具??墒请S著人類文明的進步和科學技術(shù)的不斷發(fā)展。算盤已經(jīng)越來越不能滿足一些高強度、高難度、高速度的復雜計算。這時,一種新的電子產(chǎn)品問世了,它就是電子計算器。電子計算器的發(fā)明是跨時代的,它比算盤計算的速度要快幾百幾千倍,計算的結(jié)果要比算盤更精確,操作的方法要

8、更方便,更簡單易學,計算的范圍更廣,并且小巧、輕便。它已經(jīng)成為人們?nèi)粘I钪胁豢扇鄙俚囊环N計算工具,為我們的生活提供了很大的方便。而隨著計算機的普及,越來越多人在使用計算機,越來越多的工作離不開計算機,可以說計算機已經(jīng)成為現(xiàn)代社會中不可或缺的工具,而電子計算器功能也以軟件的形式進入計算機的軟件世界,這不僅給人們帶來了更大的便利,更為人們引入了更快的計算速度和更強大的運算功能。1.2 國內(nèi)外發(fā)展現(xiàn)狀(1)國外情況在國外,電子計算器在集成電路發(fā)明后,只用短短幾年時間就完成了技術(shù)飛躍,經(jīng)過激烈的市場競爭,現(xiàn)在的計算器技術(shù)己經(jīng)相當成熟。計算器已慢慢地脫離原來的“輔助計算工具”的功能定位,正向著多功能化

9、、可編程化方向發(fā)展,在各個領(lǐng)域都得到了廣泛的應用。用計算器不僅可以實現(xiàn)各種各樣復雜的數(shù)學計算還可以用來編制、運行程序,甚至解方程組,圖形計算器還可以進行圖形處理。計算器內(nèi)置的軟件允許用戶進行類似于對計算機的文件和目錄管理等操作,允許用戶對圖形界面進行定制,同時各種新技術(shù)也被應用到計算器里使計算器功能越來越強大??梢哉f,計算器就是一個“微微型”的計算機。(2)國內(nèi)情況國內(nèi)也有廠商利用計算器芯片開發(fā)新的產(chǎn)品,但對計算器技術(shù)的研究、計算器芯片的設(shè)計還處于起步階段。計算器的主要功能還是在于“計算”,不妨稱之為“低檔計算器”。即便是對這種計算器,很多廠商也只從事計算器的組裝、銷售業(yè)務。一些ic設(shè)計公司、

10、芯片提供商也開始研究計算器技術(shù)。第2章fpga技術(shù)及硬件描述語言2.1 eda技術(shù)及其發(fā)展1.使電子設(shè)計成果以自主知識產(chǎn)權(quán)的方式得以明確表達和確認成為可能;2.在仿真和設(shè)計兩方面支持標準硬件描述語言的功能強大的eda軟件不斷推出;3.電子技術(shù)全方位納入eda領(lǐng)域;4.eda使得電子領(lǐng)域各學科的界限更加模糊,更加互為包容;5.soc高效低成本設(shè)計技術(shù)的成熟。2.2 fpga技術(shù)(1)fpga技術(shù)的發(fā)展現(xiàn)狀fpga是英文field programmable gate array的縮寫,即現(xiàn)場可編程門陣列,它是在pal、gal、cpld等可編程器件的基礎(chǔ)上進一步發(fā)展的產(chǎn)物。它是作為專用集成電路(as

11、ic)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點。fpga芯片叫板微處理器,如果沒有微處理器,電腦會怎樣?答案令人驚訝- 它的處理速度比常規(guī)電腦更快,而且快出很多倍!盡管fpga芯片的時鐘頻率要低于奔騰處理器,但是由于fpga芯片可并行處理各種不同的運算,所以可完成許多復雜的任務。例如網(wǎng)頁顯示,全球天氣建摸及基因組合核對等,而且處理速度比奔騰處理器或數(shù)字信號處理器快得多。在通用計算方面,fpga仍然不敵intel的處理器。對于那些只需要進行重復單任務操作的機器而言,使用fpga芯片顯然是大材小用。與fpga對應的還有dsp處理器,dsp處理

12、器速度雖然很快,并對許多dsp應用來說很有用,但仍有一些應用要求性能再進一步提升,而fpga提供了更高的性能。fpga可以生成一個定制硬件設(shè)計,從而控制邏輯能夠在硬件中實現(xiàn),不必再利用精確的時鐘周期來實現(xiàn)控制功能。目前的fpga設(shè)計一般采用top-down(自頂向下)的設(shè)計方法。先將系統(tǒng)劃分為各個功能子模塊,在系統(tǒng)級層次上進行行為描述,再對這些子模塊進一步進行行為描述。 圖2.1 應用fpga開發(fā)流程2.3硬件描述語言vhdl硬件描述語言是eda技術(shù)的重要組成部分,vhdl是作為電子設(shè)計主流硬件的描述語言。vhdl語言具有很強的電路描述和建模能力,能從多個層次對數(shù)字系統(tǒng)進行建模和描述,從而大大

13、簡化了硬件設(shè)計任務,提高了設(shè)計效率和可靠性。 自頂向下的設(shè)計流程:圖2.2基于vhdl的自頂向下設(shè)計方法第3章 系統(tǒng)總體設(shè)計系統(tǒng)總體設(shè)計框圖如圖1.3所示。此設(shè)計由計算部分、存儲部分、顯示部分和輸入部分組成。圖3.1計算器的系統(tǒng)組成框圖3.1 計算器的計算部分完成09999之內(nèi)的數(shù),9999的二進制表示為10011100001111,在這一部分中,可以將每一個數(shù)均表示成16位二進制數(shù)統(tǒng)一進行運算,各個計算數(shù)之間的計算可以直接使用vhdl語言中的運算符來實現(xiàn)。但在顯示時,必須將個位、十位、百位,千位分開顯示,設(shè)計時使用比較的方法來實現(xiàn)計算器的功能要求。3.2 計算器的存儲部分存儲部分需要3個存儲

14、器來實現(xiàn):內(nèi)部累加器(acc)、輸入寄存器(reg)以及結(jié)果暫存器(ans)。在存放數(shù)字時,將數(shù)字放入acc或者reg里面,當?shù)谝淮伟聪聰?shù)字鍵時,表示該數(shù)字是個位。當?shù)诙伟聪聰?shù)字鍵時,表示這次輸入的是個位,是十位,上一次輸入的所以要把第一次輸入的數(shù)字乘以10,再加上第二次輸入的數(shù)字,來得到最終輸入的數(shù)字。當?shù)谌伟聪聰?shù)字鍵時,要將第一次輸入的數(shù)字乘以100,再加上第二次輸入的數(shù)字乘以10,再加上第二次輸入的數(shù)字,來得到最終輸入的數(shù)字。當?shù)谒拇伟聪聰?shù)字鍵時,要將第一次輸入的數(shù)字乘以1000,再加上第二次輸入的數(shù)字乘以100,再加上第三次輸入的數(shù)字乘以10,再加上第四次輸入的數(shù)字,來得到最終輸入

15、的數(shù)字。當進行第一次計算時,第一個數(shù)字存放在acc里面。按下運算符以后,第二個數(shù)字放在reg里面。當再按下運算符號或者等號時,第一次計算的結(jié)果將存放在ans里面,同時reg清零,等待下一個數(shù)字的輸入。進行第二次運算時,將ans里面的結(jié)果與reg里面新輸入的數(shù)字進行運算,再將運算結(jié)果存放在ans里面,直到最后按下等號按鍵的時候,顯示最終的運算結(jié)果。3.3 計算器的顯示部分顯示部分是系統(tǒng)的輸出部分,用于顯示按鍵值及計算結(jié)果,由于數(shù)字系統(tǒng)的數(shù)據(jù)運算都是二進制的,而輸出表達式都是bcd碼,為了滿足bcd碼的譯碼顯示,最方便的方法就是利用譯碼程序在fpga中實現(xiàn)。本文采用的是共陰極七段數(shù)碼管,顯示數(shù)字時

16、需要將對應管腳置為高電平,輸出時,從左到右,按從高到低位的順序依次接g、f、e、d、c、b、a。七段譯碼器的基本結(jié)構(gòu)如圖3.2所示。圖3.2 七段譯碼器的結(jié)構(gòu)其vhdl語言描述如下所示。在這段程序中,indata是輸入4位二進制數(shù)的端口,outdata是輸出7位譯碼的端口,用with語句來實現(xiàn)譯碼。with indata selectoutdata<="1111110"when"0000", -顯示0 "0110000"when"0001", -顯示1 "1101101"when"

17、;0010", -顯示2 "1111001"when"0011", "0110011"when"0100", "1011011"when"0101", "1011111"when"0110", "1110000"when"0111", "1111111"when"1000", "1101111"when"1001&qu

18、ot;, -顯示9 "0000000"when others; -其它的輸入按鍵均不顯示。計算器顯示部分的設(shè)計和實現(xiàn),實際上就是七段譯碼器的設(shè)計和實現(xiàn),四個七段譯碼器分別顯示的是個位、十位、百位、千位。輸入第一個數(shù)字后至再一次按下數(shù)字按鍵輸入第二個數(shù)字前,三個七段譯碼器顯示的都是第一個數(shù)字。當開始輸入第二個數(shù)字的時候顯示第二個數(shù)字,再次按下運算按鍵到輸入第三個數(shù)字前,顯示的是前兩個數(shù)字的運算結(jié)果,以此類推,當最后按下等號鍵的時候,顯示最終的運算結(jié)果。3.4 計算器的輸入部分計算器輸入部分的設(shè)計最主要的是按鍵譯碼電路的設(shè)計和實現(xiàn)。計算器的輸入部分是由外部的8個按鍵他們能以單鍵

19、和組合鍵的形式完成09十個數(shù)字按鍵、加減乘除四則運算的運算符按鍵、一個等號按鍵和一個清零按。設(shè)計所要做的是對按鍵信息進行譯碼,使其在計算器內(nèi)部可以使用。數(shù)字按鍵譯碼電路的主體部分vhdl語言描述如下。process(inclk,reset) begin if reset='1'then outnum<="0000" elsif inclk'event and inclk='1'then case innum is when"00000001"=>outnum<="0000"ou

20、tflag<='1' -按下第一個鍵表示輸入0 when"00000010"=>outnum<="0001"outflag<='1' -按下第二個鍵表示輸入0 when"00000100"=>outnum<="0010"outflag<='1'-以下類似 when"00001000"=>outnum<="0011"outflag<='1' when&qu

21、ot;00010000"=>outnum<="0100"outflag<='1' when"00100000"=>outnum<="0101"outflag<='1' when"01000000"=>outnum<="0110"outflag<='1' when"10000000"=>outnum<="0111"outflag<

22、='1' when"10000001"=>outnum<="1000"outflag<='1' when"10000010"=>outnum<="1001"outflag<='1' when others=>outnum<=outnum;outflag<='0' -不按鍵時保持 end case; end if; end process;在本次設(shè)計的程序中,設(shè)reset是異步復位信號的輸入端口,in

23、clk是時鐘信號的輸入端口,innum端口用來表示輸入的按鍵向量,outnum端口用來表示輸入的按鍵動作對應的輸出數(shù)字,outflag端口用來輸出是否有按鍵動作,它主要實現(xiàn)的是按下什么就輸出什么。一共有千、百、十、個位,初始值都為低電平“0”,當按下哪個位時哪個位上的電平就跳為高電平(有且僅有一個為高電平),這時就有相應的輸出。那千、百、十、個位分別對應的是09這十個數(shù)字,所以當?shù)谝粋€位(從左往右位數(shù)依次增高)為高電平時顯示0,第千個位上位高電平時,相應的顯示為9。如果按下的鍵是加號、減號、乘號、除號或者是等于號時,也是不顯示的,所以也可以稱作數(shù)字按鍵譯碼電路。第4章 計算器的vhdl設(shè)計4.

24、1加法器的設(shè)計與仿真 全加器是組合邏輯電路中最常見也最實用的一種,考慮低位進位的加法運算就是全加運算,實現(xiàn)全加運算的電路稱為全加器。設(shè)計16位的全加器思路非常簡單且清晰,第一種方法就是先設(shè)計一個半加器和一個或門,然后兩個半加器合并成一個一位的全加器,最后用16個一位的全加器組合成為一個16位的全加器;第二種方法就是先設(shè)計一個一位的全加器,然后在用16個串聯(lián)或并聯(lián)就組成了一個16位的全加器,而本次設(shè)計采用采用的4.1一位全加器的級聯(lián)原理圖程序如附錄中加法程序,經(jīng)quartus 編譯后建立.vwf,設(shè)置被加數(shù)a為十進制數(shù)9999(可設(shè)置09999內(nèi)的任意數(shù)字),設(shè)置加數(shù)b99999仿真后所得結(jié)果如

25、圖4.2所示。9999+999919998,仿真結(jié)果正確,可知此加法器設(shè)計有效。圖4.2 加法器仿真9999+9999199984.2減法器的設(shè)計與仿真設(shè)計一個16位二進制數(shù)的減法器,利用二進制的減法原理,減法變加法多次調(diào)用一位全加器一位全減器的原理框圖如圖4.3所示。由圖可以看出,此減法器共需要兩個輸入端口和一個輸出端口。減法器的設(shè)計可以引用加法器,即通過對減數(shù)的求補,再與被減數(shù)相加得到最終的結(jié)果,所以需要增設(shè)一個進位位輸入端口和進位位的輸出端口。圖4.3 一位全減器的原理框圖可以設(shè)a端口為被減數(shù),b端口為減數(shù),ci為輸入借位位,s為結(jié)果的輸出端口,co為借位的輸出端口。此減法器可以進行位數(shù)

26、擴展,每增加一位需要多引用一個加法器,程序如附錄中減法程序,經(jīng)quartus 編譯后建立.vmf文件,設(shè)置被減數(shù)a為十進制數(shù)1999(可設(shè)置09999內(nèi)的任意數(shù)字),設(shè)置減數(shù)b為999,仿真后所得結(jié)果如圖4.4所示。1999-9991000,仿真結(jié)果正確,可知此減法器設(shè)計有效。圖4.4 減法器仿真1999-99910004.3乘法器的設(shè)計與仿真乘法器是數(shù)字系統(tǒng)中的基本邏輯器件,在很多應用中都會出現(xiàn)如各種濾波器的設(shè)計、矩陣的運算等。這里設(shè)計的是一個16×16的乘法器。依據(jù)乘法器的原理,可以繪出其原理框圖如圖4.5所示。圖4.5 乘法器的原理框圖可設(shè)a端口為被乘數(shù)(一個16位二進制數(shù)),

27、b端口為乘數(shù)(一個16位二進制數(shù)),y為乘法運算的結(jié)果的輸出端口。乘法器模塊圖如附錄中所示。程序如附錄中乘法程序,經(jīng)quartus 編譯后建立.vmf文件,設(shè)置被乘數(shù)a為十進制數(shù)9999,設(shè)置乘數(shù)b為1000,仿真后所得結(jié)果如圖4.6所示。9999*10009999000,仿真結(jié)果正確,可知此乘法器設(shè)計有效。圖4.6 乘法器仿真 9999*100099990004.4 除法器的設(shè)計與仿真另類 除法器的算法可分為兩類:基于減法操作和基于乘法操作的算法?;诔朔ǖ某ò殉闯墒浅朔ǖ哪孢\算。如下面的式子所示: a =b×q+r對于16位無符號被除數(shù)a,先將a轉(zhuǎn)換成高16位是0,低16位

28、是a的數(shù)tempa。在每個周期開始時tempa向左移動一位,最后一位補零,然后判斷temp a的高16位是否大于等于除數(shù)b,如是則tempa的高16位減去b并且加i,得到的新值仍賦給tempa;如不是直接進入下一步。上面的移位、比較、減法(減法視情況而定)要進行16次,經(jīng)過16個周期后,運算結(jié)束,所得到的tempa的高16位為余數(shù),低16位為商。將移位、比較和相減放在同一個循環(huán)中,去除了不必要的延時,增加了設(shè)計的可靠性。對于32位有符號數(shù)的除法,算法與上面類似,只是需要判斷商和余數(shù)是正數(shù)還是負數(shù)。當youwu為1時進行有符號數(shù)運算,否則進行無符號數(shù)運算。圖4.7 除法器的原理框圖設(shè)a端口為被除

29、數(shù),b端口為除數(shù),s端口為商,y端口為余數(shù),程序如附件中除法程序,經(jīng)quartus 編譯后建立.vmf文件,設(shè)置被除數(shù)為十進制數(shù)9088除數(shù)為90,仿真所得結(jié)果如圖4.8所示。計算得到9088÷9010088,仿真結(jié)果正確,由此可知此除法器設(shè)計有效。圖4.8 除法器仿真 9088÷9010088第5章 結(jié)束語課程設(shè)計是本學期最后一次將自己所學理論與實際相結(jié)合的機會,通過這次比較完整的基于fpga的計算器的設(shè)計,我自己的理論與實踐相結(jié)合的能力有了大幅度的提升。在溫習了所學專業(yè)知識的基礎(chǔ)上,同時通過查閱專業(yè)書籍、相關(guān)文獻資來解決實際工程問題,這鍛煉了我的綜合運用各項知識和資源的

30、能力。我采用的是分模塊的設(shè)計方法,各個模塊的設(shè)計我都是隨著設(shè)計的不斷深入而不斷熟悉并學會應用的。由于以前沒有經(jīng)常使用vhdl語言,在編程過程中難免會與到反復調(diào)試自己也看不出的問題,幸好有實驗室同學的解答,在此表示感謝!而且通過對整體的掌控,對局部的取舍,以及對細節(jié)的斟酌處理,都使我的實際動手經(jīng)驗得到了極大的豐富,由于程序編寫與處理是一項非常繁瑣非常令人頭疼的工作,完成了這些,也使我的意志、抗壓能力及耐力都得到了不同程度的提升。這一次的設(shè)計讓我積累很多的解決實際問題的經(jīng)驗,如加法器,除法器有多種方法描述,使我的頭腦更加靈活,這必然會讓我在未來的學習、工作中表現(xiàn)出更高的應變能力,更強的溝通力和理解

31、力。通過這次的設(shè)計,我對fpga技術(shù)、vhdl語言以及quartus 的使用都有了深入的了解。雖然設(shè)計中內(nèi)容較多,過程繁瑣但這也造就了我豐富的收獲。從未知道的原理,不一定就難,關(guān)鍵是要動手去做,模塊化設(shè)計,各個擊破解決,相信下一次做其它設(shè)計時我會做的更好。參考文獻:1朱正偉.技術(shù)及應用.m.北京:清華大學出版社,2005.2王彥.基于fpga的工程設(shè)計與應用m.西安:西安電子科技大學出版社,2007.103黃智偉.fpga系統(tǒng)設(shè)計與實踐m.北京:電子工業(yè)出版社,2005.3江思敏.vhdl數(shù)字電路及系統(tǒng)設(shè)計m.北京:機械工業(yè)出版社,2006.5盧毅,賴杰.vhdl與數(shù)字電路設(shè)計m.北京:北京科

32、學出版社,2001.6潘松,黃繼業(yè).eda技術(shù)實用教程m.第二版.北京:科學出版社,2005.7徐志軍,徐光輝.cpld/fpga的開發(fā)與應用m.北京:電子工業(yè)出版社,2002.8陳育人.8 位計算器的指令系統(tǒng)與硬件結(jié)構(gòu)j.微電子技術(shù),2000,28(3).9朱衛(wèi)華,鄭留平可任意設(shè)置計算精度的整數(shù)除法器的設(shè)計j國外電子測量技術(shù)。2008, 27(2):16180附 錄1. 1位全加器源程序f_adder.vhd如下:library ieee;-半加器use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_log

33、ic_unsigned.all;entity h_adder isport (a,b:in std_logic; so,co:out std_logic);end entity h_adder;architecture behave of h_adder isbegin so<=a xor b;co<=a and b;end behave;-*library ieee;use ieee.std_logic_1164.all;-或門邏輯use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity or2a is

34、port (a,b:in std_logic; c:out std_logic);end entity or2a;architecture one of or2a isbegin c<=a or b;end one;-*library ieee;-1位全加器頂層設(shè)計use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity f_adder isport (ain,bin,cin:in std_logic; sumf,coutf:out std_logic);

35、end entity f_adder;architecture fd1 of f_adder iscomponent h_adderport (a,b:in std_logic; so,co:out std_logic);end component;component or2a port (a,b:in std_logic;0 c:out std_logic);end component;signal d,e,f:std_logic;beginu1:h_adder port map(a=>ain,b=>bin,co=>d,so=>e);u2:h_adder port m

36、ap(a=>e,b=>cin,co=>f,so=>sumf);u3:or2a port map(a=>d,b=>f,c=>coutf);end architecture fd1;2 . 16位位減法器的源程序suber.vhd如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity suber is -減法器port (a,b:in std_logic_vector(15 downto 0

37、); ci:in std_logic; s:out std_logic_vector(15 downto 0); co:out std_logic);end entity suber;architecture fd3 of suber iscomponent f_adder is -調(diào)用一位全加器(在工程中已經(jīng)添加)port (ain,bin,cin:in std_logic; sumf,coutf:out std_logic);end component;signal btem:std_logic_vector(15 downto 0);signal ctem:std_logic_vecto

38、r(16 downto 0);signal stem:std_logic_vector(15 downto 0);beginbtem(15 downto 0)<=not b(15 downto 0);ctem(0)<=not ci;gl:for i in 0 to 15 generate-loop add:f_adder port map(a(i),btem(i),ctem(i),stem(i),ctem(i+1);end generate gl;-loop; s(15 downto 0)<=stem(15 downto 0); co<=not ctem(16);end

39、 fd3;3. 16位乘法器源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity mul isport (a,b:in std_logic_vector(15 downto 0); y:out std_logic_vector(31 downto 0);end entity mul;architecture fd4 of mul isbeginy(31 downto 0)<=a(15 downto 0)*b(15 do

40、wnto 0);end fd4;4. 16位除法器源程序diver.vhd:library ieee;0use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use ieee.numeric_std.all;entity diver isport (a,b:in std_logic_vector(15 downto 0);-此信號為1進行有符號數(shù)運算否則是無符號數(shù)相除 youwu:in std_logic;- s,y:out std_logic_vector(15 dow

41、nto 0);end entity diver;architecture fd5 of diver issignal tempa,tempb:std_logic_vector(15 downto 0);signal fuhao,sign,d:std_logic; begind<=(a(15) xor b(15) and youwu;-有符號數(shù)相除時商的符號sign<=a(15) and youwu;-被除數(shù)為負數(shù)時余數(shù)取負值process(a,b,youwu)beginif youwu='1' then-將有符號數(shù)轉(zhuǎn)為無符號數(shù)if a(15)='1'

42、 then tempa<=not a+1; elsetempa<=a;end if;if b(15)='1' then tempb<=not b+1; elsetempb<=b;end if;else-無符號數(shù)不作變化tempa<=a;tempb<=b;end if;end process;process(tempa,tempb,fuhao,sign,d)variable n:integer;variable temp_a,temp_b:std_logic_vector(31 downto 0);begintemp_a:="0000

43、000000000000"&tempa;temp_b:=tempb&"0000000000000000"n:=0;while(n<16) loop-16次操作temp_a:=temp_a(30 downto 0)&"0"n:=n+1;if temp_a(31 downto 16)>=tempb thentemp_a:=temp_a-temp_b+1;end if;end loop;if d='1' then-商為負數(shù)時用補碼表示 temp_a(15 downto 0):=(not temp_a

44、(15 downto 0)+1;end if;if sign='1' then-余數(shù)為負數(shù)時用補碼表示 temp_a(31 downto 16):=(not temp_b(31 downto 16)+1;end if;s<=temp_a(15 downto 0); y<=temp_a(31 downto 16);end process;end architecture fd5;5. 7段譯碼器的vhdl語言描述:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee

45、.std_logic_unsigned.all;entity numdecoder is port(reset:in std_logic; inclk:in std_logic; innum:std_logic_vector(7 downto 0); outnum:buffer std_logic_vector(3 downto 0); outflag:out std_logic); end;architecture behave of numdecoder isbegin process(inclk,reset) begin if reset='1'then outnum&l

46、t;="0000" elsif inclk'event and inclk='1'then case innum is when"00000001"=>outnum<="0000"outflag<='1' -按下第一個鍵表示輸入0 when"00000010"=>outnum<="0001"outflag<='1' -以下類似 when"00000100"=>outnum<

47、="0010"outflag<='1' when"00001000"=>outnum<="0011"outflag<='1' when"00010000"=>outnum<="0100"outflag<='1' when"00100000"=>outnum<="0101"outflag<='1' when"01000000&

48、quot;=>outnum<="0110"outflag<='1' when"10000000"=>outnum<="0111"outflag<='1' when"10000001"=>outnum<="1000"outflag<='1' when"10000010"=>outnum<="1001"outflag<='1'

49、 when others=>outnum<=outnum;outflag<='0' -不按鍵時保持 end case; end if; end process;end behave;6. 16位二進制數(shù)二進制轉(zhuǎn)換成千位、百位、個位以送至譯碼器vdecode.vhd:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity vdecode is-7段譯碼譯碼器做顯示 port(indata:in std_

50、logic_vector(3 downto 0); outdata:out std_logic_vector(0 to 6) );end entity vdecode;architecture behave of vdecode isbeginwith indata selectoutdata<="1111110"when"0000", -顯示0 "0110000"when"0001", -顯示1 "1101101"when"0010", -顯示2 "1111

51、001"when"0011", "0110011"when"0100", "1011011"when"0101", "1011111"when"0110", "1110000"when"0111", "1111111"when"1000", "1101111"when"1001", -顯示9 "0000000"

52、;when others;end architecture behave ;-*ctrview:process(c,clk)-二進制轉(zhuǎn)換成千位、百位、個位以送至譯碼器begin if c='1'then view1<="0000" view2<="0000" view3<="0000"view4<="0000" viewstep<=takenum; elsif clk'event and clk='1'then case viewstep is

53、when takenum=> ktemp<=keep; when thousand=> -產(chǎn)生千位數(shù)字 if ktemp>="0010001100101000"then view1<="1001"ktemp<=ktemp-"0010001100101000" elsif ktemp>="0001111101000000"then view1<="1000"ktemp<=ktemp-"0001111101000000" el

54、sif ktemp>="0001101101011000"then view1<="0111"ktemp<=ktemp-"0001101101011000" elsif ktemp>="0001011101110000"then view1<="0110"ktemp<=ktemp-"0001011101110000" elsif ktemp>="0001001110001000"then view1<=&qu

55、ot;0101"ktemp<=ktemp-"0001001110001000" elsif ktemp>="0000111110100000"then view1<="0100"ktemp<=ktemp-"0000111110100000" elsif ktemp>="0000101110111000"then view1<="0011"ktemp<=ktemp-"0000101110111000" el

56、sif ktemp>="0000011111010000"then view1<="0010"ktemp<=ktemp-"0000011111010000" elsif ktemp>="0000001111101000"then view1<="0001"ktemp<=ktemp-"0000001111101000" else view1<="0000" end if; viewstep<=hundred;-

57、產(chǎn)生百位數(shù)字 when hundred=> if ktemp>="0000001110000100"then view2<="1001"ktemp<=ktemp-"0000001110000100" elsif ktemp>="0000001100100000"then view2<="1000"ktemp<=ktemp-"0000001100100000" elsif ktemp>="0000001010111100

58、"then view2<="0111"ktemp<=ktemp-"0000001010111100" elsif ktemp>="0000001001011000"then view2<="0110"ktemp<=ktemp-"0000001001011000" elsif ktemp>="0000000111110100"then view2<="0101"ktemp<=ktemp-"0

59、000000111110100" elsif ktemp>="0000000110010000"then view2<="0100"ktemp<=ktemp-"0000000110010000" elsif ktemp>="0000000000011110"then view2<="0011"ktemp<=ktemp-"0000000000011110" if ktemp>="11001000"then vie

溫馨提示

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

評論

0/150

提交評論