您的位置:首页 > 其它

基于basys2用verilog设计多功能数字钟(重写)

2017-02-07 16:59 344 查看
话不多说先上图

[b]

module seven_seg_display(
input mclk,
input rst_n,
input [2:0] hour_ten,
input [3:0] hour_one,
input [2:0] minute_ten,
input [3:0] minute_one,
output reg [7:0] out,
output reg [3:0] an//所有的数码管的使能端
);

wire [3:0] aen;//数码管使能信号
reg [1:0] s;//数码管显示选择
reg [18:0] cnt;//数码管扫描时钟计数

parameter CLK190 = 18'd263157;

always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
cnt <= 18'b0;
else if(cnt == CLK190 - 1'b1)
cnt <= 18'b0;
else
cnt <= cnt + 1'b1;
end

//灯的状态没5.2毫秒刷新一次
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
s <= 2'b0;
else if(cnt == CLK190 - 1'b1)
s <= s + 1'b1;
end

assign aen = 4'b1111;
always @(*)
begin
an <= 4'b1111;
if(aen[s] == 1)
an[s] <= 1'b0;
end

reg [7:0] out0;
//小时的十位显示
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
out0 <= 8'b0000_0011;
else
begin
case(hour_ten)
0: out0 <= 8'b0000_0011;
1: out0 <= 8'b1001_1111;
2: out0 <= 8'b0010_0101;
default: out0 <= 8'b0000_0011;
endcase
end
end

reg [7:0] out1;
//小时的个位显示
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
out1 <= 8'b0000_0010;
else
begin
case(hour_one)
0: out1 <= 8'b0000_0010;
1: out1 <= 8'b1001_1110;
2: out1 <= 8'b0010_0100;
3: out1 <= 8'b0000_1100;
4: out1 <= 8'b1001_1000;
5: out1 <= 8'b0100_1000;
6: out1 <= 8'b0100_0000;
7: out1 <= 8'b0001_1110;
8: out1 <= 8'b0000_0000;
9: out1 <= 8'b0000_1000;
default: out1 <= 8'b0000_0010;
endcase
end
end

reg [7:0] out2;
//分钟的十位显示
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
out2 <= 8'b0000_0011;
else
begin
case(minute_ten)
0: out2 <= 8'b0000_0011;
1: out2 <= 8'b1001_1111;
2: out2 <= 8'b0010_0101;
3: out2 <= 8'b0000_1101;
4: out2 <= 8'b1001_1001;
5: out2 <= 8'b0100_1001;
6: out2 <= 8'b0100_0001;
7: out2 <= 8'b0001_1111;
8: out2 <= 8'b0000_0001;
9: out2 <= 8'b0000_1001;
default: out2 <= 8'b0000_0011;
endcase
end
end

reg [7:0] out3;
//分钟的个位显示
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
out3 <= 8'b0000_0011;
else
begin
case(minute_one)
0: out3 <= 8'b0000_0011;
1: out3 <= 8'b1001_1111;
2: out3 <= 8'b0010_0101;
3: out3 <= 8'b0000_1101;
4: out3 <= 8'b1001_1001;
5: out3 <= 8'b0100_1001;
6: out3 <= 8'b0100_0001;
7: out3 <= 8'b0001_1111;
8: out3 <= 8'b0000_0001;
9: out3 <= 8'b0000_1001;
default: out3 <= 8'b0000_0011;
endcase
end
end

always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
out <= 8'b0000_0011;
else
case(s)
0: out <= out3;
1: out <= out2;
2: out <= out1;
3: out <= out0;
default: out <= 8'b0000_0011;
endcase
end

endmodule


seg_display
-----------------------------------------我是华丽的分隔线----------------------------------------------------------------

今天无意之中看到了另一种设置多功能数字表的思想,废话少说,下面做以笔记。

我原来的设计,在秒分频过后,当记到59秒时,将分的个位加1,当分的个位记到9时将分的十位加1,当分的十个位为59时,将时的个位加1,以此类推。我使用的basys2开发板只有四个LED数码管,所以只能显示分时,所以有四个输出端口minute_one,minute_ten,hour_one,hour_ten。完成显示。

下面我引出另一种设计思路

将秒计数到59,分进行进位,将分计数到59,小时进行进位,最后小时计数到23。然而一个时钟的个位和十位是分别显示的,所以还要做一个接口转换,把2位十进制数的个位和十位分离开。具体方法就是除以10,商是十位的值,余是个位的值。

如图所示:



三、实验总结

  这里我就我不再次总结了,把以前的实验报告复制过来看看,现在看起来以前的总结报告,有些写的真是不堪入目,

-----------------------------------------我是分隔线---------------------------------------------------------------------

  工作总结

  第二期我们小队选择多功能数字时钟一题,针对basys2开发板使用Verilog HDL语言编译,完成该工程。题目要求多功能数字中有时钟(可校时)、秒表(可清零、暂停)功能,我们在原有题目完成的基础上添加了闹钟功能,在完成任务过程中可谓是一路心酸加苦逼,但最后还是终于圆满完成!下面我将简述我们完成工作过程中具体遇到的一些问题。

  心得与体会

  在设计之初,由于心中对整个工程的思考不够,没有一个具体的模块化概念,还只是单单把每个功能当成一个题目去做,导致给后面的工作埋下了定时炸弹。后来在慢慢的进度到后面的时候,才有了将各个模块联系起来的思想,在设计一个模块的时候就必须将其他想加入的模块提前考虑好,给下一步工程就要留下能加入引用的空间。而且小组合作就必须每个人的代码风格要类似,每个人写自己的模块,要不然最后模块整合的时候会有很大的麻烦。

在这次任务中我们没有体现出小组合作的优势,很伤心的是我们组最开始的两个组员因为忙双双离我而去,他们由于事情安排不开而且上一期的任务还没有完成,所以前面一半的工程我都独自一个人完成。记得那个周六我从早上九点多来到实验室,除了中间吃饭一直坐在这写代码,一直写到晚上十点多才离开,到第二天也是同样,只不过下午五点多就回去休息了。正是我这两天沉下心来做才让我们的任务有了很大的进展。最后我的两个组员离开,我感到有些伤心,但工程还得继续,我已经做好独立完成的准备,还好最后又有两个人分到我的小队,这让我又看到了希望,我的新队员给了我很多的灵感,所以我决定在原有的题目基础上加入闹钟的功能,但是我独立完成的那一部分还有一个致命的问题没有解决,就是硬件开发的基础问题——按键消抖。

从接触开始我就感觉按键消抖比较抽象,再加上对于放在我们这个数字钟的题目,按键不由的跟时钟扯到了一起,消抖的代码没有问题,但是因为这个题目的特殊,消抖后必须和时钟扯上关系,所以在这个问题上耗费了我很多的时间,上周从周一到周四四天里一下课我就来实验室,将代码改了一遍又一遍,改回来又改回去,到周四的时候我已经体会到绝望的感觉。周五终于解决了这个问题。到这里我们的工程就取得了一个大前进。

我其他两个组员编写了秒表计数的模块,然后在周五下午我就立马将模块整合,到此便完成了题目的所有要求。闹钟功能必须要又可以设置闹钟的功能而按键只有四个已经用过了,要是再在原来的基础上改动有可能别的模块出问题。周日的工作很顺利几乎没用多少时间,在原有的代码基础上增加个模块就实现了闹钟功能,至此我们的任务顺利完成。

------------------------------------------------------------------------------

  从开始接触fpga以来已经有6个月了,我的路还是很漫长,就像bingo曾经说的,我没资格放弃。现在寒假还有不到二十天结束,不知道我又能学多少,我不认为自己势必比别人聪明的人,但我相信通过自己的努力,会慢慢变得更好。最后献上一个图,每天多努力一点点和少努力一点点的差距就是这么大。





转载请注明出处:NingHeChuan(宁河川)

个人微信订阅号:NingHeChuan

如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.cnblogs.com/ninghechuan/p/6374586.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: