計算器的設計_第1頁
計算器的設計_第2頁
計算器的設計_第3頁
計算器的設計_第4頁
計算器的設計_第5頁
已閱讀5頁,還剩33頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、目 錄第一章緒論21.1 課題來源及意義21.2 國內外發展狀況2第二章VHDL語言42.1 VHDL語言42.2 VHDL語言的特點42.3 VHDL語言設計實體的基本結構52.4 VHDL語言的實體52.5 VHDL語言的結構體62.6 VHDL程序設計約定7第三章基于EDA技術的計算器的設計83.1 計算器的設計思路83.2 系統組成框圖83.3計算部分的設計和實現93.3.1 加法器的設計93.3.2 減法器的設計123.3.3 乘法器的設計143.3.4 除法器的設計163.4 計算器輸入部分的設計和實現213.5 計算器顯示部分的設計和實現243.6位二進制數轉換成個位、十位、百位

2、的模塊263.7計算器的綜合設計293.7.1 整體的程序設計293.7.2 計算器的仿真波形31結 論37謝 辭38參 考 文 獻39第一章 緒論1.1 課題來源及意義 在當今以數字化和網絡化為特征的信息技術革命大潮中,電子技術獲得了飛速發展,現代電子產品滲透了社會的各個領域。現代電子產品的性能進一步提高,功能越來越復雜,集成化智能化的復雜程度越來越高,更新換代的節奏越來越快,開發風險也越來越大,而且正向著功能多樣化、體積小型化、功耗最低化的趨勢發展。所有這些,都給電子系統設計者帶來了前所未有的壓力,面對這種壓力,唯一的出路就是熟練掌握EDA技術,并獲得了其有力的支持。EDA的出現,極大地提

3、高了電路設計的效率和可靠性,減輕了設計者的勞動強度,EDA是電子產品開發研制的動力和加速器,是現代電子設計的核心?,F在生活中計算器的應用基本上可以說是無處不在,小到做買賣的商人的加減乘除的簡易計算器,還有學生群體中使用能夠進行復雜運算的多功能計算器??芍^是和生活息息相關。EDA的設計觀念是按照"自頂 向下"的設計方法,對整個系統進行方案設計和功能劃分,系統的關鍵電路用一片或幾片專用集成 電路(ASIC)實現,然后采用硬件描述語言(VHDL)完成系統行為級設計,最后通過綜合器和適配 器生成最終的目標器件。用EDA 來設計計算器,分別做加減乘除的底層文件、存儲文件、顯示文件以及

4、輸入文件。然后對其進行整合,層次分明,可以分別對底層文件進行測試,和傳統計算器的設計相比,在測試方面有很大的優勢。在EDA技術蓬勃的發展下,本次畢業設計選了EDA技術關于計算器的設計,不僅僅在原來EDA基礎編程的情況下,進行更深一步的研究,為了以后從事EDA方面的研究,有更深層次應用,所以通過EDA對計算器的設計,對EDA技術的語言程序、運用電路圖設計方法、以及各種不同底層程序的編輯對Quartus II軟件的運用更為自如。1.2 國內外發展狀況回顧近30年電子設計技術的發展歷程,可將EDA技術1分為三個階段。 (1) 七十年代為CAD階段,這一階段人們開始用計算機輔助進行IC版圖編輯和PCB

5、布局布 線,取代了手工操作,產生了計算機輔助設計的概念。 (2)八十年代為CAE階段,與CAD相比,除了純粹的圖形繪制功能外,又增加了電路功能設 計和結構設計,并且通過電氣連接網絡表將兩者結合在一起,以實現工程設計,這就是計算機輔助 工程的概念。CAE的主要功能是:原理圖輸入,邏輯仿真,電路分析,自動布局布線,PCB后分 析。 (3)九十年代為ESDA階段。盡管CAD/CAE技術取得了巨大的成功,但并沒有把人從繁重的 設計工作中徹底解放出來。在整個設計過程中,自動化和智能化程度還不高,各種EDA軟件界面千 差萬別,學習使用困難,并且互不兼容,直接影響到設計環節間的銜接。基于以上不足,人們開始

6、追求貫徹整個設計過程的自動化,這就是ESDA即電子系統設計自動化。 從目前的EDA技術來看,其發展趨勢是政府重視、使用普及、應用文泛、工具多樣、軟件功能強大。中國EDA市場已漸趨成熟,不過大部分設計工程師面向的是PC主板和小型ASIC領域,僅有小部分(約11%)的設計人員工發復雜的片上系統器件。為了與臺灣和美國的設計工程師形成更有力的競爭,中國的設計隊伍有必要購入一些最新的EDA技術。在信息通信領域,要優先發展高速寬帶信息網、深亞微米集成電路、新型元器件、計算機及軟件技術、第三代移動通信技術、信息管理、信息安全技術,積極開拓以數字技術、網絡技術為基礎的新一代信息產品,發展新興產業,培育新的經濟

