没有合适的资源?快使用搜索试试~ 我知道了~
首页FPGA数字钟实验报告.pdf
资源详情
资源评论
资源推荐

FPGA-简易数字钟的制作与调试
实验报告
院系:
姓名:
班级:
学号:

设计方法与设计方案
1. 设计要求
设计基本要求:
(1) 利用板上的微动开关作时钟的调整。
(2) 用板上的 LED 的闪烁作整点报时。
设计扩展要求:
(1) 增加 12/24 小时显示切换模式。
(2) 加入闹铃功能。
(3) 增加清零功能。
2. 设计思路与设计方案
(1) 一般状态下的时钟功能
basys2 板内置 50MHz 的时钟信号,可以对其进行分频来获得 1Hz 的时钟信号以实现一
般状态下的时钟功能
右侧数码管显示时和分,同时中间小数点闪烁模拟实际钟表;左侧 Led 灯代表秒,其中
左侧 4 个 Led 灯代表十位,右侧 4 个 Led 灯代表个位。
数字钟秒(second)、分(minute)、时(hour)进位逻辑关系如下:
a) 秒个位计数达到 10 之后立刻清零,同时秒十位加 1;
b) 秒十位计数达到 6 之后立刻清零,同时分个位加 1;
c) 分个位计数达到 10 之后立刻清零,同时分十位加 1;
d) 分十位计数达到 6 之后立刻清零,同时时个位加 1;
e) 时个位计数达到 10 之后立刻清零,同时时十位加 1;
f) 增加判定:时个位达到 4 之后,若时十位为 2,则立刻将时个位和时十位同时清零,
若时十位不为 2,则不发生变化
(2) 时钟调整功能
按动微动开关,数字钟进入时钟调整状态。通过拨动开关,依次输入秒,分,时。
在一般状态下,按动一次拨动开关,进入秒调整状态;再次按动拨动开关,进入分调整
状态;第三次按动拨动开关,进入分调整状态;第四次按动拨动开关,返回一般状态并
以调整后的时间继续运行。
拨动开关输入逻辑关系如下:
左侧四位拨动开关输入调整后的十位(引脚分别为 G3,F3,E2,N3),右侧四位拨动开
关输入个位(引脚分别为 P11,L3,K3,B4)
按动引脚为 A7 的微动开关进入时钟调整功能
(3) 闪烁报时功能(包括闹钟报时)
当时钟计时至整点或闹钟指定时间时,左侧 8 个 Led 灯闪烁一分钟,右侧数码管不变;
一分钟后,左侧恢复秒的显示功能。
(4) 闹铃设置功能
按动微动开关,进入闹钟设置模式,仍然通过左侧八位拨动开关进行设置时间的输入,
具体方式与设置时钟相同。微动开关按动一次进入闹钟分的设置,按动第二次进入时的
设置,按动第三次直接回到一般状态。
设置闹钟的过程当中,不能影响原有时钟的运行,因此仅改变数码管显示,而不改变时
钟计时变量。
按动引脚为 C11 的微动开关进入时钟调整功能
(5) 清零功能

