最新数字钟实验报告x:1302六位数字钟实验报告
'k'k'k'k
'k'k'k'k
'k'k'k'k
'k'k'k'k
EDA数字钟设计
项目名称: 适用年级: 所属课程: 姓名 : 学号 : 班级 : 指导老师:VHDL
项目名称: 适用年级: 所属课程: 姓名 : 学号 : 班级 : 指导老师:
2
《可编程数字系统》
***********
***********
***
《可编程数字系统》课程设计题目
、课程设计目的:熟悉EDA工具;掌握用 VHDL语言进行数字系统设计的基本方 法和流程。
、设计任务:任选以下两道题目中的一道,用 VHDL语言描述,用 Quartusll工具编
译和综合,仿真,并在实验板上实现,同时提交实验报告。
设计一数字钟,用数码管显示
基本功能要求:
(1) 可以分屏显示时、分、秒,可用数码管的小数点“ ?”代替时、分、秒的
分隔符“:”,分屏显示是指由于数码管只有 4个,不能同时显示时、分、
秒,但可以只显示时、分,或只显示分、秒,通过按键来切换这两种显示 方式。
(2) 可设置时钟的开始时间。设置时,相应的数码管要闪烁,指示当前设置的 位置(内容)。
(3) 具有闹铃功能,可以设定闹铃时间。闹铃时间到, LED闪烁进行指示
三、设计与实验报告要求
1、 项目必须在一周内独立完成,发现抄袭者,一律不及格;
2、 以上题目的要求为必须完成的基本功能,在此基本功能的基础上,鼓励学生 增加更多功能(可加分);
3、 提交的实验报告必须包含但不限于以下基本内容:设计原理、系统分析、程 序设计、仿真结果、实验结果(可附上实验板运行时的照片)、结论或分析
4、 验收方式:实物验收,需演示,并答辩。
5、 评分标准:以完成上述的基本功能为基准, 第一道题目的基准分为 75,第二 道题目的基准分为85分,根据完成设计的具体情况以及设计报告的质量, 综合得分上下浮动。
6、 实验套件要妥善使用和保管,如有损坏或丢失,按情节轻重处理。
一、 设计原理
EP2C5T144C有50MHZ勺时钟频率输出,通过分频计数器,接入数字钟。数 字钟由计数器、译码器、显示器等部分构成,数字钟的时、分、秒实际上就是由 一个24进制计数器(00-23),两个60进制计数器(00-59 )级联构成。显示模 块用200HZ的频率,显示效果很好。利用 Quartus II 9.0 软件编写VHDL语言,
编写六十进制、二十四进制;译码、显示部分用一个四进制,二 -四译码器,数
据选择器及七段译码器构成。最后生成相对应的模块连接成数字钟电路图。
数字钟的功能实际上是对秒信号计数。 EDA-V硬件开发系统可提供不同的时钟信号,分频
后可产生秒时钟。数字钟在结构上可分为两个部分: 计数器和显示器。计数器又可分为秒计
数器、分计数器和小时计数器;秒计数器和分计数器由两个六十进制构成, 小时计数器由二
十四进制计数器实现。
动态显示电路可用三态门构成的四选一数据选择器, 和一个四进制加一个二四译码器, 还有
一个七段译码器 7448组成。三态门在选择了一个数码管的同时,打开一个三态门,其他的 关闭。进而实现数据选择。如图 1所示的用三态门实现动态显示的框图。
标准参考时钟
4进制
一24译
?
计数器i
*
码器
在Quartusll软件中实现四个数码管的动态显示原理
二、程序设计
计数部分
VHDL语言设计的秒和分,带整点报时和分的设置
--Second1(秒计数6进制和10进制)
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_ un sig ned.all;
En tity sec ond1 is
Port( clks,clr:in std_logic;
Secs,Secg: out std_logic_vector(3 dow nto 0); cout1:out std_logic);
End sec on d1;
Architecture a of sec ond1 is
Begin
Process(clks,clr)
variable ss,sg: std_logic_vector(3 dow nto 0);
variable co: std_logic;
Begin
If clr='0' then ss:="0000"; sg:="0000";
Elsif clks'eve nt and clks='1' the n
if ss="0101" and sg="1001" then ss:="0000"; sg:="0000";co:='1';
elsif sg<"1001" then sg:=sg+1;co:='0';
elsif sg="1001" then sg:="0000";ss:=ss+1;co:='0';
end if;
end if;
cout1<=co;
Secs<=ss;
Secg<=sg;
end process;
End a;
--Min1 (分计数器 6进制和10进制alm实现整点报时)
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_ un sig ned.all;
En tity mi n1 is
Port(clkm,clr:in std_logic;
min s,mi ng:buffer std_logic_vector(3 dow nto 0);
enmin ,alarm: out std」o gic);
End;
Architecture a of mi n1 is
Begi n
Process(clkm,clr)
variable ms,mg :std_logic_vector(3 dow nto 0);
variable so,alm :std_logic;
Begin
If clr='0' then ms:="0000"; mg:="0000";
Elsif clkm'eve nt and clkm='1' the n
if ms="0101" and mg="1001" then ms:="0000";mg:="0000"; so :='1'; alm:='1';
elsif mg<"1001" then mg:=mg+1; so :='0';alm:='0';
elsif mg="1001" then mg:="0000";ms:=ms+1; so :='0';alm:='0';
end if;
end if;
alarm<=alm;
enmin<= so;
min s<=ms;
min g<=mg;
End process;
End a;
VHDL语言设计的二十四进制电路
--Hourl (时计数器 4进制与2进制)
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_ un sig ned.all;
En tity hour1 is
Port(clkh,clr:in std_logic;
hours,hourg:out std_logic_vector(3 dow nto 0));
End;
Architecture a of hour1 is
Begi n
Process(clkh,clr)
variable hs,hg :std_logic_vector(3 dow nto 0);
Begi n
If clr='0' the n hs:="0000"; hg:="0000";
Elsif clkh'event and clkh='1' then
if hs="0010"and hg="0011" then hs:="0000";hg:="0000";
elsif hg<"1001" then hg:=hg+1;
elsif hg="1001" then hg:="0000";hs:=hs+1; end if;
end if;
hours<=hs;
hourg<=hg;
End process;
End;
模块动态显示部分
(1)VHDL语言设计的四进制电路,模块
library ieee;
use ieee.std _lo gic_1164.all;
use ieee.std_logic_ un sig ned.all;
en tity time4_old is
port(
clk :in std_logic;
q :buffer std_logic_vector (1 dow nto 0)
);
end time4_old;
architecture xx of time4_old is
begin
process ( clk )
begin
if (clk'eve nt and clk = '1') the n
if q<"11" then
q<=q+1;
else
q<="00";
end if;
else
q<=q;
end if;
end process;
end xx;
(2) VHDL语言设计的2线-4线译码器
en tity case24 is
port(
sel: in bit_vector (1 dow nto 0);
y: out bit_vector (3 dow nto 0)
);
end case24;
architecture xx of case24 is
begin
process(sel)
begin
case sel is
when "00" =>y<="1110";
when "01" =>y<="1101";
when "10" =>y<="1011"; when others =>y<="0111";
end case;
end process;
end xx;
VHDL语言设计的数据选择器模块
en tity mux4v is
port(
a,b,c,d:i n bit_vector(3 dow nto 0); sel:i n bit_vector(1 dow nto 0); result:out bit_vector(3 dow nto 0) );
end mux4v;
architecture aa of mux4v is
begin
with sel select
result <= a whe n "11",
b whe n "10",
c whe n "01",
d whe n others;
end aa;
VHDL语言七段译码器设计模块
en tity m7448 is
port(
result:i n bit_vector (3 dow nto 0);
seg :out bit_vector(6 dow nto 0)
);
end m7448;
architecture xx of m7448 is
begin
process(result)
begin
case result is
whe n "0000"=>seg<="0000001";
when "0001"=>seg<="1001111";
when "0010"=>seg<="0010010";
when "0011"=>seg<="0000110";
when "0100"=>seg<="1001100";
when "0101"=>seg<="0100100";
when "0110"=>seg<="0100000";
when "0111"=>seg<="0001111";
whe n "1000"=>seg<="0000000";
when others=>seg<="0000100";
end case;
end process;
end xx;
6选4数据选择器和切换显示按键模块
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_ un sig ned.all;
en tity try_n ew_64 is
port(
secs,secg, mins,min g,hours,hourg:i n bit_vector(3 dow nto 0); key_sel:i n bit;
Ioc1,loc2,loc3,loc4:out bit_vector(3 dow nto 0)
);
end try_n ew_64;
Architecture a of try_n ew_64 is
sig nal key_sel_c on:i nteger range 0 to 1;
Begi n
key_sel_c on _proc:process(key_sel) begin
if key_sel'eve nt and key_sel='0' the n if key_sel_c on =1 the n
key_sel_c on<=0;
else
key_sel_c on<=key_sel_c on+1; end if;
end if;
end process;
Process(key_sel_c on)
Begin
case key_sel_c on is whe n 0=> loc1<=mins;
Ioc2<=ming;
Ioc3<=secs; loc4<=secg;
when 1=>
Ioc1<=hours;
Ioc2<=hourg;
loc3<=mins;
Ioc4<=ming;
end case;
end process;
end a;
因为板上资源有限,用 4个数码管显示时钟,下面是切换显示的程序
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_ un sig ned.all;
en tity try_n ew_64 is
port(
secs,secg, mins,min g,hours,hourg:i n bit_vector(3 dow nto 0); key_sel:i n bit;
Ioc1,loc2,loc3,loc4:out bit_vector(3 dow nto 0)
);
end try_n ew_64;
Architecture a of try_n ew_64 is
sig nal key_sel_c on:i nteger range 0 to 1;
Begi n
key_sel_c on _proc:process(key_sel) begin
if key_sel'eve nt and key_sel='0' the n if key_sel_c on =1 the n
key_sel_c on<=0;
else
key_sel_c on<=key_sel_c on+1; end if;
end if;
end process;
Process(key_sel_c on)
Begin
case key_sel_c on is whe n 0=> loc1<=mins;
Ioc2<=ming;
Ioc3<=secs; loc4<=secg;
when 1=>
Ioc1<=hours;
Ioc2<=hourg;
loc3<=mins;
Ioc4<=ming;
end case;
end process;
end a;
o
输出1011即可。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_ un sig ned.all;
en tity givesig is
port(
sel: in bit_vector (1 dow nto 0); y: out bit
);
end givesig;
architecture xx of givesig is begin process(sel) begin if (sel="10") the n y<='0: else y<='1';
end if; end process;
end xx;
打包了时钟的程序如下
--Topclock (元件例化顶层文件)
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_ un sig ned.all;
En tity topclock is
Port(clk,clr,en,m1,h1:in std_logic;
alarm:out std_logic;
secs,secg ,mins,min g,hours,hourg:buffer std_logic_vector(3 dow nto 0));
End;
Architecture one of topclock is
Comp onent sec ond1
Port( clks,clr:in std_logic;
secs,secg: buffer std_logic_vector(3 dow nto 0); cout1: out std_logic);
End Comp onent;
Comp onent min1
Port(clkm,clr:in std_logic;
min s,mi ng:buffer std_logic_vector(3 dow nto 0); enmin ,alarm: out std」o gic);
End Comp onent;
Comp onent hour1
Port(clkh,clr:in std_logic;
hours,hourg:buffer std_logic_vector(3 dow nto 0));
End Comp onent;
Comp onent madapt
Port(e n,m1,clk,seci n:in std_logic;
min set:out std_logic);
End Comp onent;
Comp onent hadapt
Port(e n,h1,clk,mi nin:in std_logic;
hourset:out std_logic);
End Comp onent;
sig nal a,b,c,d: std_logic;
begin
u1:sec ond1 port map(clr=>clr,
secs=>secs,secg=>secg,clks=>clk, cout1=>a);
u2: min1 port map(clr=>clr,alarm=>alarm,
min s=>mi ns,mi ng=>mi ng,clkm=>b,e nmi n=>c);
u3:hour1 port map(clr=>clr, hours=>hours,hourg=>hourg,clkh=>d);
u4:madapt port map(e n=>en, m1=>m1,clk=>clk,seci n=>a, min set=>b); u5:hadapt port map(e n=>en, h1=>h1,clk=>clk, minin=>c,hourset=>d); en d;
数码管显示模块 只要把通常用的模块 0改1 1改0就可用了。如下 en tity m7448 is port(
result:i n bit_vector (3 dow nto 0);
seg :out bit_vector(6 dow nto 0) );
end m7448;
architecture xx of m7448 is
begin
process(result)
begin
case result is
whe n "0000"=>seg<="0000001";
when "0001"=>seg<="1001111"; when "0010"=>seg<="0010010";
when "0011"=>seg<="0000110";
when "0100"=>seg<="1001100";
when "0101"=>seg<="0100100";
when "0110"=>seg<="0100000";
when "0111"=>seg<="0001111";
whe n "1000"=>seg<="0000000";
when others=>seg<="0000100";
end case;
end process;
end xx;
4选1选择器
en tity mux4v is
port(
a,b,c,d:i n bit_vector(3 dow nto 0); sel:i n bit_vector(1 dow nto 0); result:out bit_vector(3 dow nto 0) );
end mux4v;
architecture aa of mux4v is
begin
with sel select
result <= a whe n "11",
b whe n "10",
c whe n "01", d whe n others;
end aa;
分频器由Quartus自己的 程序库提出
Ipm counterl j
up 訂口 Li「t看'
》cteckr :1-- - s ■ - - a -,.-
q[25..O]
ccut
:
:
7
r
l iru
=f:
T
位选模块CASE24
en tity case24 is
port(
sel: in bit_vector (1 dow nto 0); y: out bit_vector (3 dow nto 0) );
end case24;
architecture xx of case24 is begin
process(sel)
begin
case sel is
when "00" =>y<="1110";
when "01" =>y<="1101";
when "10" =>y<="1011"; when others =>y<="0111";
end case;
end process;
end xx;
上面就是我的完整程序。
三、仿真结果
VHDL语言设计的六十进制电路,模块及其波形
VHDL语言设计的二十四进制电路,模块及其波形
'k'k'k'k
'k'k'k'k
'k'k'k
'k'k'k
'k'k'k'k
'k'k'k'k
'k'k'k'k
'k'k'k'k
L
I1Z
clear
*
elk
S 92
田Q3
亡O
immrumnArLrLrLrLnrLrLrLrLrLrLrLrLn
0 X X 2 r u \ \ X 2 '£
四、总电路图
Em gmjiuwi
UC CC^"!!1
、_b !
qPB.fl
—1
*■!>]
I
■r~:■ ■*;: ?
CZD
.TF=^-1 J
—1 , >1-
丨》 , L’u r 、 ,i
Ipm mniarfl
2 n
l^rr
■■■■.- ?“
rrrip DTj
fc
*■
■ MJ ■- - .1 -,
sl-切 車叮M
rTdrap m &M"
iwip og
—
Sts.- m
rtffl!
rtffl!
五、运行情况
按键说明:
S6:切换显示
S3小时设置
S1分钟设置
S5清零按钮
S2屏蔽设置分、时设置(按住为屏蔽)
时分显示
分秒显示
Key72切换显示
显示效果良好,没有出现错误 六、结论分析
1时钟显示正常;
2设置时、分功能正常、
3清零键正常
因为时间和个人能力, 没能做出闪烁。用了失能和双频率赋值的方法做了 4个程序,都不能
正常使用,故放弃了闪烁。
闹钟程序虽然比较简单但是因为时间问题,也夭折了。
七、收获感想
八、参考资料
《VHDL使用教程》潘松王国栋编著
清华大学出版社《EDA技术与VHDL程序开发基础教程》
清华大学出版社
相关热词搜索: 实验报告 实验 报告 最新 最新数字钟实验报告x