7、增長點。要大力推進制造業信息化,積極開展計算機輔助設計(CAD)、計算機輔助工程(CAE)、計算機輔助工藝(CAPP)、計算機機輔助制造(CAM)、產品數據管理(PDM)、制造資源計劃(MRPII)及企業資源管理(ERP)等。有條件的企業可開展“網絡制造”,便于合作設計、合作制造,參與國內和國際競爭。開展“數控化”工程和“數字化”工程。自動化儀表的技術發展趨勢的測試技術、控制技術與計算機技術、通信技術進一步融合,形成測量、控制、通信與計算機(M3C)結構。在ASIC和PLD設計方面,向超高速、高密度、低功耗、低電壓方向發展。外設技術與EDA工程相結合的市場前景看好,如組合超大屏幕的相關連接,多

8、屏幕技術也有所發展。中國自1995年以來加速開發半導體產業,先后建立了幾所設計中心,推動系列設計活動以應對亞太地區其它EDA市場的競爭。在EDA軟件開發方面,目前主要集中在美國。但各國也正在努力開發相應的工具。日本、韓國都有ASIC設計工具,但不對外開放 。中國華大集成電路設計中心,也提供IC設計軟件,但性能不是很強。相信在不久的將來會有更多更好的設計工具有各地開花并結果。據最新統計顯示,中國和印度正在成為電子設計自動化領域發展最快的兩個市場,年復合增長率分別達到了50%和30%。EDA技術發展迅猛,完全可以用日新月異來描述。EDA技術的應用廣泛,現在已涉及到各行各業。EDA水平不斷提高,設計

9、工具趨于完美的地步。EDA市場日趨成熟,但我國的研發水平沿很有限,需迎頭趕上。第二章 VHDL語言2.1VHDL語言VHDL語言全稱是“超高速集成電路硬件描述語言(Very High Speed Intergated Circuit Hardwre Description Lnguage)”,它是隨著集成電路系統化和高度集成化的發展而逐步發展起來的,是一種用于數字系統的設計和測試的硬件描述語言。對于小規模的數字集成電路,通??梢杂脗鹘y的設計輸入方法(如原理圖輸入)來完成,并進行模擬仿真。但純原理圖輸入方式對于大型、復雜的系統,由于種種條件和環境的制約,其工作效率低,而且容易出錯,暴露出多種弊端

10、。在信息技術高速發展的今天,對集成電路提出了高集成度、系統化、微尺寸、微功耗的要求,因此,高密度可編程邏輯器件和VHDL便應運而生。2.2 VHDL語言的特點VHDL語言作為一種標準的硬件描述語言,具有結構嚴謹、描述能力強的特點2,支持從系統級到邏輯門級電路所有層次的設計,適合于復雜邏輯電路和系統的設計。作為一種高級硬件描述語言,VHDL語言有如下特點。(1)與其他的硬件描述語言相比,VHDL具有更強的行為描述能力。強大的行為描述能力是避開具體的器件結構、從邏輯行為上描述和設計大規模電子系統的重要保證。(2)VHDL具有豐富的仿真語句和庫函數,使得在任何大系統的設計早期,就能檢查系統的功能可行

11、性,隨時可對系統進行仿真模擬,使設計者對整個工程的結構和功能的可行性做出判斷。(3)用VHDL完成一個確定的設計,可以利用EDA工具進行邏輯綜合和優化,并自動把VHDL描述設計轉變成門級網表(根據不同的實現芯片)3。這種方式突破了門級設計的瓶頸,極大地減少了電路設計的時間和可能發生地錯誤,降低了開發成本。利用EDA工具的邏輯優化功能,可以自動地把一個綜合后的設計變成一個更小、更高速的電路系統。反過來,設計者還可以容易地從綜合和優化的電路中獲得設計信息,返回去更新修改VHDL設計描述,使之更加完善。(4)VHDL對設計的描述具有相對獨立性。設計者可以不懂硬件的結構,也不必顧及最終設計的目標器件是

