導航:首頁 > 編程語言 > 數字鍾計時器vhdl編程

數字鍾計時器vhdl編程

發布時間:2024-12-06 11:55:25

㈠ VHDL 數字鍾

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINSECONDb is
port(clk,clrm,stop:in std_logic;----時鍾/清零信號
secm1,secm0:out std_logic_vector(3 downto 0);----秒高位/低位
co:out std_logic);-------輸出/進位信號
end MINSECONDb;

architecture SEC of MINSECONDb is
signal clk1,DOUT2:std_logic;

begin
process(clk,clrm)
variable cnt1,cnt0:std_logic_vector(3 downto 0);---計數
VARIABLE COUNT2 :INTEGER RANGE 0 TO 10 ;
begin

IF CLK'EVENT AND CLK='1'THEN
IF COUNT2>=0 AND COUNT2<10 THEN
COUNT2:=COUNT2+1;
ELSE COUNT2:=0;
DOUT2<= NOT DOUT2;
END IF;
END IF;

if clrm='1' then----當clr為1時,高低位均為0
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if stop='1' then
cnt0:=cnt0;
cnt1:=cnt1;
end if;

if cnt1="1001" and cnt0="1000" then----當記數為98(實際是經過59個記時脈沖)
co<='1';----進位
cnt0:="1001";----低位為9
elsif cnt0<"1001" then----小於9時
cnt0:=cnt0+1;----計數
--elsif cnt0="1001" then
--clk1<=not clk1;
else
cnt0:="0000";

if cnt1<"1001" then----高位小於9時
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
secm1<=cnt1;
secm0<=cnt0;

end process;
end SEC;

秒模塊程序清單

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SECOND is
port(clk,clr:in std_logic;----時鍾/清零信號
sec1,sec0:out std_logic_vector(3 downto 0);----秒高位/低位
co:out std_logic);-------輸出/進位信號
end SECOND;

architecture SEC of SECOND is
begin
process(clk,clr)
variable cnt1,cnt0:std_logic_vector(3 downto 0);---計數
begin
if clr='1' then----當ckr為1時,高低位均為0
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if cnt1="0101" and cnt0="1000" then----當記數為58(實際是經過59個記時脈沖)
co<='1';----進位
cnt0:="1001";----低位為9
elsif cnt0<"1001" then----小於9時
cnt0:=cnt0+1;----計數
else
cnt0:="0000";

if cnt1<"0101" then----高位小於5時
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
sec1<=cnt1;
sec0<=cnt0;

end process;
end SEC;

分模塊程序清單

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINUTE is
port(clk,en:in std_logic;
min1,min0:out std_logic_vector(3 downto 0);
co:out std_logic);
end MINUTE;

architecture MIN of MINUTE is
begin

process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";

if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
end if;
min1<=cnt1;
min0<=cnt0;

end process;
end MIN;

時模塊程序清單

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity HOUR is
port(clk,en:in std_logic;----輸入時鍾/高電平有效的使能信號
h1,h0:out std_logic_vector(3 downto 0));----時高位/低位
end HOUR;

architecture hour_arc of HOUR is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);----記數
begin
if clk'event and clk='1' then---上升沿觸發
if en='1' then---同時「使能」為1
if cnt1="0010" and cnt0="0011" then
cnt1:="0000";----高位/低位同時為0時
cnt0:="0000";
elsif cnt0<"1001" then----低位小於9時,低位記數累加
cnt0:=cnt0+1;
else
cnt0:="0000";
cnt1:=cnt1+1;-----高位記數累加
end if;
end if;
end if;
h1<=cnt1;
h0<=cnt0;

