基于FPGA的语音数字时钟系统Word格式文档下载.docx
《基于FPGA的语音数字时钟系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA的语音数字时钟系统Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
![基于FPGA的语音数字时钟系统Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-1/27/77b5990d-f961-4e73-9edd-b473a403d7b3/77b5990d-f961-4e73-9edd-b473a403d7b31.gif)
控制输入
下一状态
控制输出
S0
Key=’1’
S1
Show_new_time<
=’1’
Alarm_botton=’1’
S2
Show_a<
else
Null
Load_new_a<
Time_botton=’1’
S3
Load_new_c<
超时
是
否
S4
Show_a
Show_a并等待
程序:
程序包P_alarm封装定义
libraryIEEE;
useP_alarmis
subtypet_digitalisintegerrange0to7;
subtypet_shortisintegerrange0to65535;
typet_clock_timeisarray(3downto0)ofT_digital;
typet_displayisarray(3downto0)ofStd_logic_vector(6downto0);
typeseg7isarray(0to7)ofStd_logic_vector(6downto0);
constantSeven_seg:
seg7:
=("
0000000001"
--0
"
0000000010"
--1
0000000100"
--2
0000001000"
--3
0000010000"
--4
0000100000"
--5
0001000000"
--6
00"
--7
--8
--9);
endpackageP_alarm;
--程序包体封装结束
useAlarm_contorlleris
port(Key,Alarm_botton,Time_botton,clk,reset:
instd_logic;
Load_new_a,Load_new_c,Show_new_time,Show_a:
outstd_logic);
endAlarm_controller;
ARCHITECTUREartofAlarm_controlleris
typet_stateis(s0,s1,s2,s3,s4);
--5种工作状态
constantkey_timeout:
t_short:
=900;
--键盘延时时间
constantshow_alarm_timeout:
--alarmjianyanshi900ns
signalcurr_state:
t_state;
--zhuangtaijidangqianzhuangtaiwei
signalnext_state:
--zhuangtaijixiayigongzuowei
signalcounter_k:
--jianpan
signalenable_count_k:
std_logic;
--jianpanchaoshiyunxu
signalcount_k_end:
--jianpanchaoshi
signalcounter_a:
t_short;
--alarmjian
signalenable_count_a:
--alarmjianchaoshiyunxu
signalcount_a_end:
--alarmjianchaoshijieshu
begin
p0:
process(clk,reset)
ifreset='
1'
then
curr_state<
=s0;
elsifrising_edge(clk)then
=next_state;
endif;
endprocess;
p1:
process(Key,Alarm_botton,Time_botton,curr_state,count_a_end,count_k_end)
begin--geigegeshuchufuchushizhi
next_state<
=curr_state;
load_new_a<
='
0'
;
load_new_c<
show_a<
show_new_time<
enable_count_k<
enable_count_a<
casecurr_stateis
whens0=>
if(Key='
)then
=s1;
Show_new_time<
elsif(Alarm_botton<
=s2;
Show_a<
else
null;
whens1=>
if(key='
Load_new_a<
elsif(Time_botton<
=s3;
Load_new_c<
if(count_k_end='
whens2=>
if(Alarm_botton<
else
whens3=>
if(Time_botton<
whens4=>
=s4;
if(count_a_end='
whenothers=>
endcase;
Count_key:
process(Enable_count_k,clk)
if(Enable_count_k<
Counter_k<
count_k_end<
elsif(rising_edge(clk))then
if(counter_k>
=key_tinmeout)then
count_k_end='
counter_k<
=Counter_k+1;
endprocessCount_key;
Count_alarm:
process(Enable_count_a,clk)
if(enable_count_a<
counter_a<
count_a_end<
elsif(rising_edge(clk))then
if(counter_a>
=show_alarm_timeout)then
=counter_a+1;
endprocessCount_alarm;
endart;
二.闹钟系统译码器设计
1.设计思路:
每次按下闹钟系统的数字键盘后产生一个数字所对应的10位二进制数据信号转换为1位十进制整数信号,作为小时,分钟计数的4个数字之一。
结构图
Decoder
输入
0000000001
0000000010
0000000100
0000001000
0000010000
输出
1
2
3
4
0000100000
0001000000
00
5
6
7
8
9
usedecoderis
port(keypad:
instd_logic_vector(9downto0);
value:
outT_digital);
enddecoder;
ARCHITECTUREartofdecoderis
withkeypadselect
value<
=0when"
1when"
2when"
3when"
4when"
5when"
6when"
7when"
8when"
9when"
0whenothers;
endart;
三.闹钟系统的移位寄存器的设计
在clk的上升沿同步下,将key端口的输入信号移入new_time端口的输出端口最低位,原有信息一次向左移动,最高位舍去,reset对输出端口new_time异步清零。
电路原理图
usekey_bufferis
port(key:
int_digital;
clk,reset:
new_time:
outt_clock_time);
endkey_buffer;
ARCHITECTUREartofkey_bufferis
signaln_t:
t_clock_time;
process(clk,reset)
if(reset<
n_t<
=(0,0,0,0);
elsif(rising_edge(clk))then
foriin3downto1loop--zuohuanyi
n_t(i)<
=n_t(i-1);
endloop;
n_t(0)<
=key;
new_time<
=n_t;
四.闹钟寄存器的设计
闹钟寄存器在时钟上升沿同步下,根据Load_new_a端口的输入信号控制Alarm_time口的输出,当控制信号为高电平时,把New_alarm_time端口的赋给alarm_time然后输出,reset端口输入信号对alarm_time端口的输出进行异步清零复位。
电路原理图
useAlarm_regis
port(clk,reset:
new_alarm_time:
int_clock_time;
load_new_a:
alarm_time:
endAlarm_reg;
ARCHITECTUREartofAlarm_regis
if(reset='
alarm_clock<
ifrising_edge(clk)then
ifload_new_a='
then
alarm_time<
=new_alarm_time;
elsifload_new_a='
assertfalsereport"
uncertainload_new_alarmcontrol"
severitywarning
五.时间计数器的设计
时间计数器在时钟上升沿同步下,根据load_new_c端口的输入控制信号控制current_time口的输出,当控制信号为高电平时,把new_current_time端口的值赋给current_time进行输出。
当reset端口为高电平时,对current_time端口进行清零操作。
Reset的优先级高于load_new_c,且当reset,load_new_c同时为低电平时,在时钟上升沿处,对current_time端口输出信号进行累加一次加1,并根据小时,分钟的进位规律进位。
Alarm_counter
useAlarm_counteris
port(load_new_c:
new_current_time:
current_time:
endAlarm_counter;
ARCHITECTUREartofAlarm_counteris
signali_current_time:
variablec_t:
i_current_time<
elsifload_new_c<
=new_current_time;
ifc_t(0)<
=9then
c_t(0):
=c_t(0)+1;
=0;
ifc_t
(1)<
6then
c_t
(1):
=c_t
(1)+1;
ifc_t(3)<
2then
ifc_t
(2)<
c_t
(2):
=c_t
(2)+1;
c_t(3):
=c_t(3)+1;
elsec_t
(2)<
3then
=c_t;
current_time<
=i_current_time;
六.闹钟系统显示驱动器
1.设计思路:
当show_new_time输入为高电平时,根据new_time端口输入的时间数据,产生相应的4个七段数码显示器的驱动数据,并在display端口输出该信号;
当show_new_time为低电平时,判断show_a端口的输入电平,如果为高电平,则根据alarm_time端口输入的时间数据,产生相应的4个七段数码显示器的驱动数据,并也在display端口输出。
若show_a也为低电平,根据current_time端口的输入信号,对display端口驱动。
当alarm_time端口的输入信号值与current_time端口的输入信号值相同时,sound_alarm端口的输出信号有效。
反之无效
Display_driver
usedisplay_driveris
port(new_time:
show_new_time:
show_a:
display:
outt_display;
sound_alarm:
enddisplay_driver;
ARCHITECTUREartofdisplay_driveris
signaldisplay_time:
process(new_time,alarm_time,current_time,show_new_time,show_a)
sound_loop:
foriinalarm_time'
rangeloop
if(current_time(i)=alarm_time(i))then
sound_alarm<
endloopsound_loop;
ifshow_new_time<
display_time<
=new_time;
elsifshow_a<
=alarm_time;
=current_time;
assertfalsereport"
uncertaindisplay_drivercontrol!
"
severitywaring;
disp:
process(display_time)
foriindisplay_time'
display(i)<
=seven_seg(display_time(i))
七.闹钟分频器
分频器,将clk_in的输入信号经过分频后交与clk_out当reset端口为高电平时,clk_out输出清零。
Fq_divider
usefq_divideris
port(clk_in,reset:
clk_out:
endfq_divider;
ARCHITECTUREartoffq_divideris
constantdivide_period:
=6000;
process(clk_in,reset)
variablecnt:
cnt:
clk_out<
if(cnt<
(divide_period/2))then
=cnt+1;
elsif(cnt<
(divide_period-1))then
八.闹钟的整体组装
前面已经把闹钟的各个模块分别进行了编译封装,现在开始整体组装。
由于键盘解码和闹钟移位寄存器是一体的,且输出新的时间或者闹钟值,所以二者连为一体,再者,由于闹钟移位寄存器输出的新数据可能是时间值也可能是闹钟值,所以输出口一分为2,分别接入时间计数器,闹钟寄存器,又由于闹钟移位寄存器所输出的值要显示在led上,所