12、什么,而進行獨立的設計。正因為VHDL得硬件描述與具體的工藝技術和硬件結構無關,所以VHDL設計程序的硬件實現目標器件有廣闊的選擇范圍。(5)由于VHDL具有類屬描述語句和子程序調用等功能,對于完成的設計,在不改變源程序的條件下,只需改變類屬參量或函數,就能輕而易舉地改變設計的規模和結構4。(6)VHDL本身的生命周期長。因為VHDL得硬件描述與工藝無關,不會因工藝變化而使描述過時。而與工藝技術有關的參數可通過VHDL提供的屬性加以描述,當生產工藝改變時,只需要修改相應程序中的屬性參數即可。2.3 VHDL語言設計實體的基本結構VHDL語言是一種強數據類型語言,它有三種數據對象,即常數、信號和

13、變量,每一種數據對象都要指定數據類型。VHDL的數據類型豐富5,既有數值數據類型和邏輯數據類型,又有位型和位向量型。既支持預定義的數據類型,又支持自定義的數據類型。這樣就給硬件描述帶來較大的自由度,使設計人員能夠方便地使用VHDL創建高層次的系統模型。VHDL語言將所設計的電路系統均看作一個設計實體,它可以是任意復雜的系統,也可以是一塊電路板、一個芯片、一個電路單元甚至一個門電路。如果將一個系統自上而下分層,劃分模塊,則各層的設計模塊都可以作為一個設計實體。不論是簡單的數字電路,還是復雜的數字系統,其基本構成是一致的,它們都是由實體說明(Entity)和結構體(Architecture)兩個最

14、基本的部分組成。實體說明部分用來描述該模塊或系統的接口信息,包括端口的數目、方向和類型,其作用相當于傳統設計方法中所使用的元件符號。結構體部分則描述該模塊的內部電路,對應于原理圖、邏輯方程6和模塊的輸入/輸出特性。兩者相結合就可以組成VHDL設計文件。一個設計試題可以包括一個或多個結構體,用于描述其邏輯結構和邏輯功能。2.4 VHDL語言的實體實體說明語句的格式如下:ENITTY 實體名ISPORT(端口表);END ENTITY 實體名;實體說明是VHDL程序設計中最基本的組成部分,主要用來描述設計實體7的外部接口信號,定義設計單元的輸入/輸出端口,是設計實體對外的一個通信界面,為可視部分。

15、但它并不描述設計的具體功能。端口名是賦予每個外部引腳的名稱,通常用一個或幾個英文字母,或者用英文字母加數字命名。端口模式(或端口方向)用來定義外部引腳的信號方向。在端口說明中,共有五種模式,分別為IN(輸入端口)、OUT(輸出端口)、INOUT(雙向端口)、BUFFER(緩沖端口)和LINKAGE(鏈接端口)。2.5 VHDL語言的結構體結構體8是設計實體的核心,它具有指明了設計實體的行為、元件及內部連接關系。如果將實體說明看成一個元件或電路的外部符號,則結構體就是這個元件或電路的內部原理圖。通過結構體構造設計實體的硬件結構、元件之間的連接,實現數據傳輸和變換,完成設計實體功能的具體實施。結構

16、體的格式如下:ARCHITECTURE 結構體名 OF 實體名 IS 結構體說明語句;BEGIN 功能描述語句;END ARCHITECTURE 結構體名;結構體名是給予結構體的名稱,它是該結構體唯一的名字,位于引導語句和OF語句之間。OF后面緊隨實體名,表明該結構體隸屬于哪個實體,并用IS來結束結構體的命名。結構體名原則上可以是任意合法的標識符,但為了便于程序的閱讀,通常都是根據該結構體所采用的描述方式對其命名,如Behavior(行為描述)、Dataflow(數據流描述)、Structure(結構描述)等。結構體說明語句位于ARCHITCTURE和BEGIN之間,用于定義結構體中所用的數據

17、對象和子程序,并對所引用的元件加以說明,即對結構體的功能描述語句中所用到的信號(SIGNAL)、類型(TAPY)、常數(CONSTANT)、元件(COMPONENT)、函數(FUNCTION)和過程(PROCEDURE)等加以說明和定義,但不能定義變量。應當注意,這些定義只能用于這個結構體中,如果要將這些定義用于其他實體或結構體,則需要將其作為程序包處理。2.6 VHDL程序設計約定為了便于程序的閱讀,此設計對VHDL程序設計特作如下約定:(1)語句結構描述中方括號“ ”內的內容為可選內容。(2)對于VHDL的編譯器和綜合器來說,程序文字的大小寫是不加區分的。本文中,VHDL中使用的關鍵詞用大