end process;
end hour_arc;
動態掃描模塊
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity SELTIME is
port(
clk:in std_logic;------掃描時鍾
secm1,secm0,sec1,sec0,min1,min0,h1,h0:in std_logic_vector(3 downto 0);-----分別為秒個位/時位;分個位/
ut:out std_logic_vector(3 downto 0);----------------輸出
sel:out std_logic_vector(2 downto 0));-----位選信號
end SELTIME;
architecture fun of SELTIME is
signal count:std_logic_vector(2 downto 0);----計數信號
begin
sel<=count;
process(clk)
begin
if(clk'event and clk='1') then
if(count>="111") then
count<="000";
else
count<=count+1;
end if;
end if;
case count is
when"111"=>ut<= secm0;----秒個位
when"110"=>ut<= secm1;----秒十位
when"101"=>ut<= sec0;----分個位
when"100"=>ut<= sec1;----分十位
when"011"=>ut<=min0; ----時個位
when"010"=>ut<=min1;----時十位
when"001"=>ut<=h0;
when others =>ut<=h1;
end case;
end process;
end fun;
報時模塊

library ieee;
use ieee.std_logic_1164.all;
entity ALERT is
port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);------輸入秒、分高/低位信號
clk:in std_logic;------高頻聲控制
q500,qlk:out std_logic);----低頻聲控制
end ALERT;

architecture sss_arc of ALERT is
begin
process(clk)
begin

if clk'event and clk='1' then
if m1="0101" and m0="1001" and s1="0101" then----當秒高位為5,低位為9時且分高位為5
if s0="0001" or s0="0011" or s0="0101" or s0="0111" then---當分的低位為1或3或5或7時
q500<='1';----低頻輸出為1
else
q500<='0';----否則輸出為0
end if;
end if;

if m1="0101" and m0="1001" and s1="0101" and s0="1001" then---當秒高位為5,低位為9時且分高位為5,----分低位為9時,也就是「59分59秒」的時候「報時」
qlk<='1';-----高頻輸出為1
else
qlk<='0';
end if;
end if;
end process;
end sss_arc;
顯示模塊

library ieee;
use ieee.std_logic_1164.all;
entity DISPLAY is
port(d:in std_logic_vector(3 downto 0);----連接seltime掃描部分d信號
q:out std_logic_vector(6 downto 0));----輸出段選信號(電平)
end DISPLAY;
architecture disp_are of DISPLAY is
begin
process(d)
begin

case d is
when"0000" =>q<="0111111";--顯示0
when"0001" =>q<="0000110";--顯示1
when"0010" =>q<="1011011";--顯示2
when"0011" =>q<="1001111";--顯示3
when"0100" =>q<="1100110";--顯示4
when"0101" =>q<="1101101";--顯示5
when"0110" =>q<="1111101";--顯示6
when"0111" =>q<="0100111";--顯示7
when"1000" =>q<="1111111";--顯示8
when others =>q<="1101111";--顯示9
end case;
end process;
end disp_are;
頂層文件(原理圖輸入)

********************************************************************
數字鍾設計模塊與程序(不含秒錶)
*********************************************************************
1.分頻模塊(原理圖輸入)

2. 秒模塊程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SECOND is
port(clk,clr:in std_logic;
sec1,sec0:out std_logic_vector(3 downto 0);
co:out std_logic);
end SECOND;

architecture SEC of SECOND is
begin
process(clk,clr)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clr='1' then
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";

if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
sec1<=cnt1;
sec0<=cnt0;

end process;
end SEC;

3.分模塊程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINUTE is
port(clk,en:in std_logic;
min1,min0:out std_logic_vector(3 downto 0);
co:out std_logic);
end MINUTE;

architecture MIN of MINUTE is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";

if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
end if;
min1<=cnt1;
min0<=cnt0;

end process;
end MIN;

4.時模塊程序

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity HOUR is
port(clk,en:in std_logic;
h1,h0:out std_logic_vector(3 downto 0));
end HOUR;

architecture hour_arc of HOUR is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0010" and cnt0="0011" then
cnt1:="0000";
cnt0:="0000";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
end if;
end if;
end if;
h1<=cnt1;
h0<=cnt0;

end process;
end hour_arc;

