专用集成电路设计大作业多功能时钟设计.docx
- 文档编号:5947860
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:31
- 大小:2.09MB
专用集成电路设计大作业多功能时钟设计.docx
《专用集成电路设计大作业多功能时钟设计.docx》由会员分享,可在线阅读,更多相关《专用集成电路设计大作业多功能时钟设计.docx(31页珍藏版)》请在冰豆网上搜索。
专用集成电路设计大作业多功能时钟设计
基于FPGA的多功能时钟
设计报告
专业:
空间信息与数字技术
班级:
学号:
姓名:
通信工程学院
2013年11月
目录
摘要................................................................................3
设计内容及要求…………………………………………………………..3
设计(代码)分析……………………………………………………….4
实验过程及步骤…………………………………………….................5
实验结果的测试及仿真…………………………………………………13
实验总结与感想……………………………………………………………16
参考文献……………………………………………………………………..17
附录(原代码)………………………………………….17
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]second0cnt[7:
4]second1
Cnt[11:
8]minute0cnt[15:
12]minute1
Cnt[19:
16]hour0cnt[23:
20]hour1
校时部分:
设计为信号选择器ad=1时为计时模式,信号为校时信号
ad=0时为正常计时模式
数据显示部分:
设有切换switch端
数码管扫描自动扫描1KHZ
4*8=32位寄存器
Temp[31:
0]
分为校时模式显示ad=1set=0swo=0------------cnt
闹钟设置模式显示ad=0set=1swo=0------------cnt1
秒表计时模式显示ad=0set=0swo=1------------cnt2
正常走时模式显示其余----------------------------------cnt
●底层部分
计数器counter10.vcounter6.vcounter3.v
//counter10.v(0~9)
modulecounter10(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时,异步清零
elseif(~en)q<=q;//EN=0,暂停计数
elseif(q==4'b1001)q<=4'b0000;
elseq<=q+1;//计数器加1
end
endmodule
闹钟设定模块bell.vcnt1代码见附录
仿电台报时radio.v代码见附录
秒表stopwatch.vcnt2代码见附录
4实验内容及步骤
(1)创建工程命名为top_clock
(2)选择BASYS2型号并完成创建
(3)新建verilogmodule文件命名为top
(3)添加完整代码
完整代码见附录
(4)检查语法直至通过
双击Synthesize—XST
(5)创建时钟信号约束即CLK
(6)创建管脚约束双击
管脚设置为
管脚分布
a[0]-a[3]---------K14F12J12M13数码管扫描信号
adj[0]—adj[3]--G12C11M4A7校时及闹钟设定及秒表按钮
led[0]-----led[7]--M5M11P7P6N5N4P4G1led灯
segs[0]---segs[6]-L14H12N14N11P12L13M12数码管
rcrlF3仿电台播报开关
scrl--B4秒表显示切换开关
bcrlN3闹铃开关
setE2闹钟设定按钮
adG3校时按钮
switchP11显示切换按钮
swoK3秒表开关
swpL3秒表暂停开关
CLKB8时钟信号50MHz
(7)逻辑综合
(8)下载到BASYS2板上
打开bit文件下载到板子上
在板子上试验
1。
正常走时模式
Switch=1时显示分分:
秒秒
Switch=0时显示时时:
分分
2。
手动校时模式ad=1set=0swo=0
3,闹钟设定和开关模式
(brcl)N3->闹铃(led灯)开关闹铃响时M11M5亮灯以10MHZ闪烁
闹铃设定ad=0set=1swo=0
设置方法和校时方法共用键(A7M4C11G12)
方法相同
4,秒表模式ad=0set=0swo=1
(swp)暂停键低电平有效
A7清零键(包括数据清零)
M4记录数据键每按一次记录一个时间数据(59分59秒99以内)
可记录10组数据并可显示当前数据的序号
Switch=0时[][][][]
^^^^
显示C数据序号分分
Switch=1时[][][][]
^^^^
秒秒0.1秒0.01秒
(5)实验结果的测试和仿真
仿真波形如下:
Counter10
Counter6
Counter3
Bell
Radio
实验结果及说明:
(1)正常走时模式
Switch=1时显示分分:
秒秒
Switch=0时显示时时:
分分;
(2)手动校时模式ad=1set=0swo=0
使ad=1,每按一下[][][][]switch=1,每按一下循环加一(分分秒秒)
A7M4C11G12
[][][][]A7M4C11G12
switch=0,每按一下循环加一(时时分分)
A7M4C11G12
例如设定为20:
12:
08
(3)闹钟设定和开关模式
(brcl)N3->闹铃(led灯)开关闹铃响时M11M5亮灯以10MHZ闪烁
闹铃设定ad=0set=1swo=0
设置方法和校时方法共用键(A7M4C11G12)
方法相同
(4)秒表模式ad=0set=0swo=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】《Veriloghdl与数字asic设计基础》8.4和8.5(罗杰主编)
(8)附录(源代码)
moduletop(set,ad,swo,swp,switch,bcrl,rcrl,scrl,,clk,adj,segs,a,led
);
inputad,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;//shumaguan
reg[31:
0]temp;
wire[23:
0]cnt;//走时模式和校时模式临时变量
wire[23:
0]cnt1;//闹钟模式临时变量
wire[31:
0]cnt2;//秒表模式临时变量
//使能信号
initialbegin
a=4'b1110;
end//chushihua
wireeno,enp1,enp2,enp3,enp4,enp5;
in50MHz_out1Hzu0(clk,cp1);//输出频率1HZ
in50MHz_out1kHzu7(clk,cp2);//输出频率1kHZ扫描信号
in50MHz_out10Hzu8(clk,cp3);//输出频率10HZ
in50MHz_out100Hzu12(clk,cp4);//100Hz
counter10u1(en0,0,cp,cnt[3:
0]);//second个位计数
counter6u2(enp1,0,cp,cnt[7:
4]);//second十位计数
counter10u3(enp2,0,cp,cnt[11:
8]);//minutes个位计数
counter6u4(enp3,0,cp,cnt[15:
12]);//minutes十位计数
counter10u5(enp4,0,cp,cnt[19:
16]);//hours个位计数
counter3u6(enp5,0,cp,cnt[23:
20]);//hours十位计数
bellu9(switch,set,bcrl,adj,cp3,cnt,cnt1,led[1:
0]);//闹钟模块
radiou10(rcrl,cnt[15:
0],cp1,cp3,led[7:
3]);//仿真报时模块
stopwatchu11(swo,scrl,swp,adj,cp4,cp3,cnt2);//秒表模块
assigncp=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@(adorsetorswo)//显示模式选择
if((~ad)&set&(~swo))begintemp[15:
0]<=cnt1[15:
0];temp[31:
16]<=cnt1[23:
8];end
elseif((~ad)&(~set)&swo)temp<=cnt2;
elsebegintemp[15:
0]<=cnt;temp[31:
16]<=cnt[23:
8];end
always@(posedgecp2)//扫描信号循环变化
if(a==4'b1110)a<=4'b1101;//J12
elseif(a==4'b1101)a<=4'b1011;//M13
elseif(a==4'b1011)a<=4'b0111;//k14
elsea<=4'b1110;//F12
always@(posedgecp2)//数码管显示译码
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;
defaultsegs<=7'b1111111;
endcase
end
elseif(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;
defaultsegs<=7'b1111111;
endcase
end
elseif(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;
defaultsegs<=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'h9:
segs<=7'b0010000;
4'ha:
segs<=7'b0001000;
4'hb:
segs<=7'b0000011;
4'hc:
segs<=7'b1000110;
defaultsegs<=7'b1111111;
endcase
end
end
elseif(switch==1)
beginif(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;
defaultsegs<=7'b1111111;
endcase
elseif(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;
defaultsegs<=7'b1111111;
endcase
elseif(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'd5:
segs<=7'b0010010;
4'd6:
segs<=7'b0000010;
4'd7:
segs<=7'b1111000;
4'd8:
segs<=7'b0000000;
4'd9:
segs<=7'b0010000;
defaultsegs<=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;
defaultsegs<=7'b1111111;
endcase
end
endmodule
//counter10.v(0~9)
modulecounter10(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时,同步清零
elseif(~en)q<=q;//EN=0,暂停计数
elseif(q==4'b1001)q<=4'b0000;
elseq<=q+1;//计数器加1
end
endmodule
//counter6.v(0~5)
modulecounter6(en,ncr,clk,q);
inputen,ncr,clk;
output[3:
0]q;
reg[3:
0]q;
always@(posedgeclk)
begin
if(ncr)q<=4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 专用 集成电路设计 作业 多功能 时钟 设计