18、寫,對于由用戶自己定義的名稱等用小寫。(3)程序中的注釋使用橫線“”,橫線“”后的文字都不參加編譯和綜合。(4)為了便于程序的閱讀與調試,書寫和輸入程序時,使用層次縮進格式,同一層次的對齊,低層次的描述較高層次的描述縮進兩個字符。(5)考慮到MAX+PLUS要求源程序文件的名字與實體名必須一致,因此為了使同一個VHDL源程序文件能適應各個EDA開發軟件上的使用要求,各個源程序文件的命名均與其實體名一致。第三章 基于EDA技術的計算器的設計3.1 計算器的設計思路將計算器分為四個部分:計算部分、存儲部分、顯示部分和輸入部分。合理設計這四部分將有利于資源的合理應用。其中計算部分分為加減乘除法器,分

19、別設計底層程序。顯示部分為設計一個四位二進制數與七段譯碼相互轉換的程序。輸入部分為設計有0到9數字按鍵與加減乘除運算符號,以及等于號及清零鍵。3.2 系統組成框圖數字按鍵存儲部分顯示第一個數字顯示第二個數字運算符計算部分運算符或等號鍵運算結果顯示圖3-13.3計算部分的設計和實現計算部分就是運算的過程,此設計中主要包含的運算有加減乘除法。3.3.1 加法器的設計先構思一下加法器的流程圖,如圖3-2所示。根據流程圖,可以確定一個加法器要有被加數、加數和進位位的輸入端口。故設a端口為被加數,b端口為加數,ci為輸入進位。此加法器還有兩個輸出端口,分別是加法運算的最終結果輸出和進位位的輸出,故設s為

20、結果的輸出端口,co為進位的輸出端口。     被加數輸出進位位輸入進位位加數相加運算的最終結果輸出圖3-2 加法器的流程圖根據流程圖可以看出,當輸入被加數與加數后,兩個8位二進制數開始相加,之后,再與輸入進位位相加,這樣得到的最終結果就是加法器加法運算的最終結果。加法器9是基于EDA的計算器的設計中的基本邏輯器件,這里設計的8位二進制數的加法器,它是屬于多位加法器的范疇的。多位加法器按其進位方式的不同可以分為兩類:串行進位加法器和并行進位進位加法器。串行進位加法器是將多個一位全加級聯,低位全加器的進位輸出送給相鄰高位全加器作為進位輸入,以此構

21、成多位加法器。這種設計思路簡單明了且占用資源少,但運算速度較慢。并行進位方式則是在各位的加法環節之外,另外設有進位產生邏輯電路,各位的進位輸入信號同時產生,從而各位可以同時完成全加運算,輸出最后結果。并行進位方式具有較快的運算速度,但是相對于串行進位方式來說,卻往往占用更多的資源。尤其是當運算位數增加的時候,相同位數的并行進位和串行進位加法器的資源占用差距也越來越大。因此,常常需要設計者在運算速度和資源占用量之間做出折中平衡。實踐證明,4位二進制并行進位加法器和串行級聯加法器占用的資源幾乎相同。因此,可以用兩個4位二進制并行加法器級聯以構成8位二進制加法器,這是一種較為合理的選擇。4位二進制并

22、行進位加法器的源程序ADDER4B.VHD如下:LIBRARY IEEE; 庫以上這部分是設計中的全加器的VHDL語言的第一部分庫。一種用來存放預先已設計好的程序包10、數據集合體、元件的倉庫。庫存放的信息供用戶進行VHDL設計時調用,以提高設計效率。USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;以上這些是此加法器所要調用的程序包,是VHDL語言的第二部分。用VHDL語言編寫的共享文件11,定義了在設計結構體和實體說明中將要使用的常數、數據類型、子程序和設計好的電路單元等。ENTITY ADDER4B IS 4位二進制數

23、的加法器的實體 PORT(ci:IN STD_LOGIC; 進位位的輸入端口 a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); 一個4位二進制數的輸入端口(被加數) b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); 一個4位二進制數的輸入端口(加數) s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); 加法運算的結果輸出端口 co:OUT STD_LOGIC 進位位的輸出端口 );END ADDER4B;這部分是此加法器的VHDL語言的第三部分實體說明。定義電路單元的輸入、輸出引腳信號。程序的實體名稱可任意取名12(這里我取的是ADD

24、ER4B),但必須與VHDL程序的文件名稱相同(保存時的文件名)。實體說明以標示符ENTITY開始,以END結束。ARCHITECTURE behave OF ADDER4B IS 4位二進制數的加法器的結構體SIGNAL SINT:STD_LOGIC_VECTOR(4 DOWNTO 0); 類似于在芯片15內部定義的一個數據SIGNAL aa,bb:STD_LOGIC_VECTOR(4 DOWNTO 0);BEGIN aa<='0' & a; 拓展位數,使其成為最高位 bb<='0' & b; SINT<=aa+bb+ci;

25、相加 s<=SINT(3 DOWNTO 0); co<=SINT(4); 最高位為輸出進位位END behave;這是加法器的VHDL語言的第四部分結構體。用來描述電路內部和邏輯功能。結構體的名稱可任意取名(這里取的是behave),并以標示符ARCHITECTURE開頭,以END結尾。(注.以下的程序是部分的VHDL語言)根據以上設計的兩個4位二進制數的加法器,來設計兩個8位二進制數的加法器。頂層模塊:8位二進制并行進位加法器的部分程序ADDER4B.VHD如下:SIGNAL CARRY_OUT:STD_LOGIC;BEGIN U1:ADDER4B PORT MAP(ci=>

26、;ci,a=>a(3 DOWNTO 0),b=>b(3 DOWNTO 0),s=>s(3 DOWNTO 0),co=>CARRY_OUT); U2:ADDER4B PORT MAP(ci=>CARRY_OUT,a=>a(7 DOWNTO 4),b=>b(7 DOWNTO 4),s=>s(7 DOWNTO 4),co=>co);調用兩個4位二進制數加法的模塊。引腳分布圖如下圖3-3所示:圖3-3 8位加法器電路的引腳分布圖仿真波形圖(圖3-4):圖3-4 8位加法器的仿真波形從以上仿真波形中可以作出總結(“0”為低電平,“1”為高電平):若a

27、為“8”,b為“9”時,a+b=“17”,這時的ci為高電平,所以在此基礎之上還要再加“1”,得到s=“18”,這時最終的結果。因為最高位沒有進位,所以co為“0”即為低電平。3.3.2 減法器的設計首先設計一個兩個4位二進制數的減法器。根據以下圖3-5的4位全減器的流程圖可以看出,此減法器共需要兩個輸入端口和一個輸出端口。減法器的設計可以引用加法器,即通過對減數的求補16,再與被減數相加得到最終的 ,所以還要增設一個進位位輸入端口和進位位的輸出端口。所以可以設a端口為被減數,b端口為減數,ci為輸入借位位,s為結果的輸出端口,co為借位的輸出端口。減法器的運算過程中首先要引用加法器(上面的加

28、法器的程序中很詳細地介紹了加法器的設計,故減法器中加法器的描述部分在這里就省略了)。被減數減數求補4位全加器減法的運算結果顯示輸入進位求反對進位位求反進位位輸出結果圖3-5 4位全減器的流程圖減法器的部分VHDL語言描述:BEGINbtem(3 DOWNTO 0)<=NOT b(3 DOWNTO 0); 先把減數求反ctem(0)<=NOT ci; 輸入進位也求反,從而對減數求補碼g1:FOR i IN 0 TO 3 GENERATE 連用四位全加器17add:adder PORT MAP(a(i),btem(i),ctem(i),stem(i),ctem(i+1);END GEN

29、ERATE;s(3 downto 0)<=stem(3 downto 0); 把中間變量所得到的值賦給s,因為s是減法器運算出來的結果的輸出端口,通過s把計算結果輸出co<=NOT ctem(4); 求反輸出進位END behave;然后將4位全減器級聯起來,就可得到兩個8位二進制數的減法器。圖3-5是其原理圖:圖3-6 減法器的原理圖減法器的仿真波形:圖3-7 減法器的仿真波形圖從以上仿真波形圖3-7中可以作出總結(“0”為低電平,“1”為高電平):兩個數做減法,采用的是4位4位一減,若a為“00111000”,b為“00100010”時,首先將它們各自的低4位先做運算,先將b的

30、第四位求補,之后與a的第四位相加后得到第四位的運算結果“0110”,最高位有進位,但輸出時取反就 為“0”,再用同樣的方法計算出高四位的運算結果,得“0001”,之后還得加上一個低4位向高4位的進位“0”,所以最終結果s為“00010110”。3.3.3 乘法器的設計乘法器是數字系統中的基本邏輯器件,在很多應用中都會出現如各種濾波器的設計、矩陣的運算等。這里設計的是一個4×4的乘法器。根據乘法器的原理,可以繪出其流程圖(圖3-8),從流程圖中又可以看出可設a端口為被乘數(一個4位二進制數),b端口為乘數(一個4位二進制數),y為乘法運算的結果的輸出端口。被乘數乘數乘數的最低位每位二進

31、制數相與得到4次結果位對齊乘數從最低位左移一位二進制數相加最終結果3次圖3-8 乘法器的流程圖乘法器的部分VHDL語言描述:ENTITY mul IS PORT (a,b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); 被乘數與乘數的輸入y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) 乘積的輸出端口);END mul;ARCHITECTURE arch OF mul ISBEGINy(7 DOWNTO 0) <= a(3 DOWNTO 0)*b(3 DOWNTO 0); y=a×bEND arch;乘法器的引腳圖:圖3-9 乘法器