5.掃描模塊程序

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity SELTIME is
port(
clk:in std_logic;
sec1,sec0,min1,min0,h1,h0:in std_logic_vector(3 downto 0);
ut:out std_logic_vector(3 downto 0);
sel:out std_logic_vector(2 downto 0));
end SELTIME;
architecture fun of SELTIME is
signal count:std_logic_vector(2 downto 0);
begin
sel<=count;
process(clk)
begin
if(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"=>ut<= sec0;
when"001"=>ut<= sec1;
when"010"=>ut<= min0;
when"011"=>ut<= min1;
when"100"=>ut<=h0;
when others =>ut<=h1;
end case;
end process;
end fun;

6.顯示模塊程序

library ieee;
use ieee.std_logic_1164.all;
entity DISPLAY is
port(d:in std_logic_vector(3 downto 0);
q:out std_logic_vector(6 downto 0));
end DISPLAY;
architecture disp_are of DISPLAY is
begin
process(d)
begin

case d is
when"0000" =>q<="0111111";
when"0001" =>q<="0000110";
when"0010" =>q<="1011011";
when"0011" =>q<="1001111";
when"0100" =>q<="1100110";
when"0101" =>q<="1101101";
when"0110" =>q<="1111101";
when"0111" =>q<="0100111";
when"1000" =>q<="1111111";
when others =>q<="1101111";
end case;
end process;
end disp_are;

7.定時鬧鍾模塊程序

library ieee;
use ieee.std_logic_1164.all;
entity ALERT is
port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);
clk:in std_logic;
q500,qlk:out std_logic);
end ALERT;

architecture sss_arc of ALERT is
begin
process(clk)
begin

if clk'event and clk='1' then
if m1="0101" and m0="1001" and s1="0101" then
if s0="0001" or s0="0011" or s0="0101" or s0="0111" then
q500<='1';
else
q500<='0';
end if;
end if;

if m1="0101" and m0="1001" and s1="0101" and s0="1001" then
qlk<='1';
else
qlk<='0';
end if;
end if;
end process;
end sss_arc;

㈡ VHDL數字時鍾完整程序代碼(要求要有元件例化,並且有按鍵消抖),謝謝啦啦啦啦

圖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 就這些

㈢ 基於VHDL語言的自動打鈴數字鍾設計

數字電子鍾的設計

一、 緒論

(一)引言
20世紀末,電子技術獲得了飛速的發展,在其推動下,現代電子產品幾乎滲透了社會的各個領域,有力地推動了社會生產力的發展和社會信息化程度的提高,同時也使現代電子產品性能進一步提高,產品更新換代的節奏也越來越快。
時間對人們來說總是那麼寶貴,工作的忙碌性和繁雜性容易使人忘記當前的時間。忘記了要做的事情,當事情不是很重要的時候,這種遺忘無傷大雅。但是,一旦重要事情,一時的耽誤可能釀成大禍。例如,許多火災都是由於人們一時忘記了關閉煤氣或是忘記充電時間。尤其在醫院,每次護士都會給病人作皮試,測試病人是否對葯物過敏。注射後,一般等待5分鍾,一旦超時,所作的皮試試驗就會無效。手錶當然是一個好的選擇,但是,隨著接受皮試的人數增加,到底是哪個人的皮試到時間卻難以判斷。所以,要製作一個定時系統。隨時提醒這些容易忘記時間的人。
鍾表的數字化給人們生產生活帶來了極大的方便,而且大大地擴展了鍾表原先的報時功能。諸如定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播、定時啟閉電路、定時開關烘箱、通斷動力設備,甚至各種定時電氣的自動啟用等,所有這些,都是以鍾表數字化為基礎的。因此,研究數字鍾及擴大其應用,有著非常現實的意義。
(二)論文的研究內容和結構安排
本系統採用石英晶體振盪器、分頻器、計數器、顯示器和校時電路組成。由LED數碼管來顯示解碼器所輸出的信號。採用了74LS系列中小規模集成晶元。使用了RS觸發器的校時電路。總體方案設計由主體電路和擴展電路兩大部分組成。其中主體電路完成數字鍾的基本功能,擴展電路完成數字鍾的擴展功能。論文安排如下:
1、緒論 闡述研究電子鍾所具有的現實意義。
2、設計內容及設計方案 論述電子鍾的具體設計方案及設計要求。
3、單元電路設計、原理及器件選擇 說明電子鍾的設計原理以及器件的選擇,主要從石英晶體振盪器、分頻器、計數器、顯示器和校時電路五個方面進行說明。
4、繪制整機原理圖 該系統的設計、安裝、調試工作全部完成。

