FPGA数字钟Word文档下载推荐.docx
- 文档编号:17767024
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:34
- 大小:533.55KB
FPGA数字钟Word文档下载推荐.docx
《FPGA数字钟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《FPGA数字钟Word文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。
系统时钟rst_n:
复位信号
scan_clk:
数码管扫描频率key_clk:
按键采样频率
s_clk:
1s时钟信号
(2)Key_ctl模块:
完成对按键的同步、去抖功能,输出稳定的按键信号set_en、up_en。
模式设置按键up:
计数值加按键
Set_en:
模式设置使能信号up_en:
按键加使能信号
(3)Clock_ctl模块:
通过set_en信号对“正常显示”、“时设置”、“分设置”、“秒设置”模式的循环控制,并产生设置信号h_set(时)、m_set(分)、s_set(秒)供Clock_cnt使用。
Clk:
系统时钟;
reset:
复位信号;
set_en:
工作模式选择信号;
H_set:
时设置使能信号;
M_set:
分设置使能信号,
S_set:
秒设置使能信号;
状态机信号:
Normal:
正常显示状态;
Hour_set:
时设置状态;
Minute_set:
分设置状态;
Second_set:
秒设置状态。
(4)Clock_cnt模块:
完成数字钟的正常显示和数字钟的时、分、秒的校时,在校时模式下,通过ctl信号控制LED的闪烁,也就是间隔1s输出时间数据。
系统时钟reset:
up_en:
校时信号s_clk:
1秒脉冲信号;
h_set:
m_set:
s_set:
秒设置使能信号;
h_data:
时输出信号;
m_data:
分输出信号;
s_data:
秒输出信号;
(5)Display模块:
LED的动态显示,显示格式“时—分—秒”。
reset:
clk:
系统时钟信号
数码管扫描信号h_data:
时信号;
m_data:
分信号;
s_data:
秒信号;
d_col:
数码管的位选择信号
d_out:
译码后驱动数码管信号
五、系统设计仿真及测试方案
A、采用Quartusii和Modelsim的功能仿真,采用Quartusii的时序仿真分析,验证设计的正确性。
B、在Mars-EP1C3-EDA实验平台上实现本设计,并测试其正确性。
具体方案如图4-3所示。
图4-3
C、实验板信号定义
本设计
信号名
实验板
FPGA引脚
备注
d_out[0]
display7
p5
低显dp段
d_col[2]
Dis_A6
P10
低显示
d_out[1]
display6
p4
低显g段
d_col[3]
Dis_A5
P7
d_out[2]
display5
p3
低显f段
d_col[4]
Dis_A4
P6
d_out[3]
display4
p2
低显e段
d_col[5]
Dis_A3
P11
d_out[4]
display3
p1
低显d段
d_col[6]
Dis_A2
P26
d_out[5]
display2
p143
低显c段
d_col[7]
Dis_A1
P27
d_out[6]
display1
p141
低显b段
set
KEY1
p107
按下为低
d_out[7]
display0
p142
低显a段
up
KEY2
p106
d_col[0]
Dis_A8
P31
clk
CLK_40M
p16
40M时钟
d_col[1]
Dis_A7
P28
reset
SYS_RST
p144
低复位
表4-1
六、模块详细设计及功能仿真
1、Freq_div模块设计及功能仿真:
(1)模块设计
分频电路的原理:
分频电路实际上就是一个计数器,根据系统提供的时钟频率和你所需的时钟频率计算出计数的值,当计数值达到设置的值时,使输出变化一次。
系统提供的时钟频率为40MHz,该模块包括三个分频电路:
原理如图2-4所示。
第一步:
将系统时钟40_000分频产生1KHz信号scan_clk;
第二步:
将1KHz进行10分频产生100Hz信号key_clk;
第三步:
将100Hz进行100分频产生1Hz信号s_clk。
图6-1
(2)功能仿真
为了减小仿真时间和难度,把分频值改小进行仿真。
设置clk周期为2ns。
设置对clk进行4分频产生scan_clk;
设置对scan_clk进行3分频产生key_clk;
设置对key_clk进行5分频产生s_clk。
图6-2
有图知,scan_clk周期为:
8ns=4Tclk。
key_clk周期为:
24ns=3Tscan_clk。
S_clk周期为:
120ns=5Tkey_clk=。
分频功能正确。
2、Key_ctl模块设计及功能仿真
该模块主要功能是对异步的按键信号同步处理,并消除按键抖动。
原理:
先用D触发器打两级,然后间隔10ms(key_clk有效)采样,把两次采样值相与,比较两次采样值是否同一,由于直接由触发器输出的信号时间宽度可能过长,所以在触发器后再接一级同步化电路,保证每次输出的有效信号只占有一个时钟周期的宽度。
图6-3是set按键的同步消抖处理电路,up的原理与其相同。
图6-3Set按键消抖原理
图6-4
有图6-4知,按键set的前沿抖动时间为120ns,后沿抖动时间为130ns,按键的稳定时间为540ns,故可设置采样间隔为200ns,有set_en波形可知,当两次的采样信号结果相同时,这时输出信号才可能发生变化,对应的按键的稳定闭合或断开,当两次的采样信号结果不同时,认为输入的信号为抖动信号,这时电路输出维持原状态不变,同时由于有同步化的处理,输出信号的高电平宽度只为系统时钟的一个周期。
3、Clcok_ctl模块设计及功能仿真
(1)模块算法设计
图4-7
(2)、功能仿真
有图可知,复位状态后进入:
“正常显示”状态,输出控制信号:
h_set=0,m_set=0,s_set=0;
此后set_en按键每按一次状态发生一次变化,从“正常显示”→“时设置”→“分设置”→“秒设置”这样循环变化,并输出相应控制信号,“时设置”状态下输出控制信号:
h_set=1,m_set=0,s_set=0;
“分设置”状态下输出控制信号:
h_set=0,m_set=1,s_set=0;
“秒设置”状态下输出控制信号:
h_set=0,m_set=0,s_set=1。
工作模式转换和输出都正确。
4、Clock_cnt计数模块设计及功能仿真
时设置闪烁算法流程图
“分设置”、“秒设置”闪烁原理和“时设置原理一样”。
正常显示算法流程图:
采用BCD码计数,秒计计数值满之后向分进一位,让秒值清零,否则秒值自身加1,分计数值满之后向时进一位,让分值清零,否则分值加1,时计数值满之后,时清零,重新回到秒计数,这样循环执行。
图4-11
时设置算法流程图:
图4-8
分设置和秒设置算法流程和时设置流程类似。
设置复位后时间初值为“23—45—09”。
①“正常显示”:
设置h_set=0,m_set=0,s_set=0;
有图可知,“正常显示”状态下,不管up_en是否按下,时、分、秒的计数都正确。
②“时设置”:
设置h_set=1,m_set=0,s_set=0;
有图知,“时设置”状态下,按键按下一次h_data加1,并间隔一个s_clk周期,输出时计数值h_data,功能正确
③“分设置”:
设置h_set=0,m_set=1,s_set=0;
有图知,“分设置”状态下,按键按下一次m_data加1,并间隔一个s_clk周期,输出分计数值m_data,功能正确
④“秒设置”:
设置h_set=0,m_set=0,s_set=1;
有图知,“秒设置”状态下,按键按下一次s_data加1,并间隔一个s_clk周期,输出时计数值s_data,功能正确。
5、display显示模块设计及功能仿真
显示原理:
用1ms的扫描信号循环控制数码的某一位有效,在相应为有效时输出数据经译码后驱动数码管,比如:
d_col=8’b1111_1110,8位数码管的最低位有效,此时将秒的低四位数据(s_data[3:
0])译码,驱动数码管,若此时s_data[3:
0]=4’d9=4’b1001,数码管此时将显示“9”。
数码管译码表:
led
led显示编码(d_out)
4’b0000
8'
b0000_0011
4’b0001
b1001_1111
4’b0010
b0010_0101
4’b0011
b0000_1101
4’b0100
b1001_1001
4’b0101
b0100_1001
4’b0110
b0100_0001
4’b0111
b0001_1111
4’b1000
b0000_0001
4’b1001
b0001_1001
4’b1010
b1111_1101
4’b1111
b1111_1111
说明:
4’b1010,经译码后显示“—”,4’b1111,经译码后,LED不亮。
设置时间初值为“23—45—09”,控制数码管位选择的信号d_col复位状态后为“8’b1111_1110”,然后在扫描频率作用下位选信号循环左移,并输出相应的时间数据译码值,从“秒低四位”→“秒高四位”→“—”→“分低四位”→“分高四位”→“—”→“时第四位”→“时高四位”这样循环送出数据。
显示数据正确。
七、系统功能仿真
计数初始设置:
设置系统复位后时间初值为“23—45—09”;
分频设置:
设置对clk进行5分频产生scan_clk;
设置对scan_clk进行5分频产生key_clk;
设置对key_clk进行4分频产生s_clk。
(1)正常显示模式
(2)设置模式
有图可以知系统功能正确。
八、系统综合实现及静态时序分析
综合后的RTL级电路
静态时序分析报告
设置建立时间为1ns
九、实际系统测试
设置系统复位后时间初值为“23—45—09”,然后全编译,下载到实验板,按KEY1(set键)可以进行正常的模式选择,从正常显示->
秒设置,每按下一次循环一次。
并且在设置工作模式时,可以看到被设置相应数字按1秒速率闪烁,其它数字不变,功能正确。
达到了设计的要求。
在设置工作模式时,每按KEY2(UP)键一次,被设置相应数字增加1,加到最大值后再加返回0,如小时加到23后再加就返回0,分和秒加到59后再加返回0。
功能正确。
十、总结
经过两周的学习,初步掌握了一简单个数字系统的设计方法和设计流程;
深入了解了数字系统自顶向下的设计方法,顶层设计、模块详细设计、各个模块仿真、系统仿真和时序分析。
刚开始设计时,忽略了好多细节,比如按键的消抖原理,不能用软件的消抖原理来设计硬件电路,为什么要采用BCD码计数,处于设置模式时怎么控制数码管的闪烁,这问题困扰了好久,通过陈老师讲解,以及和其他同学的相互沟通,把这些难题都解决了。
现在明白了做设计前写设计方案的重要性,只要方案正确可行,后面写代码以及调试,都很简单。
自己在写设计方案方面还有好多不足,以后需多多学习。
在写代码时,要以FPGA的设计规范为准则,比如模块、信号的命名要有一定的意义;
使用if...else语句时,必须严格的逐层缩进对齐;
代码后必须加入详细、清晰的注释行以增强代码的可读性和可移植性;
等等。
附录:
源代码和测试代码
Freq_div模块:
源代码:
moduleFreq_div
(
//{{ALTERA_ARGS_BEGIN}}DONOTREMOVETHISLINE!
clk,rst_n,scan_clk,s_clk,key_clk
//{{ALTERA_ARGS_END}}DONOTREMOVETHISLINE!
);
//PortDeclaration
//{{ALTERA_IO_BEGIN}}DONOTREMOVETHISLINE!
inputclk;
inputrst_n;
outputscan_clk;
outputs_clk;
outputkey_clk;
//{{ALTERA_IO_END}}DONOTREMOVETHISLINE!
regscan_clk;
regs_clk;
regkey_clk;
reg[15:
0]cnt1;
always@(posedgeclkornegedgerst_n)
begin
if(!
rst_n)beginscan_clk<
=0;
cnt1<
=16'
d0;
end
elseif(cnt1==16'
d39_999)
begincnt1<
scan_clk<
=1;
end
elsebegincnt1<
=cnt1+16'
d1;
end
reg[3:
0]cnt2;
rst_n)begin
key_clk<
cnt2<
=4'
elseif(scan_clk)
begin
if(cnt2==4'
d9)begin
elsebegin
=cnt2+4'
elsekey_clk<
reg[6:
0]cnt3;
s_clk<
cnt3<
=7'
elseif(key_clk)
begin
if(cnt3==7'
d99)begin
=cnt3+7'
elses_clk<
endmodule
测试代码:
`timescale1ns/1ns
modulefreq_div_tb;
regrst_n,clk;
wirekey_clk,scan_clk,s_clk;
always#1clk=~clk;
initial
clk=0;
rst_n=0;
#3rst_n=1;
#200_000$stop;
freq_divfreq_div(clk,rst_n,scan_clk,s_clk,key_clk);
Key_ctl模块:
Clock_ctl模块:
moduleClock_ctl
clk,rst_n,set_en,h_set,m_set,s_set
inputset_en;
outputh_set;
outputm_set;
outputs_set;
regh_set;
regm_set;
regs_set;
parameter[1:
0]normal=2'
b00,hour_set=2'
b01,
minute_set=2'
b10,second_set=2'
b11;
reg[1:
0]current_state,next_state;
current_state<
=normal;
elsecurrent_state<
=next_state;
always@(current_stateorset_en)
case(current_state)
normal:
if(set_en)next_state<
=hour_set;
elsenext_state<
hour_set:
if(set_en)next_state<
=minute_set;
minute_set:
if(set_en)next_state<
=second_set;
second_set:
endcase
always@(current_state)
beginh_set<
m_set<
s_set<
end
beginh_set<
moduleclock_ctl_tb;
regclk;
regrst_n;
regset_en;
wireh_set;
wirem_set;
wires_set;
always#5clk=~clk;
set_en=0;
#13rst_n=1;
#13set_en=1;
#10set_en=0;
#23set_en=1;
#10rst_n=0;
#12$stop;
clock_ctlclock_ctl(clk,rst_n,set_en,h_set,m_set,s_set);
Clock_cnt模块:
moduleClock_cnt
clk,h_set,m_set,s_set,up_en,rst_n,s_clk,h_data,m_data,s_data
//{{ALTERA_IO_BEGIN}}DONOTREMOVETHIS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 数字