文档库

最新最全的文档下载
当前位置:文档库 > 多功能时钟设计报告

多功能时钟设计报告

基于FPGA的多功能时钟

设计报告

专业:电子与信息工程系

班级:通信11级01班

学号:u201113247

电子与信息工程系

2012年8月4日

目录

设计目的 (2)

设计内容及要求 (2)

设计(代码)分析 (3)

实验过程及步骤 (4)

实验结果的测试及仿真 (10)

实验总结 (13)

参考文献 (13)

附录(原代码) (14)

1设计目的

在学习verilog语言及数电的相关知识后,运用所学知识及查阅资料完成对多功能时钟的设计,以巩固以前所学知识,提高解决和分析问题的能力以及掌握稍复杂逻辑电路的设计方法;深刻理解verilog 语言的思路,并进一步掌握操作BASYS2板的使用;掌握计数器的设计方法,模块之间的协调方式,了解电路设计层次。

2 设计内容及要求

多功能时钟设计分为基本电路部分和拓展功能部分和特色部分。

基本电路部分

●以数字形式显示时、分、秒的时间;(要求可切换显示)

●小时计数器为同步24进制;(同步计数器)

●可精确手动校时,包括小时,分钟,秒;设有按钮,每

按一次相应按钮可使对应的时间循环改变,以校时用手

动校时时,长按按钮可加速校时速度。

拓展部分

●可设定24小时任意时刻闹钟(精确到秒),设定按钮

与校时按钮共用。

设有闹钟开关键

●整点报时59分51秒

59分53秒

59分55秒

59分57秒

led[7:4]流水灯式依次点亮以模仿电台播音

(频率为1HZ)

59分59秒时 led灯led[3]点亮频率为10HZ

特色部分stopwatch

可储存记忆10组59分59秒99内时间数据的秒表。

可显示记录的数据个数和对应顺序

精确到1/100秒

设有 swo(秒表模式开启键) ————K3

swp(暂停键) ————————L3

scrl(数据控制键)——————B4

Ncr(清零复位键)——————A7

counter(记录数据键)————M4

- (数据加键) ————————C11

+ (数据减键)————————G12

Switch (显示切换键)---------------P11

3代码分析top_clock

总共分为顶层和底层

●顶层top.v

计时部分:调用底层模块10位计数器6位计数器3位计器

4*6=24位寄存器cnt[23:0]

Cnt[3:0] second0 cnt[7:4] second1

Cnt[11:8] minute0 cnt[15:12] minute1

Cnt[19:16] hour0 cnt[23:20] hour1

校时部分:设计为信号选择器ad=1时为计时模式,信号为校时信号

ad =0时为正常计时模式

数据显示部分:

设有切换switch端

数码管扫描自动扫描1KHZ

4*8=32位寄存器

Temp[31:0]

分为校时模式显示ad=1 set=0 swo=0 ------------ cnt

闹钟设置模式显示ad=0 set=1 swo=0------------ cnt1

秒表计时模式显示ad=0 set=0 swo=1------------ cnt2

正常走时模式显示其余----------------------------------cnt

底层部分

计数器counter10.v counter6.v counter3.v

// counter10.v(0~9)

module counter10(en,ncr,clk,q);

inputen,ncr,clk;

output [3:0] q;

reg [3:0] q;

always@(posedgeclk )

begin

if(ncr) q<=4'd0;//ncr=0时,异步清零

else if(~en) q<=q;// EN=0,暂停计数