二、設計內容及設計方案

(一)設計內容要求
1、設計一個有「時」、「分」、「秒」(23小時59分59秒)顯示且有校時功能的電子鍾。
2、用中小規模集成電路組成電子鍾,並在實驗箱上進行組裝、調試。
3、畫出框圖和邏輯電路圖。
4 、功能擴展:
(1)鬧鍾系統
(2)整點報時。在59分51秒、53秒、55秒、57秒輸出750Hz音頻信號,在59分59秒時,輸出1000Hz信號,音像持續1秒,在1000Hz音像結束時刻為整點。
(3)日歷系統。
(二)設計方案及工作原理
數字電子鍾的邏輯框圖如圖1所示。它由石英晶體振盪器、分頻器、計數器、解碼器顯示器和校時電路組成。振盪器產生穩定的高頻脈沖信號,作為數字鍾的時間基準,然後經過分頻器輸出標准秒脈沖。秒計數器滿60後向分計數器進位,分計數器滿60後向小時計數器進位,小時計數器按照「24翻1」規律計數。計數器的輸出分別經解碼器送顯示器顯示。計時出現誤差時,可以用校時電路校時、校分。

圖1 數字電子鍾邏輯框圖

三、單元電路設計、原理及器件選擇

(一)石英晶體振盪器
1、重要概念的解釋
(1) 反饋:將放大電路輸出量的一部分或全部,通過一定的方式送回放大電路的輸入端。
(2) 耦合:是指信號由第一級向第二級傳遞的過程。
2、石英晶體振盪器的具體工作原理
石英晶體振盪器的特點是振盪頻率准確、電路結構簡單、頻率易調整。它被廣泛應用於彩電、計算機、遙控器等各類振盪電路中。它還具有壓電效應:在晶體某一方向加一電場,晶體就會產生機械變形;反之,若在晶片的兩側施加機械壓力,則在晶片相應的方向上將產生電場,這種物理現象稱為壓電效應。在這里,我們在晶體某一方向加一電場,從而在與此垂直的方向產生機械振動,有了機械振動,就會在相應的垂直面上產生電場,從而使機械振動和電場互為因果,這種循環過程一直持續到晶體的機械強度限制時,才達到最後穩定,這種壓電諧振的頻率即為晶體振盪器的固有頻率。
用反相器與石英晶體構成的振盪電路如圖2所示。利用兩個非門G1和G2 自我反饋,使它們工作在線性狀態,然後利用石英晶體JU來控制振盪頻率,同時用電容C1來作為兩個非門之間的耦合,兩個非門輸入和輸出之間並接的電阻R1和R2作為負反饋元件用,由於反饋電阻很小,可以近似認為非門的輸出輸入壓降相等。電容C2是為了防止寄生振盪。例如:電路中的石英晶體振盪頻率是4MHz時,則電路的輸出頻率為4MHz。

圖2 石英晶體振盪電路

(二)分頻器
1、8421碼制,5421碼制
用四位二進制碼的十六種組合作為代碼,取其中十種組合來表示0-9這十個數字元號。通常,把用四位二進制數碼來表示一位十進制數稱為二-十進制編碼,也叫做BCD碼,見表1。
表1
8421碼 5421碼
0 0000 0000
1 0001 0001
2 0010 0010
3 0011 0011
4 0100 0100
5 0101 1000
6 0110 1001
7 0111 1010
8 1000 1011
9 1001 1100

