第一篇:EDA綜合實驗設計報告
Beijing Jiaotong University
EDA實驗設計報告
指導老師:劉彪
學
院:電子信息工程學院 姓
名:黃家維 學
號:13213012 班
級:電子1301
實驗地點:電氣樓406
實驗日期:2014年5月29日星期四
實驗一熟悉QuartusII軟件的安裝及使用(4學時)
我們通過下載及安裝,可在電腦上運行Altera Quartus II。打開軟件,新建一個工程,在工程底下新建一個VHDL File,即可實現編程功能。編完程序后點擊Start Compilation可試運行程序,待編寫的程序運行無誤后,再在此工程下新建一個Vector Waveform File,給程序中的輸入變量賦值,保存后點擊Start Simulation即可實現程序的仿真。實驗
二、組合邏輯電路的設計 實驗方案設計、實驗方法、1.實驗方案
8-3優先編碼器的VHDL描述有多種方法,設計過程中可以根據真值表采用case…when語句、with…select語句、if…then結構等多種手段實現,也可以根據真值表分析輸入輸出間的邏輯關系,根據邏輯關系寫出其布爾表達式,根據布爾代數式調用基本邏輯門元件實現8-3優先編碼器。
本實驗中根據真值表用if-then結構實現8-3優先編碼器 2.實驗方法
首先根據前文所述,對照真值表的列出的不同輸入邏輯狀態,分情況依次輸出于輸入的對應關系,而后編譯綜合,由開發系統自行實現電路功能。實驗步驟
1.設計輸入 利用FILENew菜單輸入VHDL源程序,創建源文件 2.設計項目的創建 1)原文件存儲…..2)利用FILEProjectSet Project… 3.設計編譯 ….4.器件選擇及管腳分配 …..5.設計仿真 …..6.時序分析 …..7.編程下載(可選)….LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ENCODER IS
PORT(D:IN TO 7);
A:OUT STD_LOGIC_VECTOR(0 TO 2));END;ARCHITECTURE XIANI OF ENCODER IS BEGIN PROCESS(D)BEGIN IF
(D(7)='0')THEN A<=“111”;
ELSIF(D(6)='0')THEN A<=“110”;
STD_LOGIC_VECTOR(0
ELSIF(D(5)='0')THEN A<=“101”;
ELSIF(D(4)='0')THEN A<=“100”;
ELSIF(D(3)='0')THEN A<=“011”;
ELSIF(D(2)='0')THEN A<=“010”;
ELSIF(D(1)='0')THEN A<=“001”;
ELSIF(D(0)='0')THEN A<=“000”;
ELSE A<=“ZZZ”;
END IF;END PROCESS;END;
1用CASE語句設計一個4-16譯碼器。設計思路:
通過case語句可實現使能端的控制及4-16譯碼器的功能,即輸入一個四位二進制數,即可使輸出的16個端口中相應的端口電平發生變化。用case語句來實現譯碼器中相應數值選擇的功能恰到好處。程序:
其中實體名為SB2,when “0000”=> outt(15 downto 0)<=“***0”等語句即可實現從0011譯碼到第4位輸出發生變化。具體程序如下: library ieee;use ieee.std_logic_1164.all;entity SB2 is
port(inn:in std_logic_vector(3 downto 0);
shi:in std_logic;
outt:out std_logic_vector(15 downto 0));end entity SB2;architecture sb of SB2 is
begin process(inn,shi)begin if shi='1' then case inn is when “0000”=>
outt(15 0)<=“***0”;when “0001”=>
outt(15 0)<=“***1”;when “0010”=>
outt(15 0)<=“***1”;when “0011”=>
outt(15 0)<=“***1”;when “0100”=>
outt(15 0)<=“***1”;when “0101”=>
outt(15 0)<=“***1”;when “0110”=>
outt(15
downto
downto
downto
downto
downto
downto
downto 0)<=“***1”;when “0111”=>
outt(15 0)<=“***1”;when “1000”=>
outt(15 0)<=“***1”;when “1001”=>
outt(15 0)<=“***1”;when “1010”=>
outt(15 0)<=“***1”;when “1011”=>
outt(15 0)<=“***1”;when “1100”=>
outt(15 0)<=“***1”;when “1101”=>
outt(15 0)<=“***1”;
downto
downto
downto
downto
downto
downto
downto when “1110”=> outt(15 downto 0)<=“***1”;when “1111”=>
outt(15
downto 0)<=“***1”;when others
=>outt(15
downto 0)<=“***1”;end case;end if;end process;end architecture;仿真波形:
當輸入inn為0000時,輸出outt中的第16個端口變為低電平,即實現了譯碼的功能。實際仿真波形如下圖。
實驗3:時序電路設計
設計4位二進制同步加/減法可逆計數器,其中 輸入: clr:
異步清零(高電平有效)clk:
時鐘輸入
d3-d0:
4位二進制數輸入端 updown:
加/減法控制信號(‘1’加,‘0’減)輸出: q3-q0:
4位二進制計數輸出 co:
進位輸出 bo:
借位輸出 設計思路:
用if語句實現清零及加減法的選擇。若選擇updown=1,則當時鐘輸入為高電平時輸入的d就加1,當d=1111時進位輸出co就變1,最后將d中的數送給q來輸出,以達到4位二進制同步加/減法可逆計數器的設計。程序:
其中實體名為
CTRDIV16,程序中兩個關鍵的if語句即可實現加減法的控制及進位、借位的輸出。具體程序如下: library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;entity CTRDIV16 is
port(clk:in STD_LOGIC;
updown:in STD_LOGIC;
clr:in STD_LOGIC;
q:out STD_LOGIC_VECTOR downto 0);
co,bo:out std_logic);end CTRDIV16;
(3 architecture sbb of CTRDIV16 is signal d:std_logic_vector(3 downto 0);begin process(clk,clr,updown)begin if clr='1' then
d<=“0000”;elsif clk'event and clk='1' then
if updown='1' then
d<=d+'1';
co<='0';
bo<='0';
else
d<=d-'1';
co<='0';
bo<='0';
end if;
if d=“1111” and updown='1' then
co<='1';
bo<='0';
end if;
if d=“0000” and updown='0' then
bo<='1';
co<='0';
end if;end if;end process;process(d)begin q<=d;end process;end sbb;仿真波形:
若選取updown=1(加法),通過波形即可看出,該程序已經實現了d的加法運算,同時在d=1111時,進位輸出co跳轉一次,即有一個進位。
若選取updown=0(減法),該程序也實現了d的減法運算,同時在d=0000是,借位輸出bo跳轉一次,即有一個借位輸出。具體仿真波形如下。
updown=1(加法)updown=0(減法)
實驗感想:
quartusII可以模擬硬件設計,即為硬件程序燒寫模擬軟件,操作簡單,易于運行。它讓我熟練了實際硬件的使用語言和邏輯順序,并能實現一些簡單硬件的程序編制和模擬仿真,使我對VHDL和EDA有了更加具體而深刻的認識,我認為這次實驗設計對使我獲益匪淺,一定會為我以后的學習生活帶來不少的益處。
第二篇:數字鐘實驗設計報告
數字鐘實驗設計報告
數字鐘設計
一 設計任務
1.基本功能:以數字形式顯示時、分、秒的時間,小時的計時要求為“24翻1”,分和秒的計時要求為60進位; 2.擴展功能:校時、正點報時及鬧時功能;
二 電路工作原理及分析
數字電子鐘主要由以下幾個部分組成:秒信號發生器,時、分、秒計數器,顯示器,校時校分電路,報時電路。
2.1數字鐘的基本邏輯功能框圖
圖1 數字鐘的基本邏輯功能框圖
2.2振蕩器的設計
振蕩器是數字鐘的核心。振蕩器的穩定度及頻率的精確度決定了數字鐘的準確程度。通常選用石英晶體構成振蕩器電路。一般來說,振蕩的頻率越高,計時精度越高。如果精度要求不高則可以采用由集成邏輯門與R、C組成的時鐘源振蕩器或集成電路計時器555與R、C組成的多諧振蕩器,電路參數如圖2所示.接通電源后,電容C1被充電,當Vc上升到2Vcc/3時,使vo為低電平,同時放電三極管T導通,此時電容C1通過R2和T放電,Vc下降。當Vc下降到Vcc/3時,vo翻轉為高電平。電容C1放電所需時間為 tpL=R2ln2≈0.7R2C1 當放電結束時,T截止,Vcc將通過R1、R2向電容器 C1充電,一;Vc由Vcc/3上升到2Vcc/3所需的時間為
當平。如得到 振 故
tpH=(R1+R2)C1ln2≈0.7(R1+R2)C Vc 上升到2Vcc/3 時,電路又翻轉為低電此周而復始,于是,是在電路的輸出端就一個周期性的矩形波。其振蕩頻率為 f=1/(tpL+tpH)≈1.43/[(R1+2R2)C] 蕩周期:T=T1+T2=(R1+2R2)C1In2 得 R1+2R2=T/C1In2=0.142k 選定R1=0.1K,R2=0.021k
圖2 555振蕩器(圖中R1,R2值不為實際值)
圖3 555振蕩器產生的波形
2.3時、分、秒計數器電路
時、分、秒計數器電路由秒個位和秒十位,分個位和分十位及時個位和時十位計數器電路構成,其中秒個位和秒十位計數器,分個位和分十位計數器為60進制計數器,而時個位和時十位為24進制計數器。
2.4校時電路
通過開關,觸發器,邏輯門組成的校時電路來校時。校時電路時用來對“時”、“分”、“秒”顯示數字進行校對調整的.三 數字電路的設計
3.1計數電路的設計
由2個74LS90計數器和4個74LS290計數器組成的時分秒的計數電路。
3.1.1六十進制計數電路
秒計數和分計數單元為60進制計數器,其輸出為8421BCD碼。采用十進制計數器74LS290來實現時間計數單元的計數功能。由圖可知,74LS90為異步清零計數器,有異步清零端12,13腳(高電平有效)。
圖4 六十進制計數器
(1)秒計數器電路的電路圖如圖4所示
秒個位計數單元為10進制計數器,無需進制轉換,當QAQBQCQD從1001變成0000時,U1 向U3 的輸入端發出一個脈沖信號,使秒十位進1位。
秒十位計數單元為6進制,當QAQBQCQD變成0110時,通過與QBQC相連的導線,給U3 兩個清零端一個信號,把它的兩個清零端都變成1,計數器的輸出被置零,跳過0110到1111的狀態,又從0000開始,如此重復,十位和個位合起來就是60進制。
(2)分計數器
分的個位和十位計數單元的狀態轉換和秒的是一樣的,只是它要把進位信號傳輸給時的個位計數單元,電路圖如圖4所示
3.1.2二十四進制計數器電路
時計數單元為24進制計數器,其輸出為8421BCD碼。采用十進制計數器74LS90來實現時間計數單元的計數功能。
時計數器電路的電路圖如圖5所示
圖5 二十四進制計數器
當“時”十位的QAQBQCQD為0000或0001時,“時”的個位計數單元是十進制計數器,當個位的QAQBQCQD到1010時,通過與非門使得個位74LS90上的清零端為0,則計數器的輸出直接置零,從0000開始。當十位的QAQBQCQD為0010時,通過與非門使得該74LS90的清零端為0,“時”的十位又重新從0000開始,此時的個位計數單元變成4進制,即當個位計數單元的QAQBQCQD為0100時,就要又從0000開始計數,這樣就實現了“時”24進制的計數。
3.2校時電路的設計
數字鐘應具有分校正和時校正功能,因此,應截斷分個位和時個位的直接計數通路,并采用正常計時信號與校正信號可以隨時切換的電路接入其中。如圖6所示,當開關J1按下時,直接給分個位計數器一個脈沖信號,使分計數器進1位,同時不影響數字鐘的運行。同理,由J2對時計數器進行校對。
圖6 校時校分電路
3.3 整點報時設計
仿廣播電臺正點報時電路的功能要求時:每當數字鐘計時快要到正點時發出聲響,通常按照4低音1高音的順序發出間斷聲響,以最后一聲高音結束的時刻是整點時刻。
每當數字鐘計時快要到正點時發出聲響,按照4低音1高音的頻率發出間 斷聲響,前4低音聲響頻率為500HZ,后1高音聲響頻率為1000HZ。并以最后一 聲高音結束的時刻為正點時刻。本設計中,報時電路采用TTL與非門。報時電路如圖1.5所示。4聲低音分別發生在59分51秒、53秒、55秒及57秒,最后一 聲高音發生在59分59秒,聲響均持續1秒。如表1.2所示。由表可得式1.1。只有當分十位的Q2M2Q0M2=11,分個位的Q3M1Q0M1=11,秒個位的Q2S2Q0S=11及秒個位的Q0S1=1時,音響電路才能工作。
3.4 報時電路的安裝與調試
按照原理圖及實物連線圖接線。報時音響電路采用三極管3DG130來推動喇叭。報時所需的500Hz和1000Hz音頻信號,分別取分頻器的500Hz輸出端和1000Hz輸出端。
四 主要芯片的技術參數
4.1 74LS90芯片
74LS90芯片結構及引腳分布如圖7所示,74LS90計數器是一種中規模的二一五進制計數器。它由四個主從JK觸發器和一些附加門電路組成,整個電路可分兩部分,其中FA觸發器構成一位二進制計數器;FD、FC、FB構成異步五進制計數器,在74LS90計數器電路中,設有專用置“0”端R1、R2和置位(置“9”)端S1、S2。
圖7 74LS90芯片
4.2 74LS290芯片
74LS190芯片的管腳分布如圖8所示,其中,R9(1)、R9(2)稱為置“9”端,R0(1)、R0(2)稱為置“0”端;A、B端為計數時鐘輸入端,QAQBQCQD為輸出端,NC表示空腳。74LS290具有以下功能:
置“9”功能:當R9(1)= R9(2)=1時,不論其他輸入端狀態如何,計數器輸出QAQBQCQD=1001,而1001(2進制)=9(10進制),故又稱為異步置數功能。
置“0”功能:當R9(1)和 R9(2)不全為1,并且R0(1)=R0(2)=1時,不論其他輸入端狀態如何,計數器輸出QAQBQCQD=0000,故又稱為異步清零功能或復位功能。
計數功能:當R9(1)和 R9(2)不全為1,并且R0(1)和R0(2)不全為1時,輸入計數脈沖,計數器開始計數。
圖8 74LS290芯片
五 心得體會
通過這次綜合試驗設計,大大提高了我分析問題的能力,同時提高了運用電工領域有關的軟件進行電路模擬仿真的能力,將自己在課堂上學到的數電知識得到充分發揮,解決了很多問題,同時學到了很多元件和芯片的各種用途及性能,從中學到了很多書上沒有明白的問題
本次的課程設計,是對所學的數電知識的一次綜合應用,既考驗了我的知識掌握程度,也鍛煉了我的動手能力。在此過程中,我學到很多新知識,對電工電子課程的學習也更有興趣了。雖然此次課程設計花費了一番功夫,卻讓我收獲了很多,讓我知道了學無止境,永遠不能滿足現有的知識,人生就像在爬山,一座山峰的后面還有更高山峰在等著你。
在這次數字電子鐘課程設計中,也非常感謝同學的幫助!
第三篇:EDA設計報告
EDA
多 功 能 數 字 時 鐘
專業:11級應用電子技術 班級:二班
學號:110372021307 姓名:賀成林 指導老師:祝宏
日期:2012年6月29日
一、實驗目的
1、課程設計是一實踐教學環節,是針對《數字電子技術》課程的要求,結合實踐對學生進行綜合設計性訓練,在自學和實踐訓練中培養學生理論聯系實踐和實踐動手能力,獨立地解決實際問題能力。
2、通過課程設計是使學生熟悉和了解可編程專用數字邏輯電路的設計、開發流程,熟悉和了解現代EDA設計工具,掌握數字電子系統層次化的設計方法。
已知條件:MAX+Plus軟件
基本功能:
1、以數字形式顯示時、分、秒的時間;
2、小時計數器為24進制;
3、分秒計數器為60進制。
二、實驗要求、綜合應用《數字電子技術基礎》課程中的理論知識去獨立地完成一個設計課題;
2、熟悉和了解現代EDA設計、編程、編譯、仿真及下載技術的全過程。
三、EDA 技術介紹
1、EDA 技術概況
EDA 是電子設計自動化(Electronic Design Automation)的縮寫,在 20 世 紀 90 年代初從計算機輔助設計(CAD)、計算機輔助制造(CAM)、計算機輔助測試(CAT)和計算機輔助工程(CAE)的概念發展而來的。EDA 技術就是以計算機為工 具,設計者在 EDA 軟件平臺上,用硬件描述語言 HDL 完成設計文件,然后由計算機 自動地完成邏輯編譯、化簡、分割、綜合、優化、布局、布線和仿真,直至對于特 定目標芯片的適配編譯、邏輯映射和編程下載等工作。EDA 技術的出現,極大地提 高了電路設計的效率和可*性,減輕了設計者的勞動強度。
2、ALTERA QUARTUS II 軟件介紹
Quartus II 是 Altera 公司的綜合性 PLD 開發軟件,支持原理圖、VHDL、VerilogHDL 以及 AHDL(Altera Hardware Description Language)等多種 設計輸入形式,內嵌自有的綜合器以及仿真器,可以完成從設計輸入到硬件 配置的完整 PLD 設計流程。
四、關鍵詞
數字計數器、動態顯示、快速校分、整點報時、時段控制。
五、實驗步驟
1、秒計數器是60進制的。當下面的74161到9時等下一個脈沖來是向上面的74161計數,到5時將兩個74161共同預置。從而實現00—59秒的計數功能。
電路圖如下:
進行編譯及波形仿真,如下圖: 將上述文件保存并打包,如圖:
2、分計數器是60進制的。功能如秒計數器。其電路圖如下:
波形圖仿真及打包圖如下:
3、小時計數器是24進制的。當下面的74161到9時等下一個脈沖來是向上面的74161計數。但是等到上面的記到2時下面的將不能超過4,所以等上面的記到2,下面的記到4時就將兩個74161共同預置。從而實現00—24秒的計數功能。
原理圖如下:
仿真的波形圖及打包的文件圖如下:
4、校時。校時是通過加快時分的計數速度來快速校準時間的。實際上我們把秒脈沖cps加到分計數和時計數上,是他們加快計數速度。所以其中我們需要通過開關來選擇。
原理圖及打包圖如下:
5、時段控制:時段控制是通過7485集成電路的數據比較來控制的。
原理圖及打包圖如下:
6、整點報時:整點報時是通過整點時的二進制數據規律來報時的。
原理圖及打包圖如下:
7、將時分秒打包文件連成多功能數字電路圖如下:
8、多功能數字鐘硬件測試原理圖如下:
9、部分制作過程圖,如下:
六、實驗工具
裝有QuartusⅡ軟件的電腦,EDA開發板,相關EDA設計方面的書籍。
七、設計中遇到問題及解決方法
1、實驗后期的引腳分配及下載方法不當,實驗所用電腦沒有
quartus11.0 的 驅動。耗費時間較多。解決方法:參閱西安電子科技大學出版社出版的《數字電路設計及 Verilog HDL 實現》第 394 頁關于引腳分配和下載驗證的介紹;
2、下載驗證過程中時段控制部分有錯誤,原代碼在軟件上仿真沒有錯誤,但是下載到實驗板驗證時,出現錯誤。解決方法:通過去請教同學及查閱相關資料得到解決。
八、特點和實用性
利用 QuartusII 軟件,結合所學的數字電路的知識設計一個 24 時多功能數 字鐘,具有正常分、秒計時,動態顯示、快速校分、整點報時、時段控制的功能。分析整個電路的工作原理,分別說明各子模塊的設計原理和調試、仿真、編 程下載的過程,并對最終結果進行總結,最后提出在實驗過程中出現的問題和解 決的方案。通過實驗掌握一些邏輯組合器件的基本功能和用法,同時體會利用軟件設計 電路的方便快捷,避免硬件布線的繁瑣,提高效率。
九、心得體會
1、設計必須要有整體概念,提前熟悉軟件。剛開始時沒頭緒,不知道該怎 樣分塊,進度很慢,加上對軟件不是很熟悉,比如:封裝要注意哪些,哪些不能 運行,哪些是不正確的操作等等,走了很多冤枉路。
2、設計的模塊要分塊調試,免得等所有都完工了再調試出錯,那樣的話很 難確定是什么出錯,更加沒頭緒。有必要的話做一部分后就送到平臺上調試,這 樣會大大減少出錯率。
3、沒有硬件軟件化的概念,開始設計時沒有總體的規劃,不知道什么是可行 的,什么是封裝,怎樣使搭配組合最優化。
4、遇到問題先自己摸索,查閱資料要有技巧,避免沒有目的和思路。明白 自己要解決什么問題。同時請教老師,和同學交流。良好的溝通很重要。針對本次的畢業設計,用我國著名的數學家的話概括一下我的感受: “科學上沒有平坦的大道,真理長河中有無數礁石險灘。只有不為畏攀登的采藥者,只有不怕 巨浪的弄潮兒,才能登上高峰采得仙草,深入水底覓得驪珠。”
十、參閱教材及文獻
1、蔣立平編著《數字電路》.南京理工大學翻印;
2、南京理工大學電子技術中心編著.《EDA 設計實驗指導書》 南京理工大學,2008 年;
3、譚會生,張昌凡.《EDA 技術及應用》.西安電子科技大學出版社,2001年;
4、《數字電路設計及 Verilog HDL 實現》 西安電子科技大學出版社出版;
5、《電子線路實驗設計與仿真講義》。
第四篇:EDA實習報告
EDA實驗報告
系別:
班級:
姓名:
學號:
目錄
1.EDA介紹
2.Quartus II軟件介紹
3.實習任務
4.封裝引腳圖
5.設計程序
6.結果顯示
7.實習心得
1.EDA介紹
EDA是電子設計自動化(Electronic Design Automation)縮寫。EDA技術是以計算機為工具,根據硬件描述語言HDL(Hardware Description language)完成的設計文件,自動地完成邏輯編譯、化簡、分割、綜合及優化、布局布線、仿真以及對于特定目標芯片的適配編譯和編程下載等工作。硬件描述語言HDL是相對于一般的計算機軟件語言,如:C、PASCAL而言的。HDL語言使用與設計硬件電子系統的計算機語言,它能描述電子系統的邏輯功能、電路結構和連接方式。設計者可利用HDL程序來描述所希望的電路系統,規定器件結構特征和電路的行為方式;然后利用綜合器和適配器將此程序編程能控制FPGA和CPLD內部結構,并實現相應邏輯功能的的門級或更底層的結構網表文件或下載文件。目前,就FPGA/CPLD開發來說,比較常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL[1]。
幾乎所有適于大學生做的數字邏輯電路實驗都可以在計算機上利用EDA(Electronic Design Automatic—電子設計自動化)軟件進行設計、仿真,只有極少量外部配件不能在計算機上進行仿真。因此,在實驗前期階段,即實驗預習階段的主要應用工具是EDA軟件,利用EDA軟件可以設計、仿真實驗課題,進行虛擬實驗。通過虛擬實驗使實驗者在進入真實實驗前就能對預做的實驗有相當的了解,甚至可以預測到實驗的結果。這樣在實際做實驗時,可以把許多設計型實驗的難度降低,同時能有更多的時間讓實驗者動手做實驗,研究問題,提高實驗效率。當前數字電路設計已由計算機輔助設計進入到以計算機為主的設計時代。
2.Quartus II 是Altera公司的綜合性PLD開發軟件,支持原理圖、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多種設計輸入形式,內嵌自有的綜合器以及仿真器,可以完成從設計輸入到硬件配置的完整PLD設計流程。
Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設計的復雜性、加快了設計速度。對第三方EDA工具的良好支持也使用戶可以在設計流程的各個階段使用熟悉的第三放EDA工具。
此外,Quartus II 通過和DSP Builder工具與Matlab/Simulink相結合,可以方便地實現各種DSP應用系統;支持Altera的片上可編程系統(SOPC)開發,集系統級設計、嵌入式軟件開發、可編程邏輯設計于一體,是一種綜合性的開發平臺。
Maxplus II 作為Altera的上一代PLD設計軟件,由于其出色的易用性而得到了廣泛的應用。目前Altera已經停止了對Maxplus II 的更新支持,Quartus II 與之相比不僅僅是支持器件類型的豐富和圖形界面的改變。Altera在Quartus II 中包含了許多諸如SignalTap II、Chip Editor和RTL Viewer的設計輔助工具,集成了SOPC和HardCopy設計流程,并且繼承了Maxplus II 友好的圖形界面及簡便的使用方法。
3.1 設計信號發生器使其能在儀器上顯示正弦、三角、方波、鋸齒波(其中的兩種波形)
2設計頻率計使其能測出制定波形的頻率
4.波形發生器封裝引腳圖
5.波形發生器程序(正弦波,方波)
Boxing4
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY boxing4 IS PORT(RIN:in std_logic;
clk: IN std_logic;SINT:in std_logic_VECTOR(1 downto 0);--set:in std_logic;--_vector;--(1 downto 0);rs,rw,en,lcdon,lcdbon : OUT STD_LOGIC;YOUT:out std_logic_vector(7 downto 0);data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END boxing4;ARCHITECTURE fwm OF boxing4 IS
TYPE states IS(clear_display,set_initial,set_cgram,write_cgram,set_addram1,diaplay_cgram,set_addram2,diaplay_cgrom);--clear_display-清屏;--set_initial-初始化設置;--set_cgram-設置 cgram 地址;--write_cgram-字模寫入 cgram;--set_addram1-設置顯示 cgram 字符的 addram 地址;--diaplay_cgram-顯示 cgram 字符;--set_addram2-設置顯示 cgrom 字符的 addram 地址;--diaplay_cgrom-顯示 cgrom 字符 SIGNAL state:states;TYPE ram_array0 IS ARRAY(0 TO 7)OF STD_LOGIC_VECTOR(7 DOWNTO 0);--定義 ram_array0 為二維數組
TYPE ram_array1 IS ARRAY(0 TO 7)OF ram_array0;--定義 ram_array1 為三維數組 SIGNAL lcd_clk : STD_LOGIC;SIGNAL data1,data2,data3:INTEGER RANGE 0 TO 9;--signal n:std_logic;SIGNAL net1,net2:std_logic_vector(7 downto 0);--signal net3:std_logic;
COMPONENT choice4_1
PORT(s:in std_logic_vector(1 downto 0);
d1,d2: in std_logic_vector(7 downto 0);
y: out std_logic_vector(7 downto 0));END COMPONENT;COMPONENT fangbo PORT(clkf,rf:in std_logic;
qf:out std_logic_vector(7 downto 0));END COMPONENT;COMPONENT sin PORT(clksin,rsin:in std_logic;
da:out std_logic_vector(7 downto 0));END COMPONENT;BEGIN u1: fangbo PORT MAP(clkf=>CLK,rf=>RIN,qf=>net1);u2: sin PORT MAP(clksin=>CLK,rsin=>RIN,da=>net2);u3: choice4_1 PORT MAP(s=>SINT,d1=>net1,d2=>net2,y=>YOUT);en <=lcd_clk;rw<= '0';lcdon<='1';lcdbon<='1';data1<=1;data2<=2;data3<=5;
PROCESS(clk)
CONSTANT m : INTEGER:=50000;--50M 分頻到 1kHz。
VARIABLE cout : INTEGER RANGE 0 TO 50000000:=0;BEGIN
IF clk'EVENT AND clk='0' THEN cout:=cout+1;
IF cout<=m/2 THEN lcd_clk<='1';
ELSIF cout ELSE cout:=0; END IF; END IF; END PROCESS; PROCESS(lcd_clk)CONSTANT cgram : ram_array1:=(--自定義 8 個 5*8 字符的字模(X“00”,X“0E”,X“00”,X“0E”,X“00”,X“1F”,X“00”,X“00”),--SAN(X“04”,X“1F”,X“04”,X“07”,X“05”,X“09”,X“13”,X“01”),--FANG(X“00”,X“1f”,X“04”,X“04”,X“17”,X“14”,X“14”,X“1f”),--ZHENG(X“0E”,X“02”,X“0E”,X“08”,X“08”,X“0e”,X“02”,X“0e”),--ZUO XIAN(X“04”,X“1E”,X“04”,X“08”,X“1e”,X“04”,X“09”,X“1f”),--YOU XIAN(X“00”,X“13”,X“0A”,X“03”,X“1a”,X“02”,X“0a”,X“13”),--ZUO BO(X“08”,X“1F”,X“09”,X“1E”,X“14”,X“08”,X“14”,X“03”),--YOU BO(X“18”,X“18”,X“07”,X“08”,X“08”,X“08”,X“07”,X“00”)--℃字符數據存儲器); VARIABLE datacnt:INTEGER RANGE 0 TO 15; VARIABLE cnt: STD_LOGIC_VECTOR(7 DOWNTO 0); VARIABLE num:INTEGER RANGE 0 TO 7;BEGIN--wait until net3='0';RISING_EDGE(lcd_clk); IF RISING_EDGE(lcd_clk)THEN --if sint=“00”then case sint is when “11”=> CASE state IS WHEN clear_display=> rs<='0';data<=“00000001”;state<=set_Initial;--清屏 WHEN set_initial=> IF datacnt<3 THEN rs<='0';data<=“00111000”;datacnt:=datacnt+1;--設置功能:8 位,兩行,5×8/每字符,重復 3 次 ELSIF datacnt=3 THEN rs<='0';data<=“00000110”;datacnt:=datacnt+1;--顯示模式:完成一個字符碼傳送后,AC 自動加 1;顯 ELSIF datacnt=4 THEN rs<='0';data<=“00001100”;datacnt:=datacnt+1;--顯示控制:顯示開,光標關,光標不閃爍 ELSE rs<='0';datacnt:=0;state <= set_cgram; END IF; WHEN set_cgram=>rs<='0';--設置 CGRAM 字符地址 data<=“01000000”+cnt;state<=write_cgram;--設置 CGRAM 字符地址 000 IF num <8 THEN cnt:=cnt+“00001000”;--設置 CGRAM 字符地址加 1 END IF; WHEN write_cgram=> rs<='1';--在 指 定 的--CGRAM 字符地址寫入對應的 8 個 5*8 字符字模 data <= cgram(num)(datacnt);datacnt:=datacnt+1;state <= write_cgram;--寫入 CGRAM 字符地址 000 的 5*8--字符字模 IF datacnt=8 THEN num:=num+1;datacnt:=0;state <= set_cgram;--寫入下一個自定義--的 5*8 字符字模 IF num =7 THEN num:=0;cnt:=“00000000”;state<=set_addram1;--8 個 5*8 字符字模寫--入完成 END IF; END IF; WHEN set_addram1=>rs<='0';--設置 ADDRAM 地址 1 data<=“10000000”;state<=diaplay_cgram; WHEN diaplay_cgram=>rs<='1';--顯示 ADDRAM 地址對應的 CGRAM 字符 --if sint=“00”then IF datacnt=0 THEN data<=X“02”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“03”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data <= X“04”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“05”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“06”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“46”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“3a”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“31”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“30”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=X“4d”;datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“48”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1;--顯示 cgrom 中指定的 ELSIF datacnt=14 THEN data<=X“5a”;datacnt:=datacnt+1; ELSE data<=X“20”;datacnt:=0;state <= set_addram2; END IF; WHEN set_addram2=>rs<='0';--設置 ADDRAM 地址 2 data<=“11000000”;state<=diaplay_cgrom; WHEN diaplay_cgrom=>rs<='1'; IF datacnt=0 THEN data<=X“4A”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“41”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data<=X“43”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“4B”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data2+48,8);datacnt:=datacnt+1; ELSIF datacnt=14 THEN data<=CONV_STD_LOGIC_VECTOR(data1+48,8);datacnt:=datacnt+1; ELSE data<=X“56”;datacnt:=0;state <= set_addram1; END IF; END CASE; --end if; when “01”=> --elsif sint =“01”then CASE state IS WHEN clear_display=> rs<='0';data<=“00000001”;state<=set_Initial;--清屏 WHEN set_initial=> IF datacnt<3 THEN rs<='0';data<=“00111000”;datacnt:=datacnt+1;--設置功能:8 位,兩行,5×8/每字符,重復 3 次 ELSIF datacnt=3 THEN rs<='0';data<=“00000110”;datacnt:=datacnt+1;--顯示模式:完成一個字符碼傳送后,AC 自動加 1;顯 ELSIF datacnt=4 THEN rs<='0';data<=“00001100”;datacnt:=datacnt+1;--顯示控制:顯示開,光標關,光標不閃爍 ELSE rs<='0';datacnt:=0;state <= set_cgram; END IF; WHEN set_cgram=>rs<='0';--設置 CGRAM 字符地址 data<=“01000000”+cnt;state<=write_cgram;--設置 CGRAM 字符地址 000 IF num <8 THEN cnt:=cnt+“00001000”;--設置 CGRAM 字符地址加 1 END IF; WHEN write_cgram=> rs<='1';--在 指 定 的--CGRAM 字符地址寫入對應的 8 個 5*8 字符字模 data <= cgram(num)(datacnt);datacnt:=datacnt+1;state <= write_cgram;--寫入 CGRAM 字符地址 000 的 5*8--字符字模 IF datacnt=8 THEN num:=num+1;datacnt:=0;state <= set_cgram;--寫入下一個自定義--的 5*8 字符字模 IF num =7 THEN num:=0;cnt:=“00000000”;state<=set_addram1;--8 個 5*8 字符字模寫--入完成 END IF; END IF; WHEN set_addram1=>rs<='0';--設置 ADDRAM 地址 1 data<=“10000000”;state<=diaplay_cgram; WHEN diaplay_cgram=>rs<='1';--顯示 ADDRAM 地址對應的 CGRAM 字符 --if sint=“00”then IF datacnt=0 THEN data<=X“01”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“05”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data <= X“06”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“46”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“3a”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“31”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“30”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=X“4d”;datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“48”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1;--顯示 cgrom 中指定的 ELSIF datacnt=14 THEN data<=X“5a”;datacnt:=datacnt+1; ELSE data<=X“20”;datacnt:=0;state <= set_addram2; END IF; WHEN set_addram2=>rs<='0';--設置 ADDRAM 地址 2 data<=“11000000”;state<=diaplay_cgrom; WHEN diaplay_cgrom=>rs<='1'; IF datacnt=0 THEN data<=X“4A”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“41”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data<=X“43”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“4B”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data2+48,8);datacnt:=datacnt+1; ELSIF datacnt=14 THEN data<=CONV_STD_LOGIC_VECTOR(data1+48,8);datacnt:=datacnt+1; ELSE data<=X“56”;datacnt:=0;state <= set_addram1; END IF; END CASE; --end if; when others =>null; end case; END IF;end process;END fwm; Choice4-1 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; --程序包 entity choice4_1 is --定義實體 port(s:in std_logic_vector(1 downto 0); --信號選擇端口s d1,d2: in std_logic_vector(7 downto 0);--d1d2d3d4分別連接四個波形發生模塊 y: out std_logic_vector(7 downto 0));--定義輸出信號端口 end choice4_1;architecture behav of choice4_1 is --結構體 begin process(s) begin case s is --case when語句進行信號位的選擇 when “01”=>y<=d1; when “11”=>y<=d2; when others=>null; end case;end process; --進程結束 end behav; --結構體結束 fangbo library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity fangbo is port(clkf,rf:in std_logic;qf:out std_logic_vector(7 downto 0));end entity;architecture behav of fangbo is signal a:bit;begin process(clkf,rf)--計數分頻 variable cnt:integer range 0 to 256;begin if(rf='0')then a<='0';elsif clkf'event and clkf='1' then if cnt<255 then--進行分頻 cnt:=cnt+1;else cnt:=0;a<=not a;end if;end if;end process;process(clkf,a)--信號輸出 begin if clkf'event and clkf='1' then if a='1' then qf<=“11111111”;else qf<=“00000000”;end if;end if;end process;end behav; sin library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity sin is port(clksin,rsin:in std_logic;da:out BIT_vector(7 downto 0));end entity;architecture behav of sin is signal a:bit;begin process(clksin,rsin)--計數分頻 variable cnt:integer range 0 to 256;begin if(rsin='0')then a<='0';elsif clksin'event and clksin='1' then if cnt<4 then--進行分頻 cnt:=cnt+1;else cnt:=0;a<=not a;end if;end if;end process;--process(clksin,a)process(a) variable tmp:std_logic_vector(7 downto 0);variable d:BIT_vector(7 downto 0);begin--if a='0' then--d:=“00000000”;--elsif clksin'event and clksin='1' then if a'event and a='1' then if tmp=“00111111” then tmp:=“00000000”;else tmp:=tmp+1;end if;case tmp is when “00000000”=>d:=“11111111”;when “00000001”=>d:=“11111110”;when “00000010”=>d:=“11111100”;when “00000011”=>d:=“11111001”;when “00000100”=>d:=“11110101”;when “00000101”=>d:=“11101111”;when “00000110”=>d:=“11101001”;when “00000111”=>d:=“11100001”;when “00001000”=>d:=“11011001”;when “00001001”=>d:=“11001111”;when “00001010”=>d:=“11000101”;when “00001011”=>d:=“10111010”;when “00001100”=>d:=“10101110”;when “00001101”=>d:=“10100010”;when “00001110”=>d:=“10010110”;when “00001111”=>d:=“10001010”;when “00010000”=>d:=“01111100”;when “00010001”=>d:=“01100000”;when “00010010”=>d:=“01100011”;when “00010011”=>d:=“01010111”;when “00010100”=>d:=“01001011”;when “00010101”=>d:=“01000000”;when “00010110”=>d:=“00110101”;when “00010111”=>d:=“00101011”;when “00011000”=>d:=“00100010”;when “00011001”=>d:=“00011010”;when “00011010”=>d:=“00010011”;when “00011011”=>d:=“00001101”;when “00011100”=>d:=“00001000”;when “00011101”=>d:=“00000001”;when “00011110”=>d:=“00000001”;when “00011111”=>d:=“00000000”;when “00100000”=>d:=“00000000”;when “00100001”=>d:=“00000001”;when “00100010”=>d:=“00000001”;when “00100011”=>d:=“00001000”;when “00100100”=>d:=“00001101”;when “00100101”=>d:=“00010011”;when “00100110”=>d:=“00011010”;when “00100111”=>d:=“00100010”;when “00101000”=>d:=“00101011”;when “00101001”=>d:=“00110101”;when “00101010”=>d:=“01000000”;when “00101011”=>d:=“01001011”;when “00101100”=>d:=“01010111”;when “00101101”=>d:=“01100011”;when “00101110”=>d:=“01100000”;when “00101111”=>d:=“01111100”;when “00110000”=>d:=“10001001”;when “00110001”=>d:=“10010110”;when “00110010”=>d:=“10100010”;when “00110011”=>d:=“10101110”;when “00110100”=>d:=“10111010”;when “00110101”=>d:=“11000101”;when “00110110”=>d:=“11011001”;when “00110111”=>d:=“11011001”;when “00111000”=>d:=“11100001”;when “00111001”=>d:=“11101001”;when “00111010”=>d:=“11101111”;when “00111011”=>d:=“11110101”;when “00111100”=>d:=“11111001”;when “00111101”=>d:=“11111100”;when “00111110”=>d:=“11111110”;when “00111111”=>d:=“11111111”;when others=>null;end case;end if;da<=d SRL 1;--幅度調整 end process;end behav; 頻率計 1、頻率產生器: library ieee;use ieee.std_logic_1164.all;library lpm;use lpm.lpm_components.all;entity lpm_counter0 is port(clock: in std_logic;q: out std_logic_vector(26 downto 0));end lpm_counter0;architecture syn of lpm_counter0 is signal sub_wire0 : std_logic_vector(26 downto 0);component lpm_counter generic(lpm_direction : string; lpm_port_updown : string;lpm_type : string;lpm_width : natural);port(clock : in std_logic; q : out std_logic_vector(26 downto 0));end component;begin q <= sub_wire0(26 downto 0);lpm_counter_component : lpm_counter generic map(lpm_direction => “up”,lpm_port_updown => “port_unused”,lpm_type => “lpm_counter”,lpm_width => 27)port map(clock => clock,q => sub_wire0);end syn; 2、測頻控制信號發生器 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity testpl is port(clk:in std_logic;--1Hz信號 tsten:out std_logic;--計數器使能信號 clr_cnt:out std_logic;--計數器清零信號 load:out std_logic);--鎖存器輸出控制信號 end testpl;architecture art of testpl is signal div2clk:std_logic;begin process(clk)begin if clk'event and clk='1'then div2clk<=not div2clk;--div2clk為0.5Hz end if;end process;process(clk ,div2clk)begin if(clk='0'and div2clk='0')then clr_cnt<='1';--當div2clk與clk同時為零時計數器清零 else clr_cnt<='0';--當div2clk處于的高電平時計數器計數 end if;end process;load<=not div2clk;--鎖存器輸出與計數器使能信號反相 tsten<=div2clk;end art; 3、有時鐘使能的十進制計數器 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10 is port(clk,clr,en: in std_logic;--clk:計數器時鐘,clr:清零信號,en:計數使能信號 q: out std_logic_vector(3 downto 0);--q:4位計數結果輸出 c10: out std_logic);--計數進位 end cnt10;architecture art of cnt10 is signal cqi: std_logic_vector(3 downto 0);begin process(clk,clr)begin if clr='1' then cqi<=“0000”;--當輸入的clr_cnt為低電平1時清零 elsif clk'event and clk='1' then if en='1' then--當輸入的tesen為高電平1時允許計數 if(cqi<9)then cqi<=cqi+1;else cqi<=“0000”;--等于9則計數器清零 end if;--當輸入的tesen為低電平0時禁止計數,鎖定計數值 end if;end if;end process;--產生進位 process(cqi)begin if cqi=“1001” then c10<='1';--當加的9時產生進位輸出 else c10<='0';end if;end process;q<=cqi;end art;4、16位鎖存器 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity reg16b is port(load: in std_logic;--輸出鎖存控制信號 din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end reg16b;architecture art of reg16b is begin process(load,din)begin if load'event and load='1'then--load為高電平時teten為低電平,計數器禁止 dout<=din;--鎖存輸入的數據 end if;end process;end art; 5、數碼管控制器 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ledcom is port(clk:in std_logic;--數碼管掃描頻率 datain: in std_logic_vector(15 downto 0);--鎖存器輸入的16位信號 dataout: out std_logic_vector(3 downto 0);-輸出至譯碼器的4位信號 com: out std_logic_vector(3 downto 0));--輸出數碼管選擇信號 end ledcom;architecture art of ledcom is signal comclk: std_logic_vector(1 downto 0);begin--comclk同掃描頻率clk循環變化 process(clk)begin if rising_edge(clk)then if comclk>=3 then comclk <=“00”; else comclk<=comclk+1;end if;end if;end process;--數碼管選擇 process(comclk)begin case comclk is when “00” => com<=“1000”;when “01” => com<=“0100”;when “10” => com<=“0010”;when “11” => com<=“0001”;when others =>NULL;end case;end process;--對應數碼管的輸出 process(comclk,datain)begin case comclk is when “11”=> dataout<=datain(3 downto 0);when “10”=> dataout<=datain(7 downto 4);when “01”=> dataout<=datain(11 downto 8);when “00”=> dataout<=datain(15 downto 12);when others =>NULL;end case;end process;end art; 6、七段數碼管的譯碼器 library IEEE;use IEEE.std_logic_1164.all;entity ymq is port(d_in: in std_logic_vector(3 downto 0);--數碼管控制器輸入四位信號 d_out: out std_logic_vector(7 downto 0));--輸出8位信號 end ymq;--第8位d_out[7]為逗號 architecture art of ymq is begin process(d_in)begin case d_in is--第8位為1高電平逗號不顯示 when “0000” => d_out<=“11000000”;--0 when “0001” => d_out<=“11111001”;--1 when “0010” => d_out<=“10100100”;--2 when “0011” => d_out<=“10110000”;--3 when “0100” => d_out<=“10011001”;--4 when “0101” => d_out<=“10010010”;--5 when “0110” => d_out<=“10000010”;--6 when “0111” => d_out<=“11111000”;--7 when “1000” => d_out<=“10000000”;--8 when “1001” => d_out<=“10010000”;--9 when others =>NULL;end case;end process;end art; 7、元件聲明及例化將各個元器件依據設計相連 library ieee;use ieee.std_logic_1164.all;entity lx is port(clk: in std_logic;led: out std_logic_vector(7 downto 0);ledc: out std_logic_vector(3 downto 0));end lx;architecture art of lx is component lpm_counter0--待調用的頻率生成器端口定義 PORT(clock: IN STD_LOGIC;q: OUT STD_LOGIC_VECTOR(26 DOWNTO 0));end component;--十進制計數器 component cnt10--待調用的有時鐘使能的十進制計數器端口定義 port(clk,clr,en: in std_logic;q: out std_logic_vector(3 downto 0);c10: out std_logic);end component;--16位鎖存器 component reg16b--待調用的32位鎖存器端口定義 port(load: in std_logic;din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end component;--測頻控制器 component testpl--待調用的測頻控制信號發生器端口定義 port(clk:in std_logic;tsten:out std_logic;clr_cnt:out std_logic;load:out std_logic);end component;--數碼管選擇器 component ledcom--待調用的數碼管選擇器端口定義 port(clk:in std_logic;datain: in std_logic_vector(15 downto 0);dataout: out std_logic_vector(3 downto 0);com: out std_logic_vector(3 downto 0));end component;--譯碼器 component ymq--待調用的譯碼器端口定義 port(d_in: in std_logic_vector(3 downto 0);d_out: out std_logic_vector(7 downto 0));end component;signal clk1,clk2,clk3: std_logic;--clk1為1Hz信號,clk2為被測信號,clk3為數碼管掃描信號 signal tsten,clr,load: std_logic;signal c1,c2,c3,c4: std_logic;signal qout,rout: std_logic_vector(15 downto 0);signal datao: std_logic_vector(3 downto 0);begin u0:testpl port map(clk1,tsten,clr,load);u1:cnt10 port map(clk2,clr,tsten,qout(3 downto 0),c1);u2:cnt10 port map(c1,clr,tsten,qout(7 downto 4),c2);u3:cnt10 port map(c2,clr,tsten,qout(11 downto 8),c3);u4:cnt10 port map(c3,clr,tsten,qout(15 downto 12),c4);u5:reg16b port map(load,qout(15 downto 0),rout);u6:ledcom port map(clk3,rout,datao,ledc);u8:ymq port map(datao,led);u9:lpm_counter0 port map(clk,q(25)=>clk1,q(15)=>clk2,q(17)=>clk3);end art; 6.結果顯示 7.實習心得 貴州師范大學學生 實習報告 科目:EDA實習 專業: 電氣工程及其自動化 班級: 10電氣 姓名: 李啟應 學號: 101401010202 實驗項目名稱:數字電子鐘的設計 實驗項目性質:普通試驗 所屬課程名稱:VHDL程序設計 一、實驗目的 學習VHDL語言的一些基本特點。2 掌握VHDL程序的基本結構。3掌握VHDL程序設計方法。要能夠用vhdl語言讀懂并編寫eda程序,對eda設計的總體框架能有較好的把握,掌握各模塊的調用方式。 二、實驗內容和要求 設計一個數字時鐘,顯示時(2位),分(2位),秒(2位),具體要求是:具有時分秒計數顯示功能,以24小時循環計時;數碼管動態顯示時,分,秒;具有清零功能。 在軟件工具平臺上,進行VHDL語言的各模塊編程輸入、編譯實現和仿真驗證。 三、實驗主要儀器設備和材料 計算機,開發環境MAX-PLUSII,ZY11EDA實驗系統,VHDL語言。 四、實驗方法、步驟及結果測試 1、設計思路: 數字鐘的主體是計數器,它記錄并顯示接收到的秒脈沖個數,其中秒和分位60進制計數器,小時為24進制計數器,分別產生3位BCD碼。BCD碼經譯碼,驅動后接數碼顯示電路。 根據實驗要求,將設計分為5個主要部分,時功能模塊、分功能模塊、秒功能模塊、掃描儀功能模塊和7段LED功能模塊。在時、分、秒模塊中,包括復位和預置數,其主要思路如下: 秒鐘的模塊:設計一個60進制的計數器,以clk為其時鐘信號,每60個clk后產 生一個進位信號CF給分鐘模塊,作為分鐘進程的響應信號。秒鐘模塊VHDL程序見附錄1: 仿真波形如下: 封裝如下圖: 分鐘的模塊:同理于秒鐘的模塊,設計一個60進制的計數器,以CFM為其時鐘信號,每60個CFM后產生一個進位信號CFM給小時模塊,作為小時模塊進程的響應信號。分鐘模塊VHDL程序見附錄二: 仿真波形如下: 封裝如下圖: 小時的模塊:為24進制計數器,在分的進位信號CFM的激發下計數,從0到23的時候產生一個信號CFH,全部清0,重新開始計時。小時模塊VHDL程序見附錄三: 仿真波形如下: 封裝如下圖: 掃描儀模塊:在掃描儀內部,有一個3-8譯碼器的片選信號,當3-8譯碼器的片選信號為000時,片選信號選中7段LED模塊中的秒的個位,當3-8譯碼器的片選信號為001時,片選信號選中7段LED模塊中的秒的十位,當3-8譯碼器的片選信號為010時,片選信號選中7段LED模塊中的分的個位,當3-8譯碼器的片選信號為011時,片選信號選中7段LED模塊中的分的十位,當3-8譯碼器的片選信號為100時,片選信號選中7段LED模塊中的時的個位,當3-8譯碼器的片選信號為101時,片選信號選中7段LED模塊中的時的十位,就這樣動態掃描,當輸入的時鐘信號頻率很高的時候,就形成了我們的時鐘。 掃描儀模塊VHDL程序見附錄四: 仿真波形如下: 封裝如下圖: 7段LED模塊:根據動態掃描儀的片選信號來依次點亮我們所需的時間。7段LED模塊VHDL程序見附錄五: 仿真波形如下: 封裝如下圖: 綜合以上5大模塊,把它們用線連接起來就得到我們的總的電路圖:如下圖所示: 其工作原理為:掃描儀3-8譯碼器的片選信號根據時分秒的輸入選中7段LED模塊,然后再由時分秒中產生的3位BCD碼來輸出秒的個位,十位、時的個位,十位、小時的個位,十位。 4.總結: 在實驗這兩周的時間里,我們做過DC觸發器、DQ觸發器、3-8譯碼器、二選一電路和四選一電路等,最后綜合做了數字時鐘電路,通過這次實習,我對用VHDL來編程有了更深的了解,在要編程的時候,我學會了分模塊進行,因為一開始的時候設計一個時鐘系統比較麻煩,沒有分模塊之前總是會有差錯,而之后思路就會比較清晰,有明確的方案,在對照書本里的編程規則與語句,就完成了這次的設計,總之就是獲益良多。附錄1:秒鐘模塊VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity second is port(clk,reset:in std_logic;cf:out std_logic;second1_out:out std_logic_vector(3 downto 0);second10_out:out std_logic_vector(2 downto 0));end entity second;architecture one of second is signal second1n:std_logic_vector(3 downto 0);signal second10n:std_logic_vector(2 downto 0);begin second1_out<=second1n;second10_out<=second10n;process(clk,reset)begin if(reset='1')then second1n<=“0000”;second10n<=“000”;elsif(clk' event and clk='1')then if(second1n=“1001”)then 7 second1n<=“0000”;if(second10n=“101”)then second10n<=“000”;cf<='1';else second10n<=second10n+1;end if;else second1n<=second1n+1;end if;end if;end process;end architecture one;附錄二:分鐘模塊VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity minute is port(clk,reset:in std_logic;cf:out std_logic;minute1_out:out std_logic_vector(3 downto 0);minute10_out:out std_logic_vector(2 downto 0));end entity minute;architecture one of minute is signal minute1n:std_logic_vector(3 downto 0);signal minute10n:std_logic_vector(2 downto 0);begin minute1_out<=minute1n;minute10_out<=minute10n;process(clk,reset)begin if(reset='1')then minute1n<=“0000”;minute10n<=“000”;elsif(clk' event and clk='1')then if(minute1n=“1001”)then minute1n<=“0000”;if(minute10n=“101”)then minute10n<=“000”;cf<='1';else minute10n<=minute10n+1;end if;else minute1n<=minute1n+1;end if;end if;end process;end architecture one;附錄三:小時模塊VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity hour is port(clk,reset:in std_logic;hour1_out:out std_logic_vector(3 downto 0);hour10_out:out std_logic_vector(1 downto 0));end entity hour;architecture one of hour is signal hour1n:std_logic_vector(3 downto 0);signal hour10n:std_logic_vector(1 downto 0);begin hour1_out<=hour1n;hour10_out<=hour10n;process(clk,reset)begin if(reset='1')then hour1n<=“0000”;hour10n<=“00”;elsif(clk' event and clk='1')then if(hour1n=“1001”or(hour1n=“0011”and hour10n=“0010”))then hour1n<=“0000”;if(hour10n=“10”)then hour10n<=“00”;else hour10n<=hour10n+1;end if;else hour1n<=hour1n+1;end if;end if;end process;end architecture one;附錄四:掃描儀模塊VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity saomiaoyi is port(clk:in std_logic;reset:in std_logic;second1,minute1,hour1:in std_logic_vector(3 downto 0);second_10,minute_10:in std_logic_vector(2 downto 0);hour_10:in std_logic_vector(1 downto 0);dataout:out std_logic_vector(3 downto 0);sel:out std_logic_vector(2 downto 0));end entity saomiaoyi;architecture one of saomiaoyi is signal count:std_logic_vector(2 downto 0);begin sel<=count;process(clk,reset)begin if(reset='1')then dataout<=“0000”;elsif(clk'event and clk='1')then if count>=“101” then count<=“000”;else count<=count+1;end if;end if;case count is when“000”=>dataout<=second1;when“001”=>dataout<='0'& second_10;when“010”=>dataout<=minute1;when“011”=>dataout<='0'& minute_10;when“100”=>dataout<=hour1;when others =>dataout<=“00”& hour_10;end case;end process;end architecture one; 附錄五:7段LED模塊VHDL程序 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY led_7 IS PORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);LED7S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END entity led_7;ARCHITECTURE one OF led_7 IS BEGIN PROCESS(A)BEGIN CASE A(3 DOWNTO 0)IS WHEN “0000” => LED7S <= “0111111”;--X“3F” 0 WHEN “0001” => LED7S <= “0000110”;--X“06” 1 WHEN “0010” => LED7S <= “1011011”;--X“5B” 2 WHEN “0011” => LED7S <= “1001111”;--X“4F” 3 WHEN “0100” => LED7S <= “1100110”;--X“66” 4 WHEN “0101” => LED7S <= “1101101”;--X“6D” 5 WHEN “0110” => LED7S <= “1111101”;--X“7D” 6 WHEN “0111” => LED7S <= “0000111”;--X“07” 7 WHEN “1000” => LED7S <= “1111111”;--X“7F” 8 WHEN “1001” => LED7S <= “1101111”;--X“6F” 9 WHEN OTHERS => NULL;END CASE;END PROCESS;END ARCHITECTURE one;第五篇:EDA實習報告