else if (q==4'b1001) q<=4'b0000;

else q<=q+1;//计数器加1

end

endmodule

闹钟设定模块bell.v cnt1 代码见附录

仿电台报时radio.v代码见附录

秒表stopwatch.v cnt2 代码见附录

多功能时钟设计报告

4实验内容及步骤

(1)创建工程命名为top_clock

多功能时钟设计报告

(2)选择BASYS2型号并完成创建

多功能时钟设计报告

(3)新建verilogmodule文件命名为top

多功能时钟设计报告

(3)添加完整代码

完整代码见附录

多功能时钟设计报告

(4)检查语法直至通过

双击Synthesize—XST

(5) 创建时钟信号约束即CLK

多功能时钟设计报告

(6) 创建管脚约束双击

管脚设置为

多功能时钟设计报告

多功能时钟设计报告

多功能时钟设计报告

多功能时钟设计报告

多功能时钟设计报告

多功能时钟设计报告

管脚分布

a[0]-a[3]---------→K14 F12 J12 M13数码管扫描信号

adj[0]—adj[3]--→G12 C11 M4 A7校时及闹钟设定及秒表按钮led[0]-----led[7]--→M5 M11 P7 P6 N5 N4 P4 G1 led灯segs[0]---segs[6]-→L14 H12 N14 N11 P12 L13 M12数码管rcrl→F3 仿电台播报开关

scrl--→B4 秒表显示切换开关

bcrl→N3 闹铃开关

set→E2 闹钟设定按钮

ad→G3 校时按钮

switch→P11 显示切换按钮

swo→K3 秒表开关

swp→L3 秒表暂停开关

CLK→B8 时钟信号50MHz

(7) 逻辑综合

(8) 下载到BASYS2板上

多功能时钟设计报告

多功能时钟设计报告

打开bit文件下载到板子上

多功能时钟设计报告

多功能时钟设计报告

在板子上试验

(5) 实验结果的测试和仿真仿真波形如下:

Counter10

多功能时钟设计报告

Counter6

多功能时钟设计报告

Counter3

多功能时钟设计报告

Bell

多功能时钟设计报告

多功能时钟设计报告

多功能时钟设计报告

Radio

多功能时钟设计报告

实验结果及说明:(详见视频)

(1)正常走时模式

Switch=1 时显示分分:秒秒

Switch=0时显示时时:分分;

(2)手动校时模式ad=1 set=0 swo=0

使ad=1,每按一下[ ] [ ] [ ] [ ] switch=1,每按一下循环加一(分分秒秒)

A7 M4 C11 G12

[ ] [ ] [ ] [ ]A7 M4 C11 G12

switch=0,每按一下循环加一(时时分分)

A7 M4 C11 G12

例如设定为20:12:08

(3)闹钟设定和开关模式

(brcl)N3 ->闹铃(led灯)开关闹铃响时M11 M5亮灯以10MHZ 闪烁

闹铃设定ad=0 set=1 swo=0

设置方法和校时方法共用键(A7 M4 C11 G12)

方法相同

(4)秒表模式ad=0 set=0 swo=1

(swp) 暂停键低电平有效

A7 清零键(包括数据清零)

M4 记录数据键每按一次记录一个时间数据(59分59秒99以内)

可记录10组数据并可显示当前数据的序号

Switch=0时[ ] [ ] [ ] [ ]

^ ^ ^ ^

显示C 数据序号分分

Switch=1时[ ] [ ] [ ] [ ]

^ ^ ^ ^

秒秒0.1秒0.01秒

C11 (—)数据减键序号循环减一最小为1

G12(+)数据加键序号循环加一最大为9

序号即为数据记录的顺序

(5)其他按法皆为正常走时模式

6实验总结

通过多功能时钟的设计过程,我深刻的感觉到复杂电路设计的思路和方法特别重要,好的方法不仅省时省力,也可使程序运行更稳定快速高效。此次的多功能时钟分为好几个大的模块,

怎样能恰当好处的连接这些模块是需要经验的,通过这次试验我也初步积累到了一些经验:端口尽量不要太多,能调用模块尽量调用,可省时省力,模块与模块之间尽量独立,但又要设置好端口之间的连接,中间变量不宜过多,但适当的中间变量省下不好麻烦。例如我就设置啦显示的中间变量temp【31:0】

通过不同的模式转换将不同的值赋给temp变量,这样显示的代码就可重复使用。与此同时,在设计中也还有值得改进的地方,就是按钮使用过多,操作方法显得有些复杂,可以进一步优化改进。

遇到的最主要的问题:秒表设计模块中的1/100秒在数码管上无法正常快速显示(由于led灯的余辉效应造成)

记录数据时的准确度也就下降,人们正常按键时间或大于0.01秒所以秒表的十分位为准确位百分位不准确

7参考文献

【1】《Verilog hdl与数字asic设计基础》8.4 和8.5(罗杰主编)

(8)附录(源代码)

module top(set,ad,swo,swp,switch,bcrl,rcrl,scrl,,clk,adj,segs,a,led

);

input ad,set,swo,bcrl,rcrl,scrl,swp,switch,clk;//定义输入端口

input [3:0] adj;

output [6:0] segs;//数码管

output [3:0] a;//扫描输出

output [7:0] led;//led灯

reg [3:0] a;

reg [6:0] segs;//shu ma guan

reg [31:0] temp;

wire [23:0] cnt;//走时模式和校时模式临时变量

wire [23:0] cnt1;//闹钟模式临时变量

wire [31:0] cnt2;// 秒表模式临时变量

//使能信号

initial begin

a=4'b1110;

end //chu shi hua

wire eno,enp1,enp2,enp3,enp4,enp5;

in50MHz_out1Hz u0(clk,cp1);//输出频率1HZ

in50MHz_out1kHz u7(clk,cp2);//输出频率1kHZ扫描信号

in50MHz_out10Hz u8(clk,cp3); //输出频率10HZ

in50MHz_out100Hz u12(clk,cp4);//100Hz

counter10 u1(en0,0,cp,cnt[3:0]); //second个位计数

counter6 u2(enp1,0,cp,cnt[7:4]);//second十位计数

counter10 u3(enp2,0,cp,cnt[11:8]);//minutes个位计数

counter6 u4(enp3,0,cp,cnt[15:12]);//minutes十位计数

counter10 u5(enp4,0,cp,cnt[19:16]);//hours个位计数

counter3 u6(enp5,0,cp,cnt[23:20]); //hours十位计数

bell u9(switch,set,bcrl,adj,cp3,cnt,cnt1,led[1:0]);//闹钟模块

radio u10(rcrl,cnt[15:0],cp1,cp3,led[7:3]);//仿真报时模块

stopwatch u11(swo,scrl,swp,adj,cp4,cp3,cnt2);//秒表模块

assign cp= ad?cp3:cp1,

en0=(~ad)|(switch&adj[0]),

enp1=~ad?(cnt[3:0]==4'h9):(adj[1]&switch),//产生second十位计数使能信号

enp2=~ad?(cnt[7:4]==4'd5)&(cnt[3:0]==4'd9):(adj[0]&switch==0),//产生minutes

个位计数使能信号

enp3=~ad?(enp2&(cnt[11:8]==4'd9)):(adj[1]&switch==0),//产生minutes十位计数使能信号

enp4=~ad?(enp3&(cnt[15:12]==4'd5)):(adj[2]&switch==0),//产生hours

个位计数使能信号

enp5=~ad?(enp4&cnt[19:16]==4'd9):(adj[3]&switch==0),//产生hours十

位计数使能信号

led[2]=0;

always@(ad or set or swo) //显示模式选择

if((~ad)&set&(~swo)) begin temp[15:0]<=cnt1[15:0];temp[31:16]<=cnt1[23:8];end

else if( (~ad)&(~set)&swo) temp<=cnt2;

else begin temp[15:0]<=cnt;temp[31:16]<=cnt[23:8];end

always@(posedge cp2) // 扫描信号循环变化

if(a==4'b1110) a<=4'b1101;//J12

else if(a==4'b1101) a<=4'b1011;//M13

else if(a==4'b1011) a<=4'b0111;//k14

else a<=4'b1110;//F12

always@(posedge cp2) //数码管显示译码

if(switch==1'b0)

begin

if(a==4'b1110)

begin

case(temp[19:16])

4'd0: segs <= 7'b1000000;

4'd1: segs <= 7'b1111001;

4'd2: segs <= 7'b0100100;

4'd3: segs <= 7'b0110000;

4'd4: segs <= 7'b0011001;

4'd5: segs <= 7'b0010010;

4'd6: segs <= 7'b0000010;

4'd7: segs <= 7'b1111000;

4'd8: segs <= 7'b0000000;

4'd9: segs <= 7'b0010000;

endcase

end

else if(a==4'b1101)

begin

case(temp[23:20])

4'd0: segs <= 7'b1000000;

4'd1: segs <= 7'b1111001;

4'd2: segs <= 7'b0100100;

4'd3: segs <= 7'b0110000;

4'd4: segs <= 7'b0011001;

4'd5: segs <= 7'b0010010;

default segs <= 7'b1111111;

endcase

end

else if(a==4'b1011)

begin

case(temp[27:24])//hours个位

4'h0: segs <= 7'b1000000;

4'h1: segs <= 7'b1111001;

4'h2: segs <= 7'b0100100;

4'h3: segs <= 7'b0110000;

4'h4: segs <= 7'b0011001;

4'h5: segs <= 7'b0010010;

4'h6: segs <= 7'b0000010;

4'h7: segs <= 7'b1111000;

4'h8: segs <= 7'b0000000;

4'h9: segs <= 7'b0010000;

4'ha: segs <= 7'b0001000;

default segs <= 7'b1111111; endcase

end

else

begin

case(temp[31:28])//hours十位4'h0: segs <= 7'b1000000;

4'h1: segs <= 7'b1111001;

4'h2: segs <= 7'b0100100;

4'h3: segs <= 7'b0110000;

4'h4: segs <= 7'b0011001;

4'h5: segs <= 7'b0010010;

4'h6: segs <= 7'b0000010;

4'h7: segs <= 7'b1111000;

4'h8: segs <= 7'b0000000;

4'ha: segs <= 7'b0001000;

4'hb: segs <= 7'b0000011;

4'hc: segs <= 7'b1000110;

default segs <= 7'b1111111;

endcase

end

end

else if(switch==1)

begin if(a==4'b1110)

case(temp[3:0])

4'd0: segs <= 7'b1000000;

4'd1: segs <= 7'b1111001;

4'd2: segs <= 7'b0100100;

4'd3: segs <= 7'b0110000;

4'd4: segs <= 7'b0011001;

4'd5: segs <= 7'b0010010;

4'd6: segs <= 7'b0000010;

4'd7: segs <= 7'b1111000;

4'd8: segs <= 7'b0000000;

4'd9: segs <= 7'b0010000;

default segs <= 7'b1111111;

endcase

else if(a==4'b1101)

case(temp[7:4])

4'd0: segs <= 7'b1000000;

4'd1: segs <= 7'b1111001;

4'd2: segs <= 7'b0100100;

4'd3: segs <= 7'b0110000;

4'd4: segs <= 7'b0011001;

4'd5: segs <= 7'b0010010;

4'd6: segs <= 7'b0000010;

4'd7: segs <= 7'b1111000;

4'd8: segs <= 7'b0000000;

4'd9: segs <= 7'b0010000;

default segs <= 7'b1111111;

endcase

else if(a==4'b1011)

case(temp[11:8])

4'd0: segs <= 7'b1000000;

4'd1: segs <= 7'b1111001;

4'd2: segs <= 7'b0100100;

4'd3: segs <= 7'b0110000;

4'd4: segs <= 7'b0011001;

4'd6: segs <= 7'b0000010;

4'd7: segs <= 7'b1111000;

4'd8: segs <= 7'b0000000;

4'd9: segs <= 7'b0010000;

default segs <= 7'b1111111;

endcase

else

case(temp[15:12])

4'd0: segs <= 7'b1000000;

4'd1: segs <= 7'b1111001;

4'd2: segs <= 7'b0100100;

4'd3: segs <= 7'b0110000;

4'd4: segs <= 7'b0011001;

4'd5: segs <= 7'b0010010;

default segs <= 7'b1111111;

endcase

end

endmodule

// counter10.v(0~9)

module counter10(en,ncr,clk,q);

input en,ncr,clk;

output [3:0] q;

reg [3:0] q;

always@(posedge clk )

begin

if(ncr) q<=4'd0;//ncr=0时,同步清零

else if(~en) q<=q;// EN=0,暂停计数

else if (q==4'b1001) q<=4'b0000;

else q<=q+1;//计数器加1

end

endmodule

// counter6.v(0~5)

module counter6(en,ncr,clk,q);

input en,ncr,clk;

output [3:0] q;

reg [3:0] q;

always@(posedge clk )

begin

if(ncr) q<=4'b0000;//NCR=0,同步清零else if(~en) q<=q;//EN=0,暂停计数

else if(q==4'b0101) q<=4'b0000;