2、分頻器的具體工作原理
由於石英晶體振盪器產生的頻率很高,要得到秒脈沖,需要用分頻電路。例如,振盪器輸出4MHz信號,通過D觸發器(74LS74)進行4分頻變成1MHz,然後送到10分頻計數器(74LS90,該計數器可以用8421碼制,也可以用5421碼制),經過6次10分頻而獲得1Hz方波信號作為秒脈沖信號。(見圖3)

圖3 分頻電路
3、圖中標志的含義
CP——輸入的脈沖信號
C0——進位信號
Q——輸出的脈沖信號
(三)計數器
秒脈沖信號經過6級計數器,分別得到「秒」個位、十位,「分」個位、十位以及「時」個位、十位的計時。「秒」、「分」計數器為60進制,小時為24進制。
1、60進制計數器
(1) 計數器按觸發方式分類
計數器是一種累計時鍾脈沖數的邏輯部件。計數器不僅用於時鍾脈沖計數,還用於定時、分頻、產生節拍脈沖以及數字運算等。計數器是應用最廣泛的邏輯部件之一。按觸發方式,把計數器分成同步計數器和非同步計數器兩種。對於同步計數器,輸入時鍾脈沖時觸發器的翻轉是同時進行的,而非同步計數器中的觸發器的翻轉則不是同時。
(2)60進制計數器的工作原理
「秒」計數器電路與「分」計數器電路都是60進制,它由一級10進制計數器和一級6進制計數器連接構成,如圖4所示,採用兩片中規模集成電路74LS90串接起來構成的「秒」、「分」計數器。

圖4 60進制計數電路
IC1是十進制計數器,QD1作為十進制的進位信號,74LS90計數器是十進制非同步計數器,用反饋歸零方法實現十進制計數,IC2和與非門組成六進制計數。74LS90是在CP信號的下降沿翻轉計數,Q A1和 Q C2相與0101的下降沿,作為「分」(「時」)計數器的輸入信號,通過與非門和非門對下一級計數器送出一個高電平1(在此之前輸出的一直是低電平0)。Q B2 和Q C2計數到0110,產生的高電平1分別送到計數器的清零R0(1), R0(2),74LS90內部的R0(1)和R0(2)與非後清零而使計數器歸零,此時傳給下一級計數器的輸入信號又變為低電平0,從而給下一級計數器提供了一個下降沿,使下一級計數器翻轉計數,在這里IC2完成了六進制計數。由此可見IC1和 IC2串聯實現了六十進制計數。
其中:74LS90——可二/五分頻十進制計數器
74LS04——非門
74LS00——二輸入與非門
2、24進制計數器
小時計數電路是由IC5和IC6組成的24進制計數電路,如圖5所示。
當「時」個位IC5計數輸入端CP5來到第10個觸發信號時,IC5計數器自動清零,進位端QD5向IC6「時」十位計數器輸出進位信號,當第24個「時」(來自「分」計數器輸出的進位信號)脈沖到達時,IC5計數器的狀態為「0100」,IC6計數器的狀態為「0010」,此時「時」個位計數器的QC5和「時」十位計數器的QB6輸出為「1」。把它們分別送到IC5和IC6計數器的清零端R0(1)和R0(2),通過7490內部的R0(1)和R0(2)與非後清零,從而完成24進制計數。

