數字秒表

數字秒表主要由:分頻器、掃描顯示解碼器、一百進制計數器、六十進制計數器(或十進制計數器與6進制計數器)、十二進制計數器(或二十四進制計數器)電路組成。在整個秒表中最關鍵的是如何獲得一個精確的100HZ計時脈衝,除此之外,數字秒表需有清零控制端,以及啟動控制端、保持保持,以便數字時鐘能隨意停止及啟動。數字秒表顯示由時(12或24進制任選)、分(60進制)、秒(60進制)、百分之一秒(一百進制)組成,利用掃描顯示解碼電路在八個數碼管顯示

基本介紹

  • 中文名:數字秒表
  • 外文名:Digital stopwatch
  • 組成:分頻器、掃描顯示解碼器
  • 特點:便數字時鐘能隨意停止及啟動
  • 所屬:科技產品
數字秒表,電路圖,分頻模組,計數模組,顯示模組,報時模組,流程圖,總結,

數字秒表

數字時鐘組成及功能:
1、分頻率器:用來產生100HZ計時脈衝;
2、十二或二十四進制計數器:對時進行計數;
3、六十進制計數器:對分和秒進行計數;
4、六進制計數器:分別對秒十位和分十位進行計數;
圖片圖片
5、十進制計數器:分別對秒個位和分個位進行計數;
6、掃描顯示解碼器:完成對7欄位數碼管顯示的控制。
設計內容及步驟:
1、根據電路持點,用層次設計概念。將此設計任務分成若干模組,規定每一模組的功能和各模組之間的接口,同時加深層次化設計概念;
2、軟體的元件管理深層含義,以及模組元件之間的連線概念,對於不同目錄下的同一設計,如何熔合;
3、適配劃分前後的仿真內容有何不同概念,仿真信號對象有何不同,有更深一步了解。熟悉了CPLD/FPGA設計的調試過程中手段的多樣化;
4、按適配劃分後的管腳定位,同相關功能塊硬體電路接口連線;
5、所有模組儘量採用VHDL語言設計。

電路圖

數字秒表

分頻模組

將實驗箱提供的10MHz的時鐘脈衝分頻後變成100Hz的脈衝,該模組的VHDL設計代碼如下:
library ieee;
use ieee.std_logic_1164.all;
entity DIV105 is
port
(CLKIN: in std_logic;
CLKOUT: out std_logic
);
end;
architecture DEVIDER of DIV105 is
constant N:integer:=50000;
signal COUNTER:integer range 0 to N;
signal CLK:std_logic;
begin
process(CLKIN)
begin
if CLKIN'event and CLKIN='1' then
if COUNTER=N then
COUNTER<=0;
CLK<=not CLK;
else
COUNTER<=COUNTER+1;
end if;
end if;
end process;
CLKOUT<=CLK;
end;

計數模組

十進制計數模組的VHDL設計如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity count10 is
port(clr,start,clk: in bit;
cout: out bit;
daout: out std_logic_vector(3 downto 0));
end count10;
architecture a of count10 is
signal temp:std_logic_vector(3 downto 0);
begin
process(clk,clr)
begin
if clr=&apos;1&apos; then
temp<="0000";
cout<=&apos;0&apos;;
elsif (clk&apos;event and clk=&apos;1&apos;) then
if start=&apos;1&apos; then
if temp>="1001" then
temp<="0000";
cout<=&apos;1&apos;;
else
temp<=temp+1;
cout<=&apos;0&apos;;
end if;
end if;
end if;
daout<=temp;
end process;
end a;
六進制計數模組的VHDL設計如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity count6 is
port(clr,start,clk: in bit;
daout: out std_logic_vector(3 downto 0);
cout: out std_logic);
end count6;
architecture a of count6 is
signal temp:std_logic_vector(3 downto 0);
begin
process(clk,clr)
begin
if clr=&apos;1&apos; then
temp<="0000";
cout<=&apos;0&apos;;
elsif (clk&apos;event and clk=&apos;1&apos;) then
if start=&apos;1&apos; then
if temp>="0101" then
temp<="0000";
cout<=&apos;1&apos;;
else
temp<=temp+1;
cout<=&apos;0&apos;;
end if;
end if;
end if;
end process;
daout<=temp;
end a;
二十四進制計數模組的VHDL設計如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity count24 is
port(clr,start,clk: in bit;
cout: out bit;
daoutL: out std_logic_vector(3 downto 0);
daoutH: out std_logic_vector(3 downto 0));
end count24;
architecture a of count24 is
signal tempL:std_logic_vector(3 downto 0);
signal tempH:std_logic_vector(3 downto 0);
begin
process(clk,clr)
begin
if clr=&apos;1&apos; then
tempL<="0000";
tempH<="0000";
cout<=&apos;0&apos;;
elsif (clk&apos;event and clk=&apos;1&apos;) then
if start=&apos;1&apos; then
if tempL>="1001" and tempH>="0000" then
tempL<="0000";
tempH<="0001";
cout<=&apos;0&apos;;
elsif tempL>="1001" and tempH>="0001" then
tempL<="0000";
tempH<="0010";
cout<=&apos;0&apos;;
elsif tempL>="0011" and tempH>="0010" then
tempL<="0000";
tempH<="0000";
cout<=&apos;1&apos;;
else
tempL<=tempL+1;
cout<=&apos;0&apos;;
end if;
end if;
end if;
daoutL<=tempL;
daoutH<=tempH;
end process;
end a;

