eda課程設計數字鍾
① EDA課程設計——數字電子鍾
1、基本要求:能利用現有的硬體系統設計一個至少能顯示分、秒的控制電路。分和秒均用兩位數碼管指示,並具有調時、復位功能;
2、擴展要求:能同時顯示小時(兩位數碼管)並能調節小時功能;具有鬧鍾定時功能。
3、設計方法:採用模塊化描述方法,可分為分頻模塊、調時控制模塊、數碼顯示模塊、復位等模塊,每個模塊既可以編輯成獨立的HDL文件或GDF文件,也可以作為HDL程序中的一個進程模塊,最後進行系統模擬加以驗證,在此基礎上下載到硬體上進行現場測試。
4、輸入、輸出埠描述:輸入信號——時鍾信號clk、復位信號clr、時間設置鍵set、時間上調鍵tup、時間下調鍵tdown;輸出信號——掃描式七段數碼管段選輸出端led[7..0]、位選輸出端ctrlbit[3..0]。
我來幫他解答
2011-6-1 17:06
滿意回答
設計原理
計數時鍾由模為60的秒計數器模塊、模為60的分計數模塊、模為24的小時計數器模塊、指示燈與報警器的模塊、分/小時設定模塊及輸出顯示模塊等組成。秒計數器模塊的進位輸出為分計數器模塊的進位輸入,分計數器模塊的進位輸出為小時計數器模塊的進位輸入。其中秒計數器模塊中應有分鍾的設定,分計數器模塊中應有小時的設定。
內容
設計一個計數時鍾,使其具有24小時計數功能。通過「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意引線插孔可設置小時和分鍾的值,並具有整點報時的功能。
電路原理圖
模塊說明:計數時鍾由60秒計數器模塊XSECOND、60分計數器模塊XMINUTE、24小時計數器模塊XHOUR等六個模塊構成。秒計數器模塊的進位輸出為分計數器模塊的進位輸入,分計數器模塊中有小時的設定。通過SW1、SW2、SW3、SW4可設定小時和分鍾的值,並具有整點報時的功能。
輸入信號:SETMIN為分鍾設置信號;SETHOUR為小時設置信號;RESET為全局復位信號;CLK為全局時鍾信號;CKDSP為數碼管動態掃描信號。
輸出信號:SPEAK為蜂鳴器報時信號;LAMP[2..0]為指示燈信號;A~G為數碼管七個段位信號;SS[2..0]為數碼管段位解碼控制信號。
說明與電路連線
指示燈信號LAMP2~LAMP0為獨立擴展下載板上CPLD器件的第11、10、9腳,內部已連接並已鎖定,無需外接連線。
蜂鳴器報時信號SPEAK為獨立擴展下載板CPLD器件的第31腳,內部已連接並已鎖定,無需外接連線。
撥碼開關SW1~SW7內部已連接並已鎖定,無需外接連線。
數碼管七個段位信號A~G為獨立擴展下載板上CPLD器件的第86、87、88、89、90、92、93腳,應接數碼管段位引線接線組KPL_AH,從左到右依次對應的A、B、C、D、E、F、G引線插孔。
數碼管段位解碼控制信號SS0、SS1、SS2為獨立擴展下載板上CPLD器件的第68、69、70腳,為數碼管的位選掃描信號,分別接信號接線組DS1-8A(T)的SS0、SS1、SS2引線插孔(即在電源引線插孔組GND孔處)。
復位信號RESET為獨立擴展下載板上CPLD器件的第71腳,應接「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意一個插孔。
小時設置信號SETHOUR為獨立擴展下載板CPLD器件的第73腳,應接「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意一個插孔。
分鍾設置信號SETMIN為獨立擴展下載板上CPLD器件的第74腳,應接「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意一個插孔。
時鍾信號CLK為獨立擴展下載板上CPLD器件的183腳(即GCLK2),應接時鍾信號接線組「CLOCK(T)」的「FRQ(21)」引線插孔。
數碼管動態掃描信號CKDSP為獨立擴展下載板上CPLD器件的79腳(即GCLK1),應接時鍾信號接線組「CLOCK(T)」的「FRQ(11)」引線插孔。
參考源程序
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 sec1 : std_logic;
begin
-- <<enter your statements here>>
process(reset,sec,emin,setmin,clkset)
begin
if reset='0' then
enmin<='0';
secout<="0000000";
sec1<='1';
else
sec1<='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,sec1)
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 sec1='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;
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;
reset: in STD_LOGIC;
sethour: in STD_LOGIC;
clk: 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 min1 : std_logic;
begin
-- <<enter your statements here>>
process(reset,clk,sethour,min,ehour)
begin
if reset='0' then
enhour<='0';
minout<="0000000";
min1<='0';
else
min1<='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,min1)
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 min1='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;
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
-- <<enter your statements here>>
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;
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
-- <<enter your statements here>>
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';
current_state<=next_state;
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;
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
-- <<enter your statements here>>
process(clk,reset,sel1,hour,min,sec)
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(1)<=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;
library IEEE;
use IEEE.std_logic_1164.all;
entity xdeled is
port (
d_in: in STD_LOGIC_VECTOR (3 downto 0);
a: out STD_LOGIC;
b: out STD_LOGIC;
c: out STD_LOGIC;
d: out STD_LOGIC;
e: out STD_LOGIC;
f: out STD_LOGIC;
g: out STD_LOGIC
);
end xdeled;
才五分啊,太少了吧
哥剛的
② EDA設計數字鍾
剛寫完一個呵呵.
soft_store後面加@後面加163再加COM
③ EDA VHDL 語言 quartusII數字鍾設計 求哪位大神寫一下
觸發條件就是七個輸入端都『or』起來。^_^ 判斷的時候計算他們當中為『1』的有幾個。多於四,就輸出『1』。少於四就輸出『0』。
④ eda 數字時鍾
我不是學姐,答案我就不幫你做了,給你一些提示,希望你能獨立完成。
1:先選對版計數器,根據需要選擇4位,權8位,32位(如果沒有32位的計數器可以用2個16位的計數器級聯起來,第一級的計數器的高位輸出驅動第二級的計數器始終)
2:10進制,12進制,60進制的計數器怎麼做?
你需要一個比較器,比較器輸入端比較counter的值和一個preset value,如果兩個值相等,則輸出一,否則輸出0,用這個比較信號來控制counter的復位信號,注意有些復位是低電平有效
3:有了上面的這些計數器以後怎麼做時鍾?
用級聯的方式把上面這些計數器串聯起來,也就是說
用function generator 產生一個10Hz的頻率分秒的比較器輸出當作秒的時鍾輸入(enable也可以),同樣的道理,秒的計數器的比較器出入做分的計數器的十種輸入。。
⑤ EDA課程設計——《數字鍾》體會怎麼寫啊
課程設計感悟
通過這次設計,既復習了以前所學的知識,也進一步加深了對EDA的了解,讓我對它有了更加濃厚的興趣。特別是當每一個子模塊編寫調試成功時,心裡特別的開心。但是在畫頂層原理圖時,遇到了不少問題,最大的問題就是根本沒有把各個模塊的VHD文件以及生成的器件都全部放在頂層文件的文件夾內,還有就是程序設計的時候考慮的不夠全面,沒有聯系著各個模式以及實驗板的情況來編寫程序,以至於多考慮編寫了解碼電路而浪費了很多時間。在波形模擬時,也遇到了一點困難,想要的結果不能在波形上得到正確的顯示:在分頻模塊中,設定輸入的時鍾信號後,卻只有二分頻的結果,其餘三個分頻始終沒反應。後來,在數十次的調試和老師的指點之後,才發現是因為規定的信號量范圍太大且信號的初始值隨機,從而不能得到所要的結果。還有的模擬圖根本就不出波形,怎麼調節都不管用,後來才知道原來是路徑不正確,路徑中不可以有漢字。真是細節決定成敗啊!
總的來說,這次設計的數字鍾還是比較成功的,有點小小的成就感,終於覺得平時所學的知識有了實用的價值,達到了理論與實際相結合的目的,不僅學到了不少知識,而且鍛煉了自己的能力,使自己對以後的路有了更加清楚的認識,同時,對未來有了更多的信心。
⑥ (EDA)電子鍾的設計
為期兩周的課設已經接近尾聲了,在這2周中,我學到了很多,對EDA的認識也進一步加深了。從一個剛入門的學習者,漸漸的愛上了這門技術,雖然說對於EDA的知識還有很多要學習和提高,但是在這2周中我還是感受到這門課程的魅力所在。
在拿到數字鍾這個課題時,我和我的合作夥伴對這個課題感到比較輕松,腦海中一下子出現了許多設計念頭,於是我們就分頭去尋找這方面的資料,通過圖書館的書籍資料,網路上的虛擬資料。在2天的找資料的過程中,我開始覺得所謂的數字鍾並非我想像的那麼簡單。一開始我想到的數字鍾只是一般的計數功能並未涉及到調時,調分,和鬧鈴功能。在如何顯示方面也沒有細細的考慮過。在看過一些資料後,越來越感覺到數字鍾課題並非手到擒來。
在與夥伴商量後,我們以一本參考書的資料為基礎開始展開細致設計。我們一開始的輸入是有三個模塊 ,輸入模塊,計數模塊,和顯示模塊。對於計數模塊我們通過分頻方法很快就得到了1HZ的頻率用於計數,再通過計數進位標志實現秒,分,時的互相關聯,再顯示模塊,我們通過7段數碼管掃描顯示也的到了實現。但是在輸入模塊,我們卻遇到了障礙,如何通過硬體上的有限的開關和按鈕來實現呢。我們首先想到了 ,做一個可以輸入數字的鍵盤和開關(16*16),可是在想到鍵盤設計本身就是一個非常復雜的過程,想到2周能做好的話有一定的難度,於是我們果斷的放棄了這一計劃。那麼如何實現輸入,這個問題擺在我們面前,我感到了課設以來前所未有的壓抑感。通過四個開關控制0—9的輸入,但是如何控制是輸入的是哪一位,如何進行調時,鬧鈴控制?都是難題。
在冥想了2天後,我才發現自己陷如了思維的局限性中,為什麼一定通過輸入來完成調時呢,我們不可以通過他本身的計數功能來調時,這樣雖然沒有像我們所想的輸入調時那樣方便,但是它的簡單在於充分利用了1HZ頻率,通過干擾進位標志進行調時。這一個方法想到後,其他的鬧鈴功能和報時功能也都迎刃而解了。經過3天的編程和功能完善,我們基本實現了所有的功能,各個模塊的編譯和模擬也都實現了,第二個星期,實驗室開放,我和夥伴就開始進行硬體上的實現了,在完成頂層設計後,我們成功的下載在硬體上了。通過調時後,基本實現了全部功能,並通過了老師的檢查。到此本次課設基本上實現了所有的功能,但在有些功能的實現中,還有待提高。比如說對於調時功能,只能等待調時,這樣對於調時的機動性不好,如果控制不好,過了應調時間的話,就必須在等一次循環後才能調時,這樣就很浪費時間了 。還有就是鬧鍾功能並未完全實現它,我們只是編寫了一個特定的程序來鬧鈴,鬧鈴時間已經事先安排好了,無法再通過手動調節了,這樣就缺少了人性化。這在課設結束以後,要進一步的改進,爭取獲得一款高性能的人性化的數字鍾。
通過本次課設,我不僅學到了關於EDA的許多專業知識,同時也讓我感覺到團隊合作的重要性。其實如何有效和快速的找到資料也是課設給我的啟發,利用好圖書館和網路,是資源的到最好的利用。如果我們一味的屋子裡苦思冥想那麼再給2周的時間或許也不會有數字鍾誕生,所以我覺得與他人交流思想是取得成功的關鍵,在交流中,不僅強化了自己原有的知識體系也可以擴展自己的思維。通過思考、發問、自己解惑並動手、改進的過程,才能真正的完成課題。經過這次課程設計的過程,我相信在以後的課程設計中我們會吸取經驗教訓,做出更好的設計來。
⑦ 求高手幫忙編一段EDA程序,數字鍾的
//以下代碼只包含分和秒,如果需要小時,可自行添加
mole clock(clk,dig_r,seg_r);
input clk;
output [7:0]dig_r;
output [7:0]seg_r;
reg sec;
reg [7:0]dig_r;
reg [7:0]seg_r;
reg [24:0]count;
reg [15:0]hour;
reg [3:0]disp_dat;
always @(posedge clk)
begin
count=count+1'b1;
if(count==25'd24000000)
begin
count=25'd0;
sec=~sec;
end
end
always @(negedge sec)
begin
hour[3:0]=hour[3:0]+1'b1;
if(hour[3:0]==4'ha)
begin
hour[3:0]=4'h0;
hour[7:4]=hour[7:4]+1'b1;
if(hour[7:4]==4'h6)
begin
hour[7:4]=4'h0;
hour[11:8]=hour[11:8]+1'b1;
if(hour[11:8]==4'ha)
begin
hour[11:8]=4'h0;
hour[15:12]=hour[15:12]+1'b1;
if(hour[15:12]==4'h6)
hour[15:12]=4'h0;
end
end
end
end
always @(posedge clk)
begin
case(count[17:15])
3'd0:disp_dat=hour[3:0];
3'd1:disp_dat=hour[7:4];
3'd2:disp_dat=4'ha;
3'd3:disp_dat=hour[11:8];
3'd4:disp_dat=hour[15:12];
3'd5:disp_dat=4'ha;
3'd6:disp_dat=8'h00;
3'd7:disp_dat=8'h00;
endcase
case(count[17:15])
3'd0:dig_r=8'b11111110;
3'd1:dig_r=8'b11111101;
3'd2:dig_r=8'b11111011;
3'd3:dig_r=8'b11110111;
3'd4:dig_r=8'b11101111;
3'd5:dig_r=8'b11111111;
3'd6:dig_r=8'b11111111;
3'd7:dig_r=8'b11111111;
endcase
end
always @(posedge clk)
begin
case(disp_dat)
4'h0:seg_r=8'hc0;
4'h1:seg_r=8'hf9;
4'h2:seg_r=8'ha4;
4'h3:seg_r=8'hb0;
4'h4:seg_r=8'h99;
4'h5:seg_r=8'h92;
4'h6:seg_r=8'h82;
4'h7:seg_r=8'hf8;
4'h8:seg_r=8'h80;
4'h9:seg_r=8'h90;
4'ha:seg_r=8'hbf;
default:seg_r=8'hff;
endcase
end
endmole
⑧ EDA課程設計——數字電子鍾 設計一個電子時鍾,要求可以顯示時、分、秒,用戶可以設置時間。 擴展功能:秒
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity code is
port( clk: in std_logic;--電路工作時的時鍾信號
clk1: in std_logic;--鬧鈴產生需要的時鍾信號
k: in std_logic;--高電平表示輸入1
led: out std_logic;--輸入正確時亮
led1: out std_logic;--輸入錯誤時亮
reset: in std_logic;-- 按下時復位
want: in std_logic;--是否修改密碼
alarm: out std_logic;--輸出鬧鈴聲
show: out std_logic_vector(3 downto 0));--提示作用
end;
architecture a of code is
signal temp: std_logic_vector(3 downto 0);--輸入一位加1
signal code: std_logic_vector(7 downto 0);--儲存密碼
signal getcode: std_logic_vector(7 downto 0);--儲存修改後的密碼
signal counter: std_logic_vector(3 downto 0);--計數
signal allow: std_logic;--是否允許修改密碼
signal ring:std_logic;--是否接通鬧鈴
begin
process(clk)
begin
if ring='1' then
alarm<=clk1;--鬧鈴接通
else
alarm<='0';--鬧鈴截至
end if;
if reset='1' then--按下reset後,密碼歸為初始密碼
getcode<="00000000";--初始密碼
counter<="0000";--內部計數
code<="11001000";--密碼
led<='0';
led1<='0';
allow<='0';
elsif clk'event and clk='1' then--輸入clk脈沖,則接收1位密碼
getcode<=getcode(6 downto 0)&k;--將這1位密碼並入getcode中的最後一位
if counter="1000" then--輸入為8位數碼時比較
if code=getcode then
led<='1';--正確燈亮
led1<='0';
ring<='0';
allow<='1';--允許修改密碼
elsif allow='1' and want='1' then--如果允許輸入且想輸入
code<=getcode;--輸入新密碼
led<='0';
led1<='0';
else
allow<='0';
led<='0';
led1<='1';--錯誤燈亮
ring<='1';--鬧鈴響
end if;
counter<="0000";--重新計數
else
counter<=counter+1; --累加
temp<=temp+1;--為防止泄露密碼,特別設置
end if;
end if;
show <= temp;
end process;
end;