圖5 24進制計數電路
(四) 解碼與顯示電路
1、顯示器原理(數碼管)
數碼管是數碼顯示器的俗稱。常用的數碼顯示器有半導體數碼管,熒光數碼管,輝光數碼管和液晶顯示器等。
本設計所選用的是半導體數碼管,是用發光二極體(簡稱LED)組成的字形來顯示數字,七個條形發光二極體排列成七段組合字形,便構成了半導體數碼管。半導體數碼管有共陽極和共陰極兩種類型。共陽極數碼管的七個發光二極體的陽極接在一起,而七個陰極則是獨立的。共陰極數碼管與共陽極數碼管相反,七個發光二極體的陰極接在一起,而陽極是獨立的。
當共陽極數碼管的某一陰極接低電平時,相應的二極體發光,可根據字形使某幾段二極體發光,所以共陽極數碼管需要輸出低電平有效的解碼器去驅動。共陰極數碼管則需輸出高電平有效的解碼器去驅動。
2、解碼器原理(74LS47)
解碼為編碼的逆過程。它將編碼時賦予代碼的含義「翻譯」過來。實現解碼的邏輯電路成為解碼器。解碼器輸出與輸入代碼有唯一的對應關系。74LS47是輸出低電平有效的七段字形解碼器,它在這里與數碼管配合使用,表2列出了74LS47的真值表,表示出了它與數碼管之間的關系。
表2
輸 入 輸 出 顯示數字元號
LT(——) RBI(——-) A3 A2 A1 A0 BI(—)/RBO(———)
a(—) b(—) c(—) d(—) e(—) f(—) g(—)

1 1 0 0 0 0 1 0 0 0 0 0 0 1 0
1 X 0 0 0 1 1 1 0 0 1 1 1 1 1
1 X 0 0 1 0 1 0 0 1 0 0 1 0 2
1 X 0 0 1 1 1 0 0 0 0 1 1 0 3
1 X 0 1 0 0 1 1 0 0 1 1 0 0 4
1 X 0 1 0 1 1 0 1 0 0 1 0 0 5
1 X 0 1 1 0 1 1 1 0 0 0 0 0 6
1 X 0 1 1 1 1 0 0 0 1 1 1 1 7
1 X 1 0 0 0 1 0 0 0 0 0 0 0 8
1 X 1 0 0 1 1 0 0 0 1 1 0 0 9
X X X X X X 0 1 1 1 1 1 1 1 熄滅
1 0 0 0 0 0 0 1 1 1 1 1 1 1 熄滅
0 X X X X X 1 0 0 0 0 0 0 0 8
(1)LT(——):試燈輸入,是為了檢查數碼管各段是否能正常發光而設置的。當LT(——)=0時,無論輸入A3 ,A2 ,A1 ,A0為何種狀態,解碼器輸出均為低電平,若驅動的數碼管正常,是顯示8。
(2)BI(—):滅燈輸入,是為控制多位數碼顯示的滅燈所設置的。BI(—)=0時。不論LT(——)和輸入A3 ,A2 ,A1,A0為何種狀態,解碼器輸出均為高電平,使共陽極數碼管熄滅。
(3)RBI(——-):滅零輸入,它是為使不希望顯示的0熄滅而設定的。當對每一位A3= A2 =A1 =A0=0時,本應顯示0,但是在RBI(——-)=0作用下,使解碼器輸出全為高電平。其結果和加入滅燈信號的結果一樣,將0熄滅。
(4)RBO(———):滅零輸出,它和滅燈輸入BI(—)共用一端,兩者配合使用,可以實現多位數碼顯示的滅零控制。
3、解碼器與顯示器的配套使用
解碼是把給定的代碼進行翻譯,本設計即是將時、分、秒計數器輸出的四位二進制數代碼翻譯為相應的十進制數,並通過顯示器顯示,通常顯示器與解碼器是配套使用的。我們選用的七段解碼驅動器(74LS47)和數碼管(LED)是共陽極接法(需要輸出低電平有效的解碼器驅動)。解碼顯示電路如圖6所示。

圖6 解碼顯示電路
(五)校時電路
1、RS觸發器(見圖7)

圖7 基本RS觸發器
R(—) S(—)
Q Q(—)
說 明
0 1
1 0
1 1
0 0 0
1
0或1
1 1
0
1或0
1 置0
置1
保持原來狀態
不正常狀態,0信號消失後,觸發器狀態不定