顯示模組

顯示模組實現的功能是控制數碼管的段選和位選,該顯示模組用的是動態掃描顯示,掃描脈衝頻率是1000Hz.此模組的其它八組輸入端控制LED的段選位。
顯示模組1000HZ時鐘VHDL設計如下:
library ieee;
use ieee.std_logic_1164.all;
entity div0 is
port(clr,clk: in bit;q: buffer bit);
end div0;
architecture a of div0 is
signal counter:integer range 0 to 4999;
begin
process(clr,clk)
begin
if (clk=&apos;1&apos; and clk&apos;event) then
if clr=&apos;1&apos; then
counter<=0;
elsif counter=4999 then
counter<=0;
q<= not q;
else
counter<=counter+1;
end if;
end if;
end process;
end a;
動態掃描模組的VHDL設計如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity SELTIME0 is
port(
clk:in std_logic;------掃描時鐘
secm1,secm0,sec1,sec0,min1,min0,h1,h0:in std_logic_vector(3 downto 0);-----分別為秒個位/時位;分個位/
daout:out std_logic_vector(3 downto 0);----------------輸出
sel:out std_logic_vector(2 downto 0));-----位選信號
end SELTIME0;
architecture fun of SELTIME0 is
signal count:std_logic_vector(2 downto 0);----計數信號
begin
sel<=count;
process(clk)
begin
if(clk&apos;event and clk=&apos;1&apos;) then
if(count>="111") then
count<="000";
else
count<=count+1;
end if;
end if;
case count is
when"000"=>daout<= secm1;----百分之一秒位
when"001"=>daout<= secm0;----十分之一秒位
when"010"=>daout<= sec1;----秒個位
when"011"=>daout<= sec0;----十秒位
when"100"=>daout<=min1; ----分個位
when"101"=>daout<=min0;----十分位
when"110"=>daout<=h1;-----時個位
when others =>daout<=h0;----十時位
end case;
end process;
end fun;
數碼管驅動顯示VHDL代碼如下:
subdesign deled
(num[3..0]:input;
a,b,c,d,e,f,g:output;)
begin
table
num[3..0]=>a,b,c,d,e,f,g;
H"0" =>1,1,1,1,1,1,0;
H"1" =>0,1,1,0,0,0,0;
H"2" =>1,1,0,1,1,0,1;
H"3" =>1,1,1,1,0,0,1;
H"4" =>0,1,1,0,0,1,1;
H"5" =>1,0,1,1,0,1,1;
H"6" =>1,0,1,1,1,1,1;
H"7" =>1,1,1,0,0,0,0;
H"8" =>1,1,1,1,1,1,1;
H"9" =>1,1,1,1,0,1,1;
H"A" =>1,1,1,0,1,1,1;
H"B" =>0,0,1,1,1,1,1;
H"C" =>1,0,0,1,1,1,0;
H"D" =>0,1,1,1,1,0,1;
H"E" =>1,0,0,1,1,1,1;
H"F" =>1,0,0,0,1,1,1;
end table;
end;

報時模組

報時用蜂鳴器,每分鐘一次,持續1s
library ieee;
use ieee.std_logic_1164.all;
entity ALARM is
port(s1,s0:in std_logic_vector(3 downto 0);
clk:in std_logic;
q:out std_logic);
end ALARM;
architecture sss_arc of ALARM is
begin
process(clk)
begin
if clk&apos;event and clk=&apos;1&apos; then
if s1="0101" and s0="1001" then---當秒高位為5,低位為9
q<=&apos;1&apos;;-----高頻輸出為1
else
q<=&apos;0&apos;;
end if;
end if;
end process;
end sss_arc;

流程圖

整個數字秒表的設計流程圖如下:

圖片圖片
實驗結果和心得

總結

秒表的頂層設計經保存,編譯,管腳分配後,下載到FPGA晶片(EP1K100QC208—3)後,可以得到較為滿意的結果,感覺很欣慰。通過這次設計,對CPLD和FPGA有了進一步認識,希望在以後的學習和工作上有所套用。

相關詞條

熱門詞條

聯絡我們