32、的引腳圖從乘法器的引腳圖中也可以看出,乘法器有兩個輸入引腳,分別來輸入乘數和被乘數,一個用來輸出運算結果的輸出端口,在封裝好的乘法器的器件中,就是來實現乘法運算的算法的。乘法器的仿真波形:圖3-10 乘法器的仿真波形從乘法器的仿真圖3-10中可以看出,y的輸出就是a與b的相乘后的結果。例如:若a為“0001”,b為“0010”,則根據左移原理可得出最終結果s,為“00000010”。結果完全正確。這里也可以證實兩個4位二進制數的乘積為一個8位二進制數。3.3.4 除法器的設計整個除法器是基于連減和移位操作的,連減實際上就是基于數學上除法的基本原理。例如,a÷b=c余數是d,就等價于a

33、c個b后得到d而且d<b;之所以可以使用移位操作,是因為所有運算的數都用二進制表示。所設計的除法器主要部分為一個控制移位的控制器,另有一個由全加器組成的4位減法器(可引用上面的減法器的設計)。又因為規定了結果為4位,控制器首先比較被除數的高4位與除數的大小,判斷是否溢出,溢出則退出,否則就做4位移位和減法得到結果。在每次做完減法以后都要判斷是否夠減,即判斷是否有借位,不夠得話,就恢復被減數,移一位再減。除法器的流程圖如下圖3-11所示:被除數除數高四位clk=1str=1相除在最低位上的到商位相與得到結果減法器余數溢出狀態被除數右移一位作為減數作為被減數有借位無借位03次左移圖3-11

34、除法器的流程圖設a端口為被除數,b端口為除數,clk為時鐘信號的輸入端口,str為啟動信號的輸入端口,此端口的作用是當啟動信號為高電平的時候有效,表示啟動了除法器開始作除法運算。s為除法運算所得到的商的輸出端口,y為除法運算中所得到的余數的輸出端口。該除法器的設計中使用了狀態機,它有5個狀態:start為開始狀態,one為第一次移位狀態,two為第二次移位狀態,three為第三次移位狀態(正常運算結果的輸出狀態),error為溢出出錯狀態。在除法器的設計中引用了減法器。ain用來寄存被除數,bin用來寄存除數,atem為減法器的被減數輸入,btem為減法器的減數輸入,stem用來計算內存結果,

35、citem為減法器的借位輸入,cotem為減法器的借位輸出。除法器的VHDL語言描述的部分程序:BEGINp2:PROCESS(clk)VARIABLE n:INTEGER range 0 to 3; 移位次數計數值BEGINIF clk'EVENT AND clk='1'THEN 時鐘脈沖為高電平時,狀態開始轉換CASE state IS 有限狀態機的使用WHEN start=> 開始狀態IF str='1'THEN 啟動信號為高電平的時候有效 state<=one; 進入第一次移位狀態 atem(3 DOWNTO 0)<=a(7 D

36、OWNTO 4); 把被除數的高4位放到減法器的被減數端口 btem(3 DOWNTO 0)<=b(3 DOWNTO 0); 把除數放到減法器的減數端口 ain(7 DOWNTO 0)<=a(7 DOWNTO 0); 寄存被除數 bin(3 DOWNTO 0)<=b(3 DOWNTO 0); 寄存除數END IF; WHEN one=> 第一次移位 IF cotem='0'THEN state<=error; 進入溢出出錯狀態 ELSE ain(3 downto 1)<=ain(2 downto 0); ain(0)<=not cote

37、m; 在最低位接受該位商值 atem(3 downto 0)<=ain(6 downto 3); 除數寄存器高4位輸入到減法器,作為被減數 state<=two; 進入第二次移位的狀態 END IF; WHEN two=> 第二次移位 IF n=2 THEN state<=three; 進入第三次移位狀態 n:=0; ELSE state<=two; n:=n+1; END IF; IF cotem='1'THEN atem(3 DOWNTO 1)<=stem(2 DOWNTO 0); ELSE atem(3 DOWNTO 1)<=at

