目錄 內容摘要 一、概述 二、實驗目的 三、實驗原理 四、設計方案 五、設計方法論證 (1)將每個模塊生成電路元件,利用電路連接圖的方式 (2)利用元件例化的方法 六、設計過程 (1)計時、控制模塊 1)分頻器的設計 2)計數器的設計 (2)顯示模塊 1)掃描電路 2)七段譯碼 (3)報警器電路 (4)元件例化 七、波形仿真 八、設備驗證 (1)引腳分配 (2)程序下載 (3)設備驗證 九、設計心得及體會
內容摘要在科技高度發展的今天,集成電路和計算機應用得到了高速發展。尤其是計算機應用的發展。它在人們日常生活已逐漸嶄露頭角。大多數電子產品多是由計算機電路組成, 如:手機、mp3等。而且將來的不久他們的身影將會更頻繁的出現在我們身邊。各種家用電器多會實現微電腦技術。電腦各部分在工作時多是一時間為基準的。 本報告就是基于計算機電路的時鐘脈沖信號、狀態控制等原理,運用EDA技術及VHDL語言設計出的數字秒表。秒表在很多領域充當一個重要的角色。在各種比賽中對秒表的精確度要求很高,尤其是一些科學實驗,他們對時間精確度達到了幾納秒級別。 利用VHDL語言設計基于計算機電路中時鐘脈沖原理的數字秒表。該數字秒表能對0秒~59分59.99秒范圍進行計時,顯示最長時間是59分59秒,超過該時間能夠進行報警。計時精度達到10ms。設計了復位開關和啟停開關。復位開關可以在任何情況下使用,使用以后計時器清零,并做好下一次計時的準備。
一、概述EDA是指以計算機為工作平臺,融合了應用電子技術、計算機技術、智能化技術的最新成果而開發出的電子通用軟件包,它根據硬件描述語言VHDL完成的設計文件,自動完成邏輯編譯、化簡、分割、綜合、優化、布局布線及仿真,直至完成對于特定目標芯片的適配編譯、邏輯映射和編程下載等工作。隨著科技發展,在現代生活中,計數器應用越來越廣泛。EDA技術的應用引起電子產品即系統開發的革命性變革,在Quartus II環境下采用VHDL語言實現,論述了基于VHDL語言在FPGA芯片的數字設計思想與實現過程。本設計是以VHDL語言為基礎的數字秒表。在數字秒表的程序中應用了四個10進制計數器和兩個6進制計數器,以及報警器、選擇器和顯示譯碼器等。 電子設計自動化技術EDA的發展給電子系統的設計帶來了革命性變化,EDA軟件設計工具,硬件描述語言,可編程邏輯器件(PLD)使得EDA技術的應用走向普及。VHDL語言是EDA的關鍵技術之一,它采用自頂向下的設計方法,完成系統的整體設計。 二、實驗目的通過本次課設,加深對EDA技術設計的理解,學會用QuartusⅡ工具軟件設計基本電路,熟練掌握VHDL語言,為以后工作使用打下堅實的基礎。 三、實驗原理秒表工作原理和多少數字電子鐘大致一樣,不同的是秒表為0.01秒,整個秒表的時鐘信號輸入為50MHZ。所以,需要對時鐘信號進行分頻 假設該秒表應用場合小于1小時,秒表的顯示格式為mm-ss-xx(mm表示分鐘:0~59;ss表示秒:0~59;xx表示百分之一秒:0~99)。 利用試驗箱產生的CLK沖激作為時鐘信號的基準信號,通過顯示和計時模塊在試驗箱的LED顯示。 四、設計方案 本系統設計采用自頂向下的設計方案,系統的整體組裝設計原理圖如圖1所示,它主要由控制模塊、分頻模塊,計時模塊、顯示模塊和報警模塊五部分組成。各模塊分別完成計時過程的控制功能、計時功能與顯示功能。
計時控制模塊主要是對計時過程進行控制。計時控制模塊可以由兩個按鈕開關來完成秒表的啟動,停止和復位。 計時模塊實現的是計時功能,及時的方法是對標準時鐘脈沖計數。由于秒表的計時范圍是0秒~59分59.99秒,所以計數器可以由四個十進制計數器和兩個六進制計數器構成,其中毫秒位,秒位和分位采用十進制計數器來實現,十秒位和十分位采用六進制計數器。 計時顯示模塊是將計時值在LED七段數碼管顯示出來。 當計時達60分鐘后,蜂鳴器鳴響10聲 最終底層文件生成設計實體可采用兩種方式 五、設計方法論證
(1)將每個模塊生成電路元件,利用電路連接圖的方式如圖2所示 圖2 電路原理圖 (2)利用元件例化的方法
六、設計過程
(1)計時、控制模塊1)分頻器的設計: 由于本設計中需要用到精確的100Hz計時脈沖,因此分頻器的設計顯得尤為重要。考慮到實驗箱上輸出頻率的限制及所產生及時脈沖的精度要求,采用由50MHz的時鐘脈沖經過分頻器產生100Hz的計時脈沖。計時控制模塊的作用是將按鍵信號轉變為計時器的控制信號。計時控制模塊可用兩個按鈕來完成秒表的啟動、停止和復位,即啟動/暫停鍵和清零鍵,由它們產生計數允許/保持和清零信號。K為啟動/暫停鍵輸入信號,K=0時表示按下,K=1時表示松開。 分頻器的設計程序源代碼如下: ibrary ieee; use ieee.std_logic_1164.all; entity div is port(clr,clk: in std_logic; q: buffer std_logic); end div; architecture a of div is signal count:integer range 0 to 499999; --設置定時范圍 begin process(clr,clk) begin if (clk'event and clk='1') then --當計時脈沖上升沿出發 if clr='1' then --清零開關使能端 count<=0; elsif count=499999 then count<=0; q<= not q; else count<=count+1; end if; end if; end process; end a; 生成的電路元件圖如圖3所示 圖3 2)計數器的設計: 本實驗需要六進制計數器和十進制計數器配合使用。計時方法和計算機一樣是對標準時鐘脈沖計數。計時模塊是由四個十進制計數器和兩個六進制計數器構成的。其中毫秒位、十毫秒位、秒位和分位采用十進制計數器,十秒位和十分位采用六進制計數器。 library ieee; --六進制計數器 use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity count6 is port (clk,start,clr : in std_logic; cout : out std_logic; daout : out std_logic_vector(3 downto 0));--定義輸出數據范圍 end count6; architecture two of count6 is signal q0 : std_logic_vector(3 downto 0); signal q1 : std_logic; begin process(clk,clr) begin if clr='1' then q0<="0000"; elsif ( clk'event and clk='1') then --當上升沿來時動作 if start='1' then if q0="0101" then q0<="0000";q1<='1';--限制計數范圍 else q0<=q0+1;q1<='0'; --進行計數 end if; end if; end if; end process; daout<= q0; cout<=q1; end two;
生成的電路元件圖如圖4所示 圖4
library ieee; --十進制計數器 use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity count10 is port (clk,start,clr : in std_logic; cout : out std_logic; daout : out std_logic_vector(3 downto 0)); end count10; architecture one of count10 is signal q0 : std_logic_vector(3 downto 0); signal q1 : std_logic; begin process(clk,clr) begin if clr='1' then q0<="0000"; elsif ( clk'event and clk='1') then --判斷上升沿動作 if start='1' then if q0="1001" then q0<="0000";q1<='1'; --計數范圍限制在10 else q0<=q0+1;q1<='0'; --計數 end if; end if; end if; end process; daout<= q0; cout<=q1; end one;
生成的電路元件圖如圖5所示 圖5 (2)顯示模塊計時顯示電路的作用是將計時值在LED數碼管上顯示出來。計時電路產生的值經過BCD七段譯碼后,驅動LED數碼管。計時顯示電路的實現方案采用掃描顯示。其中包括選擇器和七段譯碼器。選擇器中包含了對數碼管的片選信號、位選信號及小數點的設置。 1)掃描電路數碼管動態掃描就是以一定的頻率依次點亮多個數碼管的段位,只要頻率足夠大,人眼無法識別出,就會形成多個數碼管同時亮的現象。段選信號負責選擇哪個數碼管亮,位選信號負責控制該數碼管上亮的位置。
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity seltime is port(clr,clk: in bit; dain0,dain1,dain2,dain3,dain4,dain5,dain6: in std_logic_vector(3 downto 0); --定義數據 sel: out std_logic_vector(3 downto 0);--段選信號 daout: out std_logic_vector(3 downto 0));--位選信號 end seltime; architecture a of seltime is signal temp:integer range 0 to 6; begin process(clk) --根據時鐘脈沖進行動作 begin if (clr='1') then --清零使能端 daout<="0000"; sel<="0000"; temp<=0; --當清零信號產生后將LED歸零 elsif (clk='1'and clk'event) then --當時鐘上升沿時執行 if temp=6 then temp<=0; else temp<=temp + 1; end if; case temp is --控制LED when 0=>sel<="0000";daout<=dain0; when 1=>sel<="0001";daout<=dain1; when 2=>sel<="0010";daout<=dain2; when 3=>sel<="0011";daout<=dain3; when 4=>sel<="0100";daout<=dain4; when 5=>sel<="0101";daout<=dain5; when 6=>sel<="0110";daout<=dain6; end case; end if; end process; end a; 生成的電路元件圖如圖6所示 圖6 2)七段譯碼數碼管是共陰極觸發亮度,七段數碼管由八位數據控制,數碼管首先從上到右,到下到左,到中間,最后到小數點分別標記為a、b、c、d、e、f、g、dp八段其中小數點位DP為最高位,a段為最低位,要想顯示什么字符只需要使對應的段發光即可。 library ieee; use ieee.std_logic_1164.all; entity deled is port(num:in std_logic_vector(3 downto 0); led:out std_logic_vector(6 downto 0)); end deled ; architecture a of deled is begin process(num) begin case num is when"0000"=>led<="0111111";--顯示0 when"0001"=>led<="0000110";--顯示1 when"0010"=>led<="1011011";--顯示2 when"0011"=>led<="1001111";--顯示3 when"0100"=>led<="1100110";--顯示4 when"0101"=>led<="1101101";--顯示5 when"0110"=>led<="1111101";--顯示6 when"0111"=>led<="0100111";--顯示7 when"1000"=>led<="1111111";--顯示8 when"1001"=>led<="1101111";--顯示9 when others=>led<="0000000";--其他情況下為0 end case; end process; end a; 生成的電路元件圖如圖7所示 圖7
(3)報警器電路報警模塊的設計是利用蜂鳴器的發聲原理。當計數器計滿59分鐘后會產生進位信號,在蜂鳴器的一端輸入高電平時蜂鳴器發生,產生報警聲。 源代碼: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity alarm is port(clk,I:in std_logic; q:out std_logic --報警輸出 ); end alarm; architecture ar of alarm is signal n:integer range 0 to 9; signal q0:std_logic; begin process(clk) begin if clk'event and clk='1' then if i='0' then q0<='0'; n<=0; elsif n<=9 and i='1' then --計數滿60分后報警輸出,重新計數 q0<=not q0; n<=n+1; else q0<='0'; end if; end if; end process; q<=q0; end ar; 生成的電路元件圖如圖8所示 圖8 (4)元件例化元件例化是用含有完整程序結構的VHDL表述來構成自頂而下層次化設計的一種重要手段。將已經設計完成的底層文件調用構建成一個完整的電路文件。將要引用的文件放入例化文件目錄下。 library ieee; use ieee.std_logic_1164.all; entity mb_top is port ( stop,start,clk:in std_logic; a,b,c,d,e,f,g,speaker:out std_logic; sel:out std_logic_vector(3 downto 0); vga:out std_logic_vector(3 downto 0));--選擇電路上的數碼管 end mb_top; architecture a of mb_top is component div --分頻器 port(clr,clk: in std_logic; q: buffer std_logic); end component; component count10 --10進制計數器 port( clr,start,clk:in std_logic; cout:out std_logic; daout:buffer std_logic_vector(3 downto 0)); end component; component count6 --6進制計數器 port( clr,start,clk:in std_logic; cout:out std_logic; daout:buffer std_logic_vector(3 downto 0)); end component; component seltime --數據選擇器 port( clr,clk:in std_logic; dain0:in std_logic_vector(3 downto 0); dain1:in std_logic_vector(3 downto 0); dain2:in std_logic_vector(3 downto 0); dain3:in std_logic_vector(3 downto 0); dain4:in std_logic_vector(3 downto 0); dain5:in std_logic_vector(3 downto 0); sel:out std_logic_vector(3 downto 0); daout:out std_logic_vector(3 downto 0)); end component; component deled port( num:in std_logic_vector(3 downto 0); led:out std_logic_vector(6 downto 0)); end component; component alarm --報警電路 port( clk,i,clr:in std_logic; q:out std_logic); end component; signal div_q,b_cout,s_cout,m_cout,sm_cout,f_cout,sf_cout:std_logic; signal b_daout,s_daout,m_daout,sm_daout,f_daout,sf_daout,seltime_daout:std_logic_vector(3 downto 0); signal ledout:std_logic_vector(6 downto 0); begin vga<="1011"; --寫入vga調用電路板上的數碼管 a<=ledout(0);b<=ledout(1);c<=ledout(2);d<=ledout(3); e<=ledout(4);f<=ledout(5);g<=ledout(6); u1:div port map(stop,clk,div_q); --元件位置 u2:count10 port map(stop,start,div_q,b_cout,b_daout); u3:count10 port map(stop,start,b_cout,s_cout,s_daout); u4:count10 port map(stop,start,s_cout,m_cout,m_daout); u5:count6 port map(stop,start,m_cout,sm_cout,sm_daout); u6:count10 port map(stop,start,sm_cout,f_cout,f_daout); u7:count6 port map(stop,start,f_cout,sf_cout,sf_daout); u8:seltime port map(stop,div_q,b_daout,s_daout,m_daout,sm_daout,f_daout,sf_daout,sel,seltime_daout); u9:deled port map(seltime_daout,ledout); u10:alarm port map(div_q,sf_cout,speaker); end a; 七、波形仿真
八、設備驗證(1)引腳分配圖9引腳分配圖 (2)程序下載圖10下載圖
(3)設備驗證圖11 實驗結果圖 九、設計心得及體會通過此次課程設計,讓我對EDA這門技術有了更深的體會,并更好的學會了使用QuartusⅡ軟件進行硬件設計。 在編寫程序的過程中,遇到了很多問題,使我發現自己以前學習上存在的不足。通過與同學探討和請教老師,終于把問題都解決了,并加深了對數字時鐘原理和設計思路的了解。同時我也掌握了做課程設計的一般流程,為以后的電子設計這塊積累了一定的經驗,為以后從事相關工作有一些幫助。最終解決了問題,攥寫成報告。 通過對設計對實現和對報告對撰寫,深深體會到了VHDL語言和EDA技術的一些技巧和設計思想,在完成設計的過程中,應該具有很清晰地思路,才可以使電路更完美和簡便,要敢想敢做但是不應該有投機取巧的心理。在完成每一步的時候都有意想不到的收獲也有可能導致錯誤,所以在設計對過程中要集中精神。在寫報告的過程中,更加凸顯了細心二字。不可自認為完美,必須按照格式要求來撰寫自己的報告,所以必須做到足夠的精確。 利用EDA工具,電子設計師可以從概念、算法、協議等開始設計電子系統,大量工作可以通過計算機完成,并可以將電子產品從電路設計、性能分析到設計版圖的整個過程的計算機上自動處理完成。在進行設計時并不束縛設計者的想象力,這使得自學、擴展也可以很容易實現。在設計中充分的認識到EDA課程對硬件設計的重要性,若把本門課程學好、學精,對硬件設計將有很大對幫助。以后若有機會我將會利用更多時間來學習EDA技術、更加深入的學習EDA技術。EDA技術以其獨有的優點和應用范圍有著非常好的發展前景,是近幾年電子工業的發展趨向,中國的EDA行業發展十分迅速,有著很大的潛力。所以我們學好這門課程是十分必要的,我們不應該僅僅拘泥于一門課程的學習,要結合各學科的連接點,把我們的知識串聯起來。為我們的未來做好知識儲備。 以上就我關于這次課程設計的想法,在以后,我會用更多的時間去了解EDA。并且提高自己的知識水平。
以上圖文的Word格式文檔下載(內容和本網頁上的一模一樣,方便大家保存):
秒表實驗報告.docx
(1.94 MB, 下載次數: 28)
2019-1-8 16:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|