这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 啸风的FPGA DIY开发进程

共78条 6/8 |‹ 3 4 5 6 7 8 跳转至
专家
2012-10-19 23:32:37     打赏
51楼
哈哈 路飞 我喜欢

专家
2012-10-20 16:34:57     打赏
52楼

数字时钟数码管显示

视频



本实验是数码管、按键、分频的综合实验,要求:用硬件描述语言verilog设计一个具有时、分、秒计数显示功能,以24小时循环计时的时钟电路,带有一键清零、以及秒、分、时校准的功能。下图是本设计的系统框图:





24小时计时时钟电路是对系统时钟进行分频到1Hz,下面是流程图:



按键控制模块中包括:清零键(clr)、设置键(set)、模式选择键(mode)。当清零键按下,时钟电路清零,数码显示零。设置键跟模式选择一起使用,对电路进行校准。各种模式的状态图如下:




当这些都准备好了,你就开始你的工程吧,下面是整个工程的RTL视图:



以下是核心源码:


module clock(
clk,
mode,set,clr,
segdat,sl
);

 

input clk;
input mode,set,clr;
output segdat,sl;
wire[7: 0] segdat,sl;
wire[7: 0]sec,min,hour;
wire[7: 0]BCD_sec,BCD_min,BCD_hour;

//时钟控制模块例化
time_control u_time_control(
.mode(mode),
.clr(clr),
.clk(clk),
.set(set),
.sec(sec),
.min(min),
.hour(hour)
);

//秒BCD码例化
bcd u_sec(
.datain(sec),
.BCD_Out(BCD_sec)
);

//分钟BCD码例化
bcd u_min(
.datain(min),
.BCD_Out(BCD_min)
);

//小时BCD码例化
bcd u_hour(
.datain(hour),
.BCD_Out(BCD_hour)
);
//数码管显示例化
display u_display(
.clk(clk),
//.rst_n(rst_n),
.sec(BCD_sec),
.min(BCD_min),
.hour(BCD_hour),
.segdat(segdat),
.sl(sl)
);
endmodule
========================================================
module time_control(
mode,clr,clk,set,
sec,min,hour
);
input mode,clr,clk,set;
output sec,min,hour;
reg[1:0] state;
reg [7:0] sec,min,hour; //秒和分处理寄存器

//模式选择
//state = 2'b00 时钟计时
//state = 2'b01 小时校准
//state = 2'b10 分钟校准
//state = 2'b11 秒校准

always @(negedge mode or negedge clr)
if(!clr)
state = 2'b00;
else if(!mode)
begin
case(state)
2'b00: state = 2'b01;
2'b01: state = 2'b10;
2'b10: state = 2'b11;
2'b11: state = 2'b00;
endcase
end

reg[25: 0] clk_cnt;
reg set_r;

always @(posedge clk or negedge clr)
if(!clr)
begin
sec = 8'd0;
min = 8'd0;
hour = 8'd0;
clk_cnt = 0;
set_r = 1'b0;
end
else
begin
case(state)
2'b00: //24小时计数
if(clk_cnt == 26'd50000000) //对50M时钟进行分频得1Hz的时钟
begin
clk_cnt = 25'd0;
if(sec == 8'd59)
begin
sec = 8'd0;
if(min == 8'd59) //时钟计数
begin
min = 8'd0;
if(hour == 8'd23)
hour = 8'd0;
else
hour = hour + 1'b1;
end
else
min = min + 1'b1;
end
else
sec = sec + 1'b1;
end
else
clk_cnt = clk_cnt + 1'b1;

2'b01: //小时校准
if(!set)
begin
if(set_r == 1'b0)
begin
set_r =1'b1;
if(hour == 8'd23)
hour = 8'd0;
else
hour = hour + 1'b1;
end
end
else
set_r = 1'b0;

2'b10: //分钟校准
if(!set)
begin
if(set_r == 1'b0)
begin
set_r = 1'b1;
if(min == 8'd59)
min = 8'd0;
else
min = min + 1'b1;
end
end
else
set_r = 1'b0;

2'b11: //秒校准
if(!set)
begin
if(set_r == 1'b0)
begin
set_r =1'b1;
if(sec == 8'd59)
sec = 8'd0;
else
sec = sec + 1'b1;
end
end
else
set_r = 1'b0;


endcase
end
endmodule


助工
2012-10-20 19:09:50     打赏
53楼

楼主好厉害啊!弄了这么多了


高工
2012-10-20 20:03:05     打赏
54楼
呵呵,音乐都来了,不错

菜鸟
2012-10-20 23:57:16     打赏
55楼
真是快啊。我才焊好,现在才开始学习怎么编程呢。

专家
2012-10-21 20:33:20     打赏
56楼

 加油!!!!!


专家
2012-10-22 21:21:34     打赏
57楼
11、LCD1602显示

  “ welcome to EEPW”
           “I am XiaoFeng”

视频:




sof文件:Y1.zip     Y2.zip

工程师
2012-10-23 09:21:08     打赏
58楼
你这个做得很好!把所有的引脚都分配了,每次要分配引脚直接调用就可以了,真的很方便使用也很方便修改。值得学习

工程师
2012-10-27 23:05:01     打赏
59楼
1602的.sof共享的在哪啊,怎么没有找到啊

专家
2012-10-28 20:11:45     打赏
60楼

那个没有上传    我明天上传下   今天刚在外回来


共78条 6/8 |‹ 3 4 5 6 7 8 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]