7.1 实 验 目 的
设计一个具有时功能和校的数字钟。
7.2 实 验 仪 器 与 器 材
1. EDA 开发软件 一 套
2.微机 一 台
3.实验开发系统 一 台
4.打印机 一 台
5.其他器件与材料 若 干
7.3 实 验 说 明
用 数码管显示小时 、 分 钟 和 秒钟。 三 个 按键用于时钟校准。 K1 用 与切换 正 常 计 时 , 校 准 小 时 和 分 钟 。 K2 用 于 时钟的 “+”。 K3 用 于 时钟的 “-”。 校准相应 的刻度,该数码管闪烁。
7.4 实 验 要 求
1. 1 分 钟 =60 秒 ; 当 秒 钟 计时为 59 时 , 分 钟 计 数 +1;
2. 1 小 时 =60 分 钟 ;当 分 钟 计时为 59,并且秒到分再次进位时,时钟计数个位 加 1;分钟计数置位为 0;
3. 显 示 为 24 小时制,当 时 钟计数十位 小 于 2 时 , 时钟个位计数到计数到 9 时 , 分钟到 时 钟 再次进位 时 , 十 位 加 1;
4. 24 小时制计满归零 ,23:59:59 时 ,秒 到 分 再 次 进 位 时 ,时 、分 、秒 三 部 分 计 数均归零。
7.5 实 验 报 告 要 求
1. 写出全部设计文件。
module clock(
input rst,
input clk0,
output reg [6:0] led1,
output reg [6:0] led2,
output reg [6:0] led3,
output reg [6:0] led4,
output reg [6:0] led5,
output reg [6:0] led6,
input wire k1, // 切换键
input wire k2, // 加键
input wire k3, // 减键
output reg led);
reg clk1;
wire clk;
reg [30:0] counter;
parameter COUNTER_MAX = 25000000; // 计数器最大值,控制时钟频率
reg [5:0]s;
reg [5:0]f;
reg [5:0]m;
reg [5:0]count;
reg [5:0]m1;
reg [5:0]m2;
reg [5:0]f1;
reg [5:0]f2;
reg [5:0]s1;
reg [5:0]s2;
reg [23:0] blink_counter = 0; // 24位计数器用于闪烁
reg blink = 0;
reg k;
initial
begin
s=0;
f=0;
m=0;
count=0;
clk1=0;
led=1;
end
//时钟
always @(posedge clk0 or negedge rst) begin
if (!rst) begin
counter <= 0;
end
else begin
if (counter == COUNTER_MAX -31'b1) begin
counter <= 0;
clk1 <= clk1+1; // 每达到计数器最大值时,翻转时钟信号
end else begin
counter <= counter + 1;
end
end
end
assign clk=clk1;
always@(posedge clk )
begin
led=~led;
end
//电子时钟
always@(posedge clk )
begin
if(count==6'b111100)
begin
count=6'b000001;
end
else
count=count+6'b000001;
end
always @ (posedge k1) begin
k <= k+ 1;
if (k == 3) begin
k <= 0;
end
end
always@(posedge clk )
begin
m=count;
if(!rst)
begin
s<=0;
f<=0;
m<=0;
end
else if(m==6'b111100)
begin
m=0;
if(m==0)f<=f+6'b1;
if(f==6'b111100)
begin
f<=0;
if(f==0)s<=s+6'b1;
if(s==6'b011000)
begin
f<=0;
m<=0;
s<=0;
end
end
end
case (k)
1: begin // 校准时
if (k2==1) begin // 加时
s <= s + 6'b1;
if (s == 6'b011000) begin
s <= 0;
end
end
if (k3==1) begin // 减时
if (s == 0) begin
s <= 6'b011000;
end else begin
s <= s - 6'b1;
end
end
end
2: begin // 校准时
if (k2==1) begin // 加时
f <= f + 6'b1;
if (f == 6'b111100) begin
f <= 0;
end
end
if (k3==1) begin // 减时
if (f == 0) begin
f<=6'b111100;
end else begin
f <= f - 6'b1;
end
end
end
endcase
end
// 闪烁逻辑
always @ (posedge clk0 or posedge rst)
begin
if (rst)
begin
blink_counter <= 0;
blink <= 0;
end
else
begin
if (k == 0)
begin // 正常计时模式,不闪烁
blink_counter <= 0;
blink <= 0;
end
else
begin // 校准模式,闪烁
blink_counter <= blink_counter + 1;
if (blink_counter == 500000)
begin // 闪烁频率为1Hz
blink_counter <= 0;
blink <= ~blink;
end
end
end
end
//数码管
always @ ( posedge clk or negedge rst)
begin
m1=m%10;
if (!rst)
led1 = 7'b0000000;
else begin
case (m1)
6'b000000 : led1 = 7'b1000000;
6'b000001 : led1 = 7'b1111001;
6'b000010 : led1 = 7'b0100100;
6'b000011 : led1 = 7'b0110000;
6'b000100 : led1 = 7'b0011001;
6'b000101 : led1 = 7'b0010010;
6'b000110 : led1 = 7'b0000010;
6'b000111 : led1 = 7'b1111000;
6'b001000 : led1 = 7'b0000000;
6'b001001 : led1 = 7'b0010000;
default : led1 =7'b1000000;
endcase
end
end
always @ ( posedge clk or negedge rst)
begin
m2=m/10;
if (!rst)
led2 = 6'b00000;
else begin
case (m2)
6'b000000 : led2 = 7'b100_0000;
6'b000001 : led2 = 7'b111_1001;
6'b000010 : led2 = 7'b010_0100;
6'b000011 : led2 = 7'b011_0000;
6'b000100 : led2 = 7'b001_1001;
6'b000101 : led2 = 7'b001_0010;
6'b000110 : led2 = 7'b000_0010;
6'b000111 : led2 = 7'b111_1000;
6'b001000 : led2 = 7'b000_0000;
6'b001001 : led2 = 7'b001_0000;
default : led2 =7'b100_0000;
endcase
end
end
always @ ( posedge clk or negedge rst)
begin
f1=f%10;
if (!rst)
led3 = 7'b0000000;
else begin
case (f1)
6'b000000 : led3 = 7'b100_0000;
6'b000001 : led3 = 7'b111_1001;
6'b000010 : led3 = 7'b010_0100;
6'b000011 : led3 = 7'b011_0000;
6'b000100 : led3 = 7'b001_1001;
6'b000101 : led3 = 7'b001_0010;
6'b000110 : led3 = 7'b000_0010;
6'b000111 : led3 = 7'b111_1000;
6'b001000 : led3 = 7'b000_0000;
6'b001001 : led3 = 7'b001_0000;
default : led3 =7'b100_0000;
endcase
if (k == 1)
begin // 校准时
if (blink) led3 <= 7'b1111111;
end
end
end
always @ ( posedge clk or negedge rst)
begin
f2=f/10;
if (!rst)
led4 = 7'b0000000;
else begin
case (f2)
6'b000000 : led4 = 7'b100_0000;
6'b000001 : led4 = 7'b111_1001;
6'b000010 : led4 = 7'b010_0100;
6'b000011 : led4 = 7'b011_0000;
6'b000100 : led4 = 7'b001_1001;
6'b000101 : led4 = 7'b001_0010;
6'b000110 : led4 = 7'b000_0010;
6'b000111 : led4 = 7'b111_1000;
6'b001000 : led4 = 7'b000_0000;
6'b001001 : led4 = 7'b001_0000;
default : led4 =7'b100_0000;
endcase
if (k == 1)
begin // 校准时
if (blink) led4 <= 7'b1111111;
end
end
end
always @ ( posedge clk or negedge rst)
begin
s1=s%10;
if (!rst)
led5 = 6'b0000000;
else begin
case (s1)
6'b000000 : led5 = 7'b100_0000;
6'b000001 : led5 = 7'b111_1001;
6'b000010 : led5 = 7'b010_0100;
6'b000011 : led5 = 7'b011_0000;
6'b000100 : led5 = 7'b001_1001;
6'b000101 : led5 = 7'b001_0010;
6'b000110 : led5 = 7'b000_0010;
6'b000111 : led5 = 7'b111_1000;
6'b001000 : led5 = 7'b000_0000;
6'b001001 : led5 = 7'b001_0000;
default : led5 =7'b100_0000;
endcase
if (k == 1)
begin // 校准时
if (blink) led5 <= 7'b1111111;
end
end
end
always @ ( posedge clk or negedge rst)
begin
s2=s/10;
if (!rst)
led6 = 7'b0000000;
else begin
case (s2)
6'b000000 : led6 = 7'b100_0000;
6'b000001 : led6 = 7'b111_1001;
6'b000010 : led6 = 7'b010_0100;
6'b000011 : led6 = 7'b011_0000;
6'b000100 : led6 = 7'b001_1001;
6'b000101 : led6 = 7'b001_0010;
6'b000110 : led6 = 7'b000_0010;
6'b000111 : led6 = 7'b111_1000;
6'b001000 : led6 = 7'b000_0000;
6'b001001 : led6 = 7'b001_0000;
default : led6 =7'b100_0000;
endcase
if (k == 1)
begin // 校准时
if (blink) led6 <= 7'b1111111;
end
end
end
endmodule
2.打印顶层电路图和主要模块的 HDL 文 件 。
3.写出测试结果及分析
`timescale 1ms / 1ms
module clocktb;
reg clk, rst;
wire[7:0]led1;
wire[7:0]led2;
wire[7:0]led3;
wire[7:0]led4;
wire[7:0]led5;
wire[7:0]led6;
clock U1(.led1(led1),.clk(clk),.rst(rst),.led2(led2),.led3(led3),.led4(led4),.led5(led5),.led6(led6));
initial begin
{clk, rst} = 1'b0;
#60000 rst=1'b1;
forever #500 clk = ~clk;
end
endmodule文章来源:https://www.toymoban.com/news/detail-813706.html
可用视频展示进位时的效果文章来源地址https://www.toymoban.com/news/detail-813706.html
到了这里,关于实验 7 数字钟设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!