38、em(2 DOWNTO 0); END IF; ain(3 DOWNTO 1)<=ain(2 DOWNTO 0); ain(0)<=ain(3); atem(0)<=ain(3);WHEN three=> 第三次移位 s(3 DOWNTO 1)<=ain(2 DOWNTO 0); s(0)<=NOT cotem; IF cotem='0'THEN y(3 DOWNTO 0)<=atem(3 DOWNTO 0); ELSE y(3 DOWNTO 0)<=atem(3 DOWNTO 0); END IF; atem(3 DOWNTO

39、0)<="0" btem(3 DOWNTO 0)<="0" state<=start; WHEN error=> 溢出狀態 state<=start; 回到開始狀態 atem(3 DOWNTO 0)<="0" btem(3 DOWNTO 0)<="0"END CASE;END IF;END PROCESS p2;citem<='0' 借位位輸入端為0U1:suber PORT MAP(atem,btem,citem,stem,cotem);END be

40、have;除法器的引腳圖:圖3-12 除法器的引腳圖除法器的仿真波形圖之一:圖3-13 除法器的仿真波形之一除法器的仿真波形圖之二:圖3-14 除法器的仿真波形之二在以上兩幅除法器的仿真圖中,我舉了好多的例子的除法運算。在啟動信號為低電平的時候,整個除法器清零。在啟動信號str為高電平時,除法器開始了運算。仿真圖3.12是整除的運算,沒有余數。如在02H÷1H的除法運算中,得到的商為2H,余數為0H,說明02H能被1H整除。在仿真圖3.13中也舉了不能被整除的除法。如04H÷8,商為0H,余數4H。3.4 計算器輸入部分的設計和實現計算器輸入部分的設計最要是按鍵譯碼電路的設

41、計和實現。流程圖如圖3-12所示:reset=1=0清零無按鍵動作按鍵顯示所按下的鍵對應的數字(第一個按鍵對應的是0的顯示,以此類推,到按下第十個鍵的時候對應的是9)有按鍵動作clk時鐘脈沖圖3-15 數字按鍵譯碼電路的流程圖下面的程序是數字按鍵譯碼電路的VHDL語言描述。在該程序中,可以設reset是異步復位信號的輸入端口,inclk是時鐘信號的輸入端口,innum端口用來表示輸入的按鍵向量,outnum端口用來表示輸入的按鍵動作對應的輸出數字,outflag端口用來輸出是否有按鍵動作。數字按鍵譯碼電路的部分VHDL語言描述:BEGIN PROCESS(inclk,reset) BEGIN

42、IF reset='1'THEN 異步復位信號為高電平的時候 outnum<="0000" 把“0000”賦值給數字的輸出端口 ELSIF inclk'EVENT AND inclk='1'THEN 在異步復位信號reset為低電平時,而時鐘信號為上升沿(有效電平)的時候 CASE innum IS WHEN"0000000001"=>outnum<="0000"outflag<='1' 按下一個鍵表示輸入為0 WHEN"0000000010&q

43、uot;=>outnum<="0001"outflag<='1' 按下第二個鍵表示輸入為1 WHEN"0000000100"=>outnum<="0010"outflag<='1' 按下第三個鍵表示輸入為2 WHEN"0000001000"=>outnum<="0011"outflag<='1' 按下第四個鍵表示輸入為3 WHEN"0000010000"=>outnum

44、<="0100"outflag<='1' 按下第五個鍵表示輸入為4 WHEN"0000100000"=>outnum<="0101"outflag<='1' 按下第六個鍵表示輸入為5 WHEN"0001000000"=>outnum<="0110"outflag<='1' 按下第七個鍵表示輸入為6 WHEN"0010000000"=>outnum<="0111

45、"outflag<='1' 按下第八個鍵表示輸入為7 WHEN"0100000000"=>outnum<="1000"outflag<='1' 按下第九個鍵表示輸入為8 WHEN"1000000000"=>outnum<="1001"outflag<='1' 按下第十個鍵表示輸入為9 WHEN OTHERS=>outnum<=outnum;outflag<='0' 不按鍵時保持 數字

46、按鍵譯碼電路的引腳圖圖:圖3-16 數字按鍵譯碼電路的引腳圖從下圖3-17數字按鍵譯碼電路的仿真波形中可以看到要得到的結果,也證實了程序的正確性,如輸入按鍵為“0000010000”時,所對應的是第五個按鍵為高電平,所以應該顯示數字再看輸出端口輸出的數字確實為4,所以此程序正確。其實,這個程序主要實現的是按下什么就輸出什么。一共有十個位,初始值都為低電平“0”,當按下哪個位時哪個位上的電平就跳為高電平(有且僅有一個為高電平),這時就有相應的輸出。那十個位分別對應的是09這十個數字,所以當第一個位(從左往右位數依次增高)為高電平時顯示0,第十個位上位高電平時,相應的顯示為9。如果按下的鍵是加號、