2、無震顫開關電路
無震顫開關電路的原理:(見圖8)當開關K的刀扳向1點時,S(—)=0,R(—)=1,觸發器置1。S(—)端由於開關K的震顫而斷續接地幾次時,也沒有什麼影響,觸發器置1後將保持1狀態不變。因為K震顫只是使S(—)端離開地,而不至於使R(—)端接地,觸發器可靠置1。
當開關K從S(—)端扳向R(—)端時,有同樣的效果,觸發器可靠置0。從Q端或Q(—)端反映開關的動作,輸出電平是穩定的。
3、校時電路的實現原理
當電子鍾接通電源或者計時發現誤差時,均需要校正時間。校時電路分別實現對時、分的校準,由於4個機械開關具有震顫現象,因此用RS觸發器作為去抖動電路。採用RS基本觸發器及單刀雙擲開關,閘刀常閉於2點,每搬動一次產生一個計數脈沖,實現校時功能,電路如圖8所示。

圖8 校時電路
(六)調 試

畢滿清等.電子技術實驗與課程設計.北京:機械工業出
版社,1995.131~132
這本書上很全

㈣ vhdl數字鍾的代碼

a.秒計數器設計(xsecond)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity xsecond is
port (clk:in std_logic;
clkset:in std_logic;
setmin:in std_logic;
reset:in std_logic;
secout:out std_logic_vector(6 downto 0);
enmin:out std_logic );
end xsecond;
architecture xsecond_arch of xsecond is
signal sec:std_logic_vector(6 downto 0);
signal emin:std_logic;
signal secl: std_logic;
begin
process (reset,sec,emin,setmin,clkset)
begin
if reset='0' then
enmin<='0';
secout<="0000000";
secl<='1';
else
secl<='0';
secout<=sec;
if clkset='1'and clkset'event then
if setmin ='0'then
enmin <='1';
else
enmin<=emin;
end if;
end if;
end if;
end process;
process(clk,secl)
alias lcount: std_logic_vector(3 downto 0)is sec (3 downto 0);
alias hcount:std_logic_vector(2 downto 0)is sec (6 downto 4);
begin
if secl='1' then
sec<="0000000";
else
if (clk='1' and clk'event) then
if lcount <=9 then
lcount<="0000";
if hcount/=5 then
hcount <=hcount+1;
emin<='0';
else
hcount<="000";
emin<='1';
end if;
else
lcount<=lcount+1;
emin<='0';
end if;
end if;
end if;
end process;
end xsecond_arch;
b.分計數器設計(xminute)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity xminute is
port (clkmin:in std_logic;
clk:in std_logic;
sethour:in std_logic;
reset:in std_logic;
minout:out std_logic_vector(6 downto 0);
enhour:out std_logic );
end xminute;
architecture xminute_arch of xminute is
signal min:std_logic_vector(6 downto 0);
signal ehour:std_logic;
signal minl: std_logic;
begin
process (reset,clk,min,sethour,ehour)
begin
if reset='0' then
enhour<='0';
minout<="0000000";
minl<='0';
else
minl<='1';
minout<=min;
if clk='1'and clk'event then
if sethour ='0'then
enhour <='1';
else
enhour<=ehour;
end if;
end if;
end if;
end process;
process(clkmin,minl)
alias lcountm: std_logic_vector(3 downto 0)is min (3 downto 0);
alias hcountm:std_logic_vector(2 downto 0)is min (6 downto 4);
begin
if minl='0' then
min<="0000000";
else
if (clkmin='1' and clkmin'event) then
if lcountm <=9 then
lcountm<="0000";
if hcountm/=5 then
hcountm <=hcountm+1;
ehour<='0';
else
hcountm<="000";
ehour<='1';
end if;
else
lcountm<=lcountm+1;
ehour<='0';
end if;
end if;
end if;
end process;
end xminute_arch;
c.時計數器設計(xhour)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity xhour is
port (clkhour:in std_logic;
reset:in std_logic;
hourout:out std_logic_vector(5 downto 0));
end xhour;
architecture xhour_arch of xhour is
signal hour:std_logic_vector(5 downto 0);
begin
process (reset,clkhour,hour)
alias lcount: std_logic_vector(3 downto 0)is hour(3 downto 0);
alias hcount:std_logic_vector(1 downto 0)is hour(5 downto 4);
begin
if reset='0' then
hourout<="000000";
hour<="000000";
else
if (clkhour='1' and clkhour'event) then
if lcount <=9 then
lcount<="0000";
hcount<=hcount+1;
else
if hour="100011" then
hour<="000000";
else
lcount<=lcount+1;
end if;
end if;
end if;
hourout<=hour;
end if;
end process;
end xhour_arch;
d.動態掃描電路設計(xsettime)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity xsettime is
port (hour:in std_logic_vector(5 downto 0);
min:in std_logic_vector(6 downto 0);
sec:in std_logic_vector(6 downto 0);
reset : in std_logic;
clk:in std_logic;
sel:out std_logic_vector(2 downto 0);
d_out:out std_logic_vector(3 downto 0));
end xsettime;
architecture xsettime_arch of xsettime is
signal sel1:std_logic_vector(2 downto 0);
begin
process (reset,sec,min,hour,clk,sel1)
begin
if reset='0' then
sel <="000";
d_out<="0000";
sel1<="000";
else
if(clk='1'and clk'event) then
if sel1<5 then
sel1<=sel1+1;
else
sel1<="000";
end if;
end if;
sel<=sel1;
case sel1 is
when "000"=>
d_out( 3 )<='0';
d_out( 2 )<='0';
d_out( 2 )<=hour( 5 );
d_out( 0 )<=hour( 4);
when "001"=>
d_out <= hour(3 downto 0);
when "010"=>
d_out( 3 )<='0';
d_out( 2 )<=min( 6 );
d_out( 1 )<=min( 5);
d_out( 0 )<=min( 4);
when "011"=>
d_out <= min(3 downto 0);
when "100"=>
d_out( 3 )<='0';
d_out( 2 )<=sec( 6 );
d_out( 1 )<=sec( 5);
d_out( 0 )<=sec( 4);
when "101"=>
d_out <= sec(3 downto 0);
when others=>
null;
end case;
end if;
end process;
end xsettime_arch;
e.報時電路設計(xalert)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity xalert is
port (clk:in std_logic;
d_in:in std_logic_vector(6 downto 0);
speak : out std_logic;
d_out:out std_logic_vector(2 downto 0) );
end xalert;
architecture xalert_arch of xalert is
type state is (s1,s2,s3,s4);
signal next_state,current_state:state;
begin
process (clk,current_state,d_in)
begin
if d_in/="0000000" then
speak <='0';
next_state <=s1;
current_state<=s1;
d_out<="000";
else
if clk='1'and clk'event then
speak <='1';
end if;
case current_state is
when s1 =>
d_out<="000";
next_state<=s2;
when s2 =>
d_out<="001";
next_state<=s3;
when s3 =>
d_out<="010";
next_state<=s4;
when s4 =>
d_out<="100";
next_state<=s1;
when others =>
d_out<="000";
null;
end case;
end if;
end process;
end xalert_arch;

閱讀全文

與數字鍾計時器vhdl編程相關的資料

熱點內容
小奔運動app網路異常怎麼回事 瀏覽:447
php開啟壓縮 瀏覽:303
伺服器主機如何設置啟動 瀏覽:282
linux配置網路命令 瀏覽:774
一張照片怎麼製作視頻app 瀏覽:908
pythonweb和php 瀏覽:976
電腦伺服器地址ip地址 瀏覽:823
對矩陣壓縮是為了 瀏覽:910
setfacl命令 瀏覽:172
linux子系統中斷 瀏覽:342
linux查看進程ps 瀏覽:224
知識庫系統php 瀏覽:623
小波變換壓縮圖像python 瀏覽:151
阿里巴巴程序員怎麼月入百萬 瀏覽:173
如何使用國外伺服器 瀏覽:188
燃燈者pdf 瀏覽:468
編譯器用數學嗎 瀏覽:7
圖形化apk反編譯工具 瀏覽:48
考勤表加密怎麼辦 瀏覽:735
arj壓縮與解壓批處理怎麼寫 瀏覽:658