按动微动开关,将所有数值全部设置为 0,包括数字钟时、分、秒数值以及预设闹钟的
时和分。并且在松开微动开关之后,自动恢复闹钟运行,此时数字时钟值为 0,闹钟值
也为 0。
按动引脚为 G12 的微动开关进入时钟调整功能
(6) 12/24 小时显示切换模式
按动微动开关,将显示模式进行切换。若按动前为 24 小时显示模式,则按动后改为 12
小时显示模式;若按动前为 12 小时显示模式,则按动后改为 24 小时显示模式。这可以
通过按动改变变量的值使其在 0 和 1 之间不断变化来实现。
按动引脚为 M4 的微动开关进入时钟调整功能
3. 微动开关设置
考虑到时钟设置和闹钟设置的微动开关按动后整体显示状态较为相似,因此将两者对应
的微动开关分开设置。而清零功能对应的微动开关所用到次数较少,同时也为了避免误
触,将其设置为最右侧的微动开关,而在时钟设置和闹钟设置对应的开关间插入 12/24
小时显示切换按键。
代码实现
1. 主模块输入输出与参数设置
module DigitalClock (
input clear, //清零按键,默认进入 24 小时制,设置管脚 G12
input shift, //设置时间按键,设置管脚 A7
input alarm, //设置闹钟按键,进入设置闹钟模式,设置管脚 C11
input twelve, // 12-24 小时切换按键,设置管脚 M4
input [7:0] SW, //拨动开关输入,
input clk, //实验板内置时钟信号,管脚 B8
output [3:0] an, //数码管交替显示控制
output [6:0] a_to_g, //数码管数字显示控制
output dp //小数点显示
output [7:0] led, //Led 灯显示
);
//参数定义部分
reg [25:0] counter; // 分频变量
reg dot = 1; // 小数点显示
reg seconddot = 1; // 小数点显示
reg [23:0] clocktime = 0; // 时钟时间变量
reg [3:0] alarm_min_one = 0; // 闹钟变量分个位
reg [3:0] alarm_min_ten = 0; // 闹钟变量分十位
reg [3:0] alarm_hour_one = 2; // 闹钟变量时个位
reg [3:0] alarm_hour_ten = 1; // 闹钟变量时十位
wire [3:0] warning; // 判断是否到达闹钟设定时间
wire [1:0] s; // 数码管显示
reg [1:0] notube = 0; // 用于更改时间时数码管的禁用
reg [3:0] noled = 0; // 用于更改时间时 led 的禁用
reg [3:0] number; // 数码管数字表示

reg [7:0] secmid; // led 显示秒中间变量
reg [1:0] timesetting = 0; // 设定时间参数,先设定秒,再设定分钟,再
设定小时
reg twelveMode = 0; // 12-24 切换参数,为 1 时 12 小时制,为 0
时 24 小时制
reg [1:0] alarmsetting = 0; // 设定闹钟参数,先设定分钟,再设定小时
wire [3:0] anhour; // 判断是否整点
//参数设置部分
assign s = counter[16:15]; // 分频用于切换数码管
assign an[0] = s[0] | s[1] | notube[0]; // 通过 notube 来区分左右数码管
assign an[1] = ~s[0] | s[1] | notube[0];
assign an[2] = s[0] | ~s[1] | notube[1];
assign an[3] = ~s[0] | ~s[1] | notube[1];
assign dp = seconddot; // 小数点显示
assign led[7:4] = secmid[7:4]; // 左右各四个 led 显示
assign led[3:0] = secmid[3:0];
assign warning = (alarm_min_one^clocktime[11:8]) | (alarm_hour_one^clocktime[19:16])
| (alarm_min_ten^clocktime[15:12]) | (alarm_hour_ten^clocktime[23:20]);
// 闹钟到达判断,当时钟与设定闹钟时间相等时,warning 值为 0,达到闹钟时间
assign anhour = (clocktime[11:8]^(4'b0000)) | (clocktime[15:12]^(4'b0000));
// 整点到达判断,当时钟分个位和分十位均为 0 时,判定为整点
2. 一般状态下的时钟功能
由于整点报时功能和闹钟报时功能均通过左侧 Led 灯显示,因此写入时钟功能当中
//一般情况下时间的变化和显示功能//
if(!timesetting) //判断是否设置时间
begin
notube=0; // 初始化数码管与 LED
noled=0;
if(counter>50000000)
begin //1:一般情况下的时间变化模块
counter = 0; //将 counter 清零,产生 1Hz 的频率
dot = dot + 1; // 每过一秒钟,小数点明灭状态改变
clocktime[3:0] = clocktime[3:0] + 1;
if(clocktime[3:0]==10)
begin
clocktime[3:0] = 0; //秒个位达到 10 后清零
clocktime[7:4] = clocktime[7:4] + 1; //秒十位加 1
if(clocktime[7:4]==6)
begin
clocktime[7:4] = 0; //秒十位达到 6 后清零
clocktime[11:8] = clocktime[11:8] + 1;//分个位加 1
if(clocktime[11:8]==10)
begin
剩余15页未读,继续阅读
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0