47、減號、乘號、減號或者是等于號時,也是不顯示的,所以此程序稱為數字按鍵譯碼電路。圖3-17 數字按鍵譯碼電路的仿真波形3.5 計算器顯示部分的設計和實現計算器顯示部分的設計和實現,實際上就是7段譯碼器的設計和實現,其VHDL語言描述如下所示。在這段程序中,indata是輸入4位二進制數的端口,outdata是輸出7位譯碼的端口,用WITH語句來實現譯碼。7段譯碼器的部分VHDL語言描述BEGINWITH indata SELECToutdata<="1111110"WHEN"0000", 0的顯示,十六進制數顯示為7E "0110000&q

48、uot;WHEN"0001", 1的顯示,十六進制數顯示為30 "1101101"WHEN"0010", 2的顯示,十六進制數顯示為6D "1111001"WHEN"0011", 3的顯示,十六進制數顯示為79 "0110011"WHEN"0100", 4的顯示,十六進制數顯示為33 "1011011"WHEN"0101", 5的顯示,十六進制數顯示為5B "1011111"WHEN"0

49、110", 6的顯示,十六進制數顯示為5F "1110000"WHEN"0111", 7的顯示,十六進制數顯示為70 "1111111"WHEN"1000", 8的顯示,十六進制數顯示為7E "1111011"WHEN"1001", 9的顯示,十六進制數顯示為7B "0000000"WHEN OTHERS; 其它的輸入按鍵均不顯示7段譯碼器的引腳圖:圖3-18 7段譯碼器的引腳圖7段譯碼器的仿真波形:圖3-19 7段譯碼器的仿真波形輸入什么數,就

50、對應地輸出什么數。利用7段譯碼管來顯示。7段譯碼管的基本結構:agbefcd圖3-20 7段譯碼管的基本結構從以上結構圖3-19中可以看出,十六進制數7E的二進制數為1111110,也就是說a、b、c、d、e、f的顯示管亮起來(“1為燈亮”,“0”為燈不亮),而g顯示不亮,即所得數字在數碼管(7段譯碼管)上的顯示就是0。以此類推,“0110000”顯示的是1,“1101101”顯示的是2,“1111001”顯示的是3,“0110011”顯示的是4,“1011011”顯示的是5,“1011111”顯示的是6,“1110000”顯示的是7,“1111111”顯示的是8,“1111011”顯示的是9

51、。3.6位二進制數轉換成個位、十位、百位的模塊這個設計中,使用一個8位二進制寄存器來存放運算結果,因此要將它們顯示出來,就得將8位二進制數轉換成個位、十位和百位。流程圖如下:清零位(c)c=1c=0全部清零取數產生個位上的數產生十位上的數產生百位上的數做相應地減法圖3-21 8位二進制數轉換成個位、十位、百位的模塊的流程圖這里使用一個有限狀態機來將8位二進制數轉換成各位數,每一位數位都使用一個4位二進制數寄存器,百位使用view1,十位使用view2,個位使用view3,00001001分別代表十進制數的09。狀態機有4個狀態,即:取數狀態、產生百位數狀態、產生十位數狀態和產生個位數狀態。以下

52、程序是8位二進制數轉換成個位、十位、百位的過程作為一個進程的VHDL語言描述。8位二進制數轉換成個位、十位、百位的進程:BEGIN IF c='1'THEN view1<="0000" view2<="0000" view3<="0000" viewstep<=takenum; ELSIF clk'EVENT AND clk='1'THEN CASE viewstep IS WHEN takenum=> ktemp<=keep; viewstep<=hu

53、ndred; WHEN hundred=> IF ktemp>="11001000"THEN 如果ktemp大于200 view1<="0010"ktemp<=ktemp-"11001000"百位為2,ktemp200 ELSIF ktemp>="01100100"THEN 如果ktemp大于100 view1<="0001"ktemp<=ktemp-"01100100"百位為1,ktemp100 ELSE view1<=&qu

54、ot;0000" 百位為0 END IF; viewstep<=ten; WHEN ten=> 產生十位數字 IF ktemp>="01011010"THEN 當ktemp大于90的時候 view2<="1001"ktemp<=ktemp-"01011010" 十位上賦值為9,ktemp90 ELSIF ktemp>="01010000"THEN 當ktemp大于80時 view2<="1000"ktemp<=ktemp-"01010000" 十位為8,ktemp80 ELSIF ktemp>="01000110"THEN 當ktemp大于70時 view2<="0111"ktemp<=ktemp-"01000110"十位為7,ktemp70 ELSIF ktemp>="00111100"

溫馨提示

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

評論

0/150

提交評論