📄 vhdl.txt
字号:
7.4 实用多功能电子表
7.4.1 功能描述
多功能电子表共有5种功能:功能1为数字钟;功
能2为数字跑表;功能3为调时;功能4为闹钟设置;功
能5为日期设置。除调时功能以外,电子表处于其他功
能状态下时并不影响数字钟的运行。使用数字钟功能
时,还可以通过按键快速查看当前的闹钟设置时间和
当前日期。该电子表利用EDA实验平台的扬声器整点
报时和定时报时,设置3个按键分别作为功能键和调整
键。实用多功能电子表外部接口如图7-14所示。
第7章数字系统设计实例
图7-14 实用多功能电子表外部接口
CLK_1Hz MODE[3..0]
CLK_1kHz
FUNC_KEY
KEY1
KEY2
HOUR[7..0]
MINUTE[7..0]
SECOND[7..0]
ALARM
第7章数字系统设计实例
1.输入
(1) func_key:功能键,控制电子表的功能号。
(2) key1:调整key1,功能1时按下可显示闹钟设置
时间;功能2时用作跑表暂停键;功能3、4时分别用于
调数字钟和闹钟的小时数;功能5时用于调日期的月
份。
(3) key2:调整key2,功能1时按下可显示当前日
期;功能2时用作跑表清零键;功能3、4时分别用于调
数字钟和闹钟的分钟数;功能5时用于调日期的日期
数。
第7章数字系统设计实例
(4) clk_1 Hz:数字钟时钟(1 Hz)输入。
(5) clk_1 kHz:1 kHz时钟,是整点报时和定点报
时所需的频率。另外,10分频后还可得到100 Hz频率
信号作为数字跑表时钟输入。
第7章数字系统设计实例
2.输出
(1) mode:显示电子表的功能号1~5。
(2) hour:功能1、3和4时显示小时数;功能2时显示
跑表的分钟数;功能5时显示月份。
(3) minute:功能1、3和4时显示分钟数;功能2时
显示跑表的秒数;功能5时显示日期数。
(4) second:功能1时显示秒数;功能2时显示1%
秒;功能3、4和5时均显示0。
(5) alarm:连至扬声器,用于整点报时及闹钟报
时。
第7章数字系统设计实例
7.4.2 电路组成
在明确电子表的功能后,可对电子表进行模块划
分得到电子表设计的结构框图,如图7-15所示。
第7章数字系统设计实例
图7-15 实用多功能电子表结构框图
数字钟
与调时
clk_
跑表模块
clk_
闹钟设置
模块clk_key2
日期设置
模块
clk_key3
clk_key4
clk_key1
显
示
模
块
数码管功能号指示
分频模块
按键切换
乒乓开关琴键开关
1 kHz
100 Hz
500 Hz
报时模块扬声器
第7章数字系统设计实例
从结构框图中可以看出,模块划分与功能划分存
在不同之处。下面分别对几个模块加以说明。
1.数字钟与调时模块
由于调时功能改变的就是数字钟的时和分,因此
应将这两个功能合在同一模块中。这是因为在VHDL
和Verilog HDL中都不允许两个进程对同一信号进行赋
值(即多重驱动)。此模块的输入有下面3个。
第7章数字系统设计实例
(1) clk_1:时钟输入。当处在数字钟功能时,
clk_1应为1 Hz的时钟信号;当处在调时功能时,clk_1
应为按key1和key2调整键产生的adjust_key1和
adjust_key2脉冲信号。因此可描述clk_1为clk_1=(clk_1
Hz&&mode!=3)||(mode==3&&(adjust_key1||adjust_key2)
);即当不处于功能3时为1 Hz时钟信号,处于功能3时为
adjust_key1或adjust_key2脉冲信号。这样,当将电子表
调整到数字钟功能外的其他功能时将不会影响数字钟
的运行。
第7章数字系统设计实例
(2) adjust_key1和adjust_key2:在EDA实验平台上
实现时,key1(KEY2)和key2(KEY3)两个调整键是乒乓
开关,即每按动一次,相应引脚上的电平就翻转一
次。这里需将其变为琴键开关,即每按动一次将产生
一个上跳脉冲,从而启动进程的运行。有关乒乓开关
和琴键开关的说明请参见附录。
此模块的输出为6位时、7位分和7位秒,采用BCD
码表示。
第7章数字系统设计实例
2.跑表模块
跑表的设计与数字钟的设计基本相同,不同的是
其输入时钟应为100 Hz的信号,同时还应增加暂停键
(key1)和清零键(key2)。因此其时钟clk_2应描述为
clk_2=clk_100 Hz&&mode==2&&!key1;
即当电子表处于功能2时启动跑表模块运行,时钟
为100 Hz,key1(乒乓开关)则作为时钟使能信号,也即
作为跑表的暂停键。
跑表模块的输出为7位分、7位秒和8位1%秒,采用
BCD码显示。
第7章数字系统设计实例
3.闹钟设置模块
闹钟设置模块的输入为两个调整键clk_key1和
clk_key2,分别描述为
clk_key1=adjust_key1 && mode==4;
clk_key2=adjust_key2 && mode==4;
表示在闹钟功能时key1和key2分别作为调时键和调
分键。闹钟的输出为6位时和7位分,采用BCD码显
示。
第7章数字系统设计实例
4.日期设置模块
日期设置模块输入为两个调整键clk_key3和
clk_key4,分别描述为
clk_key3=adjust_key1 && mode==5;
clk_key4=adjust_key2 && mode==5;
表示日期设置功能时key2和key3分别作为调月键和
调日键。日期设置的输出为5位月(共12月)和6位日(共
30日),采用BCD码显示。
第7章数字系统设计实例
5.显示模块
由于EDA实验平台上已为数码管显示制作了译码
和驱动电路,因此在其上设计数码管显示电路时将无
须编写译码电路。
本设计显示模块的作用是根据不同的功能号,将相
应功能的输出连至数码管上并输出。
第7章数字系统设计实例
时、分和秒的显示分别用8位表示,实际上,时、
分和秒的最大值分别为23、59和59,对应的BCD码表
示分别为6、7和7位。选用8位表示是因为实验平台上
悬空的引脚均为高电平,如果不将高位悬空引脚通过
程序置为低电平,将导致显示错误。
第7章数字系统设计实例
6.报时模块
报时模块控制在整点或闹钟时间到时将1 kHz或500
Hz的方波信号送至实验平台上的扬声器发声。
7.分频模块
分频模块将1 kHz的方波信号分频至500 Hz(整点报
时用)和100 Hz(跑表时钟)。
8.功能号指示
通过按功能键选择不同的功能号(1~5),将功能号
送往其他模块使用并通过数码管显示出来。
第7章数字系统设计实例
9.按键切换
在EDA实验平台上,func_key(KEY1)、key1(KEY2)
和key2(KEY3)均为乒乓开关,需将其转换为琴键开关
func_key、adjust_key1和adjust_key2,这样在用
KEY1、KEY2和KEY3键调整功能号或调时、调分时,
每按一次便会产生一个上升沿脉冲,启动相应进程的
运行。
第7章数字系统设计实例
7.4.3 Verilog-HDL程序
module clock(clk_1 Hz, clk_1 kHz, func_key, key1, key2,
mode, hour, minute, second, alarm);
input clk_1 Hz ; //1Hz时钟,供数字钟使用
input clk_1 kHz ;
//1 kHz时钟, 分成500 Hz供闹钟和整点报时使用, 分频100
Hz供跑表使用
input func_key ;
//功能键, 1表示数字钟, 2表示跑表, 3表示调时, 4表示设置
闹钟,5表示日
//期设置
第7章数字系统设计实例
input key1 ; //功能1时显示闹钟时间, 功能2时暂停, 功能
3、4时调小时, 功能5时调
//月份
input key2 ; //功能1时显示日期, 功能2时清零, 功能3、4
时调分, 功能5时调日
output [3:0] mode; //功能号指示
output [7:0] hour ; //功能1、3和4时显示小时, 功能2时
显示分钟, 功能5时显示月份
output [7:0] minute; //功能1、3和4时显示分钟, 功能2时
显示秒, 功能5时显示日期
第7章数字系统设计实例
output [7:0] second; //功能1时显示秒, 功能2时显示1/100
秒, 其余时固定显示0
output alarm ; //连至扬声器, 整点报时及闹钟
reg[3:0] mode; //功能号指示(1~5)
reg[7:0] hour,minute,second;
reg[2:0] divide; //1 kHz信号10分频得100 Hz, 先5分
频,再2分频
reg clk_100 Hz; //100 Hz供跑表用
reg clk_500 Hz; //500 Hz供准点报时时用
第7章数字系统设计实例
reg temp1,temp2,temp3;
wire funckey,adjust_key1,adjust_key2;
always@(posedge clk_1 kHz)
begin
clk_500 Hz=~clk_500 Hz;
//由1 kHz分频得500 Hz时钟信号,整点报时使用
temp1=func_key;
temp2=key1;
temp3=key2;
第7章数字系统设计实例
if(divide==3'b101)
//由1 kHz分频得到100 Hz信号,用作跑表的时钟
begin
divide=0;clk_100 Hz=~clk_100 Hz;
end
else divide=divide+1;
end
第7章数字系统设计实例
assign funckey=func_key^temp1;
//将func_key(乒乓开关)转换为琴键开关
assign adjust_key1=key1^temp2; //将key1(乒乓开关)转换为琴键开关
assign adjust_key2=key2^temp3; //将key2(乒乓开关)转换为琴键开关
always@(posedge funckey)
begin
if(mode[2]&mode[0]) mode[2]=0; //功能号在1~5之间变化
else mode=mode+1;
end
第7章数字系统设计实例
//功能1与功能3:数字钟及时间设置, 功能3以外其他功能将
不影响数字钟的运行
reg[5:0] h1; //功能1(数字钟)的时、分、秒
reg[6:0] m1,s1;
wire clk_1;
//数字钟时为1 Hz时钟, 时间设置时为按调整键产生的脉冲
assignclk_1=(clk_1
Hz&&mode!=3)||(mode==3&&(adjust_key1||adjust_key2));
always@(posedge clk_1)
第7章数字系统设计实例
begin
if(mode!=3) //数字钟
begin //23:59:59'时变为00:00:00
if(h1[5]&h1[1]&h1[0]&m1[6]&m1[4]&m1[3]&m1[0]&s1[6]
&s1[4]&s1[3]&s1[0])
{h1,m1,s1}=0;
else
if(h1[3]&h1[0]&m1[6]&m1[4]&m1[3]&m1[0]&s1[6]&s1[
4]&s1[3]&s1[0])
第7章数字系统设计实例
begin //*9:59:59'时小时加7,分、秒变为0
h1=h1+7;m1=0;s1=0;
end
else
if(m1[6]&m1[4]&m1[3]&m1[0]&s1[6]&s1[4]&s1[3]&s1[0])
begin //59:59' 时分、秒为0,小时加1
h1=h1+1;m1=0;s1=0;
end
第7章数字系统设计实例
else if(m1[3]&m1[0]&s1[6]&s1[4]&s1[3]&s1[0])
begin //*9:59'时秒为0,分加7
m1=m1+7; s1=0;
end
else if(s1[6]&s1[4]&s1[3]&s1[0])
begin //59秒时秒为0,分加1
m1=m1+1;s1=0;
end
第7章数字系统设计实例
else if(s1[3]&s1[0]) s1=s1+7;//*9秒时秒加7
else s1=s1+1; //秒加1
end
else if(adjust_key1)//调时
begin
if(h1[5]&h1[1]&h1[0]) h1=0;
else if(h1[3]&h1[0]) h1=h1+7;
else h1=h1+1;
end
第7章数字系统设计实例
else if(m1[6]&m1[4]&m1[3]&m1[0]) m1=0;//调分
else if(m1[3]&m1[0]) m1=m1+7;
else m1=m1+1;
end
//功能2:跑表,key1作为暂停键,key2作为清零键
reg[6:0] h2,m2;
//功能2(数字跑表)时的时、分、秒
reg[7:0] s2;
wire clk_2;
第7章数字系统设计实例
assign clk_2=clk_100 Hz&&mode==2&&!key1;
//跑表的100 Hz时钟,key1此时为暂停键
always@(posedge clk_2)
begin
if(key2||(h2[6]&h2[4]&h2[3]&h2[0]&m2[6]&m2[4]&m2[3]
&m2[0]&s2[7]&s2[4]&s2[3]&s2[0]))
{h2,m2,s2}=0;
//跑表时key2清零,59:59'99"时清零
第7章数字系统设计实例
else
if(h2[3]&h2[0]&m2[6]&m2[4]&m2[3]&m2[0]&s2[7]&s2[4]
&s2[3]&s2[0])
begin
h2=h2+7;m2=0;s2=0;
end
else
if(m2[6]&m2[4]&m2[3]&m2[0]&s2[7]&s2[4]&s2[3]&s2[0])
begin
h2=h2+1;m2=0;s2=0;
end
第7章数字系统设计实例
else if(m2[3]&m2[0]&s2[7]&s2[4]&s2[3]&s2[0])
begin
m2=m2+7; s2=0;
end
else if(s2[7]&s2[4]&s2[3]&s2[0])
begin
m2=m2+1;s2=0;
end
else if(s2[3]&s2[0]) s2=s2+7;
else s2=s2+1;
end
第7章数字系统设计实例
//功能4:闹钟设置,key1和key2分别用来调时和调分
reg[5:0] h4; //功能4(闹钟设置)时的时和分
reg[6:0] m4;
wire clk_key1,clk_key2;
assign clk_key1=adjust_key1 && mode==4;
//功能4时key1作为调时键
assign clk_key2=adjust_key2 && mode==4;
//功能4时key2作为调分键
第7章数字系统设计实例
always@(posedge clk_key1) //最大24小时
begin
if(h4[5]&h4[1]&h4[0]) h4=0;
else if(h4[3]&h4[0]) h4=h4+7;
else h4=h4+1;
end
always@(posedge clk_key2) //最大60分
第7章数字系统设计实例
begin
if(m4[6]&m4[4]&m4[3]&m4[0]) m4=0;
else if(m4[3]&m4[0]) m4=m4+7;
else m4=m4+1;
end
第7章数字系统设计实例
//功能5:调日期,key1和key2分别调月和调日
reg[4:0] month;
reg[5:0] day;
wire clk_key3,clk_key4;
assign clk_key3=adjust_key1 && mode==5;
//功能5时key1作为调月键
assign clk_key4=adjust_key2 && mode==5;
//功能5时key2作为调日键
第7章数字系统设计实例
always@(posedge clk_key3) //最大12个月
begin
if(month[4]&month[1]) month=1;
else if(month[3]&month[0]) month=month+7;
else month=month+1;
end
第7章数字系统设计实例
always@(posedge clk_key4) //每月按30天算
begin
if(day[5]&day[4]) day=1;
else if(day[3]&day[0]) day=day+7;
else day=day+1;
end
第7章数字系统设计实例
//显示模块:在各功能号下分别显示相应的值
always@(h1 or m1 or s1 or h2 or m2 or s2 or h4 or m4 or
month or day or mode or key1 or key2)
begin
if(mode[2]|(mode[1]&mode[0])|(mode==1&(key1|key2)))
second=0;
else if(mode==1) second=s1;
else second=s2;
if((mode==1 & !key1 &!key2) | mode==3)
begin
第7章数字系统设计实例
hour=h1;minute=m1;
end
else if(mode==2)
begin
hour=h2;minute=m2;
end
else if(mode==4 | ((mode==1) & key1))
begin
hour=h4;minute=m4;
end
第7章数字系统设计实例
else
begin
hour=month;minute=day;
end
end
//发声单元:整点报时和定点闹时
wire spk,temp4,temp5;
第7章数字系统设计实例
assign
temp4=m1[6]&m1[4]&m1[3]&m1[0]&s1[6]&s1[4]&!s1[0];
//59:50', 52', 54', 56', 58'时
assign
temp5=({m1,s1}==0)||((h1==h4)&&(m1==m4)&&!s1[0]);
//定时到时每隔1秒及整点时
第7章数字系统设计实例
assign spk=(temp4&&clk_500 Hz)||(temp5&&clk_1 kHz);
//整点及闹时送到扬声器的不同频率
assign alarm=(temp4||temp5)-spk:0;
//扬声器在整点及闹钟时间发出声响
endmodule
本例用Verilog HDL语言编写,有关Verilog HDL语
言的使用请参见相关参考书籍。
第7章数字系统设计实例
7.4.4 仿真结果
在模式1时, 多功能电子表的仿真波形如图7-16所示。
第7章数字系统设计实例
图7-16 多功能电子表模式1的仿真波形
key2
key1
func_key
clk_1 kHz
clk_1 Hz
alarm
mode
hour
minute
second
10.0 μs 20.0 μs 30.0 μs 40.0 μs 50.0 μs 60.0 μs 70.0 μs 80.0 μs 90.0 μs
第7章数字系统设计实例
7.4.5 下载验证
锁定引脚时clk_1 Hz和clk_1 kHz分别接CLK1和
CLK2,func_key、key1和key2分别接KEY1、KEY2和
KEY3,hour、minute和second分别接时、分、秒数码
管,alarm接扬声器,mode可接3个LED。综合适配后
将配置数据下载入EDA实验平台(技术资料详见附录)的
FPGA中(有关CLK1等引脚在FPGA芯片引脚中的序号,
请参见附录的附图1), 即实现了一个实用多功能电子
表。操作KEY1、KEY2和KEY3,观察时、分、秒数码
管的运行,可对该电子表进行功能验证。
第7章数字系统设计实例
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -