1. VHDL數字時鍾完整程序代碼(要求要有元件例化,並且有按鍵消抖),謝謝啦啦啦啦
課程設計任務書
課程設計名稱 EDA課程設計 學生姓名 專業班級
設計題目 多功能數字鍾設計
一、 課程設計目的
1、綜合運用EDA技術,獨立完成一個課題的設計,考察運用所學知識,解決實際問題的能力;
2、結合理論知識,考察閱讀參考資料、文獻、手冊的能力;
3、進一步熟悉EDA技術的開發流程,掌握文件編輯、編譯、模擬、下載驗證等環節的實現方法和應用技巧;
4、鍛煉撰寫研究報告、研究論文的能力;
5、通過本實踐環節,培養科學和嚴謹的工作作風。
二、 設計內容、技術條件和要求
l、能進行正常的時、分、秒計時功能,分別由6個數碼顯示24小時、60分鍾的計數器顯示。
2、能利用實驗系統上的按鈕實現「校時」、「校分」功能;
(1)按下「SA」鍵時,計時器迅速遞增,並按24小時循環;
(2)按下「SB」鍵時,計時器迅速遞增,並按59分鍾循環,並向「時」進位;
(3)按下「SC」鍵時,秒清零;抖動的,必須對其消抖處理。
3、能利用揚聲器做整點報時:
(1)當計時到達59』50」時開始報時,頻率可為500Hz;計滿23小時後回零;計滿59分鍾後回零。(2)到達59』59」時為最後一聲整點報時,整點報時的頻率可定為lKHz。
4定時鬧鍾功能
5、用層次化設計方法設計該電路,用硬體描述語言編寫各個功能模塊。
6、報時功能。報時功能用功能模擬的模擬驗證,可通過觀察有關波形確認電路設計是否正確。
三、 時間進度安排
1周:(1) 完成設計准備,確定實施方案;(2) 完成電路文件的輸入和編譯;(4) 完成功能模擬。
2周:(1) 完成文件至器件的下載,並進行硬體驗證;(2) 撰寫設計說明書。
四、 主要參考文獻
(1)譚會生、瞿遂春,《EDA技術綜合應用實例與分析》,西安電子科技大學出版社,2004
(2)曹昕燕、周鳳臣等,《EDA技術實驗與課程設計》,清華大學出版社,2006
指導教師簽字: 2011年9月19日
一、實驗原理 :
用層次化設計的方法以VHDL語言編程實現以下功能:
【1】 具有「時」、「分」、「秒」計時功能;時為24進制,分和秒都為60進制。
【2】 具有消抖功能:手工按下鍵盤到是否這個過程大概50ms左右,在按下開始到彈簧片穩,定接觸這段時間為5-10ms,從釋放到彈片完全分開也是5-10ms,在達到穩定接觸和完全分開的微觀過程中,電平是時高時低的,因此如果在首次檢測到鍵盤按下時延時10ms再檢測就不會檢測到抖動的毛刺電平了。64Hz的信號周期為15.6ms,正適合做消抖信號。
【3】 具有校時和清零功能,能夠用4Hz脈沖對「小時」和「分」進行調整,並可進行秒零;
【4】 具有整點報時功能。在59分51秒、53秒、55秒、57秒發出低音512Hz信號,在59分59秒發出一次高音1024Hz信號,音響持續1秒鍾,在1024Hz音響結束時刻為整點。
【5】 具有一鍵設定鬧鈴及正常計時與鬧鈴時間的顯示轉換。鬧時時間為一分鍾。
二、程序流程:
1、秒計數器模塊設計:
模塊圖如圖1。六十進制帶進位計數器,可清零,clk輸入信號為1Hz脈沖,當q0計滿9後q1增加1,當q0滿9且q1記滿5,q1、q0同時歸零,co輸出為高電平。q1為十位q0為個位。
圖1
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity c60 is
Port ( clk,clr : in std_logic;
co :out std_logic;
q1,q0 : out std_logic_vector(3 downto 0));
end c60;
architecture one of c60 is
begin
process (clk,clr)
variable cq1,cq0:std_logic_vector(3 downto 0);
begin
if clr='1' then cq1:=(others=>'0');cq0:=(others=>'0');
elsif (clk'event and clk='1') then
if cq0<9 then cq0:=cq0 +1;co<='0';
elsif cq1<5 then cq1:=cq1+1;cq0:=(others=>'0');
elsif cq1=5 and cq0=9
then co<='1';cq1:=(others=>'0'); cq0:=(others=>'0');
else co<='0';
end if;
end if;
q1<=cq1;
q0<=cq0;
end process;
end one;
模擬結果如下圖2
2、分計數器同上。註:不同之處為分的clk輸入信號為秒的進位信號。
3、時計數器:
模塊圖如圖3。24進制無進位計數器,當計數信號計到23後再檢測到計數信號時會自動零。帶清零,clk輸入為分秒進位相與的結果。q1為十位,q0為個位。
圖3
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity c24 is
Port ( clk : in std_logic;
q1,q0 : out std_logic_vector(3 downto 0));
end c24;
architecture one of c24 is
begin
process (clk)
variable cq1,cq0:std_logic_vector(3 downto 0);
begin
if (clk'event and clk='1') then
if cq1="0010" and cq0="1001" then
cq1:="0000"; cq0:="0000";
elsif cq0<"1001" then
cq0:=cq0+1;
else cq0:="0000"; cq1:=cq1+1;
end if;
end if;
q1<=cq1;q0<=cq0;
end process;
end one;
模擬波形如下圖4:
圖4
4、分頻器:
模塊圖如圖5。由四個分頻器構成,輸入信號in_clk為1024Hz脈沖信號。把輸入的1024Hz信號分頻為四個脈沖信號,即1Hz的秒脈沖,4Hz的校時、校分脈沖,64Hz的消抖脈沖以及512Hz的蜂鳴器低音輸入。
圖5
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity div is
Port ( in_clk : in std_logic;
clk_512, clk_1,clk_4 ,clk_64:out std_logic);
end div;
architecture one of div is
signal q512,a,b,c:std_logic;
signal c1,c4,c64:integer range 512 downto 0;
begin
process(in_clk)
begin
if in_clk'event and in_clk='1' then
q512<=not q512;
if c64>=7 then c64<=0;c<=not c;else c64<=c64+1;end if;
if c4>=127 then c4<=0;b<=not b;else c4<=c4+1;end if;
if c1>=511 then c1<=0;a<=not a;else c1<=c1+1;end if;
end if;
end process;
clk_512<=q512;
clk_1<=a;
clk_4<=b;
clk_64<=c;
end one;
模擬波形如下圖6:
圖6
5、消抖:
模塊圖如圖7。分頻出的用64Hz信號對sa校時信號、sb校分信號、sc秒清零信號、sd鬧時設置信號進行防抖動處理。是由四個兩級d觸發器構成的,分別對輸入的sa、sb、sc、sd
信號的相鄰兩個上升沿進行比較以確定按鍵的按下,從而達到消抖的目的。
圖7
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity xd is
Port ( clk_64 : in std_logic;
hj,mj,sclr,sdo :out std_logic;
sa,sb,sc,sd : in std_logic);
end xd;
architecture one of xd is
begin
process(clk_64)
variable sa_n,sa_p,sb_n,sd_n,sb_p,sc_n,sc_p,sd_p:std_logic;
begin
if clk_64'event and clk_64='1' then
sa_p:=sa_n;sa_n:=sa;
sb_p:=sb_n;sb_n:=sb;
sc_p:=sc_n;sc_n:=sc;
sd_p:=sd_n;sd_n:=sd;
if sa_p= sa_n then hj<=sa;end if;
if sb_p= sb_n then mj<=sb;end if;
if sc_p= sc_n then sclr<=sc;end if;
if sd_p= sd_n then sdo<=sd;end if;
end if;
end process;
end one;
模擬波形如下圖8:
圖8
6、鬧鍾時間的設定:
模塊圖如圖9。一鍵設定鬧鈴時間,內部由四個d觸發器構成。當確定sd鍵按下時,將當前時間的小時和分的個位十位分別存入四個d觸發器內,作為鬧時時間。
圖9
程序如下
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity df4 is
Port ( sd :in std_logic;
hh,hl,mh,ml : in std_logic_vector(3 downto 0);
hh_o,hl_o,mh_o,ml_o: out std_logic_vector(3 downto 0));
end df4;
architecture one of df4 is
begin
process (sd,hh,hl,mh,ml)
begin
if sd='1' then
hh_o<=hh;hl_o<=hl;mh_o<=mh;ml_o<=ml;end if;
end process;
end one;
模擬波形如下圖10:
圖10
7、二選一電路
(1)一位二選一:
模塊圖如圖11。用以進行正常計時和校時/分的選擇。alarm為經過消抖的校時/分信號。當按鍵未曾按下時,即校時/分信號沒有到來時,二選一選擇器會選擇輸出a(正常計時輸入)信號,否則當alarm按鍵按下時輸出y為校時/分輸入信號——4Hz。
圖11
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity xuan21 is
Port ( alarm,a,b: in std_logic;
y:out std_logic);
end xuan21 ;
architecture one of xuan21 is
begin
process(alarm,a,b)
begin
if alarm='0' then y<=a;else y<=b;
end if;
end process;
end one;
模擬波形如下圖12:
圖12
(2)三位二選一:
模塊圖如圖13。用以進行正常計時時間與鬧鈴時間顯示的選擇,alarm輸入為按鍵。當alarm按鍵未曾按下時二選一選擇器會選擇輸出顯示正常的計時結果,否則當alarm按鍵按下時選擇器將選擇輸出顯示鬧鈴時間顯示。
圖13
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity x213 is
Port ( alarm : in std_logic;
y:out std_logic_vector(3 downto 0);
a,b: in std_logic_vector(3 downto 0));
end x213;
architecture one of x213 is
begin
process(alarm,a,b)
begin
if alarm='0' then y<=a;else y<=b;
end if;
end process;
end one;
模擬結果如下圖14:
圖14
8、整點報時及鬧時:
模塊圖如圖15。在59分51秒、53秒、55秒、57秒給揚聲器賦以低音512Hz信號,在59分59秒給揚聲器賦以高音1024Hz信號,音響持續1秒鍾,在1024Hz音響結束時刻為整點。當系統時間與鬧鈴時間相同時給揚聲器賦以高音1024Hz信號。鬧時時間為一分鍾。
圖15
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity voice is
Port ( hou1,huo0,min1,min0,sec1,sec0,hh,hl,mh,ml: std_logic_vector(3 downto 0);
in_1000,in_500:in std_logic;
q : out std_logic);
end voice;
architecture one of voice is
begin
process(min1,min0,sec1,sec0)
begin
if min1="0101" and min0="1001" and sec1="0101" then
if sec0="0001" or sec0="0011" or sec0="0101" or sec0="0111"
then q<=in_500;
elsif sec1="0101" and sec0="1001" then q<=in_1000;
else q<='0';
end if;
else q<='0';
end if;
if min1=mh and min0=ml and hou1=hh and huo0=hl then
q<=in_1000;
end if;
end process;
end one;
模擬波形如下圖16
圖16
9、頂層原理圖:
三、感想
通過這次設計,既復習了以前所學的知識,也進一步加深了對EDA的了解,讓我對它有了更加濃厚的興趣。特別是當每一個子模塊編寫調試成功時,心裡特別的開心。但是在畫頂層原理圖時,遇到了不少問題,最大的問題就是根本沒有把各個模塊的VHD文件以及生成的器件都全部放在頂層文件的文件夾內,還有就是程序設計的時候考慮的不夠全面,沒有聯系著各個模式以及實驗板的情況來編寫程序,以至於多考慮編寫了解碼電路而浪費了很多時間。在波形模擬時,也遇到了一點困難,想要的結果不能在波形上得到正確的顯示
:在分頻模塊中,設定輸入的時鍾信號後,卻只有二分頻的結果,其餘三個分頻始終沒反應。後來,在數十次的調試之後,才發現是因為規定的信號量范圍太大且信號的初始值隨機,從而不能得到所要的結果。還有的模擬圖根本就不出波形,怎麼調節都不管用,後來才知道原來是路徑不正確,路徑中不可以有漢字。真是細節決定成敗啊!總的來說,這次設計的數字鍾還是比較成功的,有點小小的成就感,終於覺得平時所學的知識有了實用的價值,達到了理論與實際相結合的目的,不僅學到了不少知識,而且鍛煉了自己的能力,使自己對以後的路有了更加清楚的認識,同時,對未來有了更多的信心。
四、參考資料:
1、潘松,王國棟,VHDL實用教程〔M〕.成都:電子科技大學出版社,2000.(1)
2、崔建明主編,電工電子EDA模擬技術北京:高等教育出版社,2004
3、李衍編著,EDA技術入門與提高王行西安:西安電子科技大學出版社,2005
4、侯繼紅,李向東主編,EDA實用技術教程北京:中國電力出版社,2004
5、沈明山編著,EDA技術及可編程器件應用實訓北京:科學出版社,2004
6、侯伯亨等,VHDL硬體描述語言與數字邏輯電路設計西安: 西安電子科技大學出版社,1997
7、辛春艷編著,VHDL硬體描述語言北京:國防工業出版社,2002