关键词不能为空

当前您在: 主页 > 英语 >

基于Xilinx FPGA的数字钟设计

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2020-10-25 06:04
tags:hrl

猜英语怎么读-楚的拼音

2020年10月25日发(作者:席仲甫)


基于FPGA的多功能数字钟
一、设计题目
基于Xilinx FPGA的多功能数字钟设计
二、设计目的
1.掌握可编程逻辑器件的应用开发技术
——设计输入、编译、仿真和器件编程;
2.熟悉一种EDA软件使用;
3.掌握Verilog设计方法;
4.掌握分模块分层次的设计方法;
5.用Verilog完成一个多功能数字钟设计;
6.学会FPGA的仿真。

、设计内容
设计实验项目九 多功能电子钟
? 功能要求:
利用实验板设计实现一个能显示时分秒的多功能电子钟,具体要求为:
基本功能:
1) 准确计时,以数字形式显示时、分、秒,可通过按键选择指示当前显示时间范围模
式;
2) 计时时间范围 00:00:00-23:59:59
3) 可实现校正时间功能;
4) 可通过实现时钟复位功能:00:00:00
扩展功能:
1) 定时报:时间自定(不要求改变),闹1分钟(1kHz)---利用实验板LED或外接电路
实现。
2) 仿广播电台正点报时:XX:59:[51,53,55,57(500Hz);59(1kHz)] ---利用实验板LED
或外接电路实现。
3) 报整点时数:XX:00:[00.5-XX.5](1kHz),自动、手动--- 利用实验板LED或外接电
路实现。
4) 手动输入校时;
5) 手动输入定时闹钟;
6) 万年历;
7) 其他扩展功能;
? 设计步骤与要求:


1) 计算并说明采用Basys2实验板时钟50MHz实现系统功能的基本原理。
2) 在Xilinx ISE13.1 软件中,利用层次化方法,设计实现模一百计数及显示的电
路系统,设计模块间的连接 调用关系,编写并输入所设计的源程序文件。
3) 对源程序进行编译及仿真分析(注意合理设置,以便能够在验证逻辑的基础上尽快
得出仿真结果)。
4) 输入管脚约束文件,对设计项目进行编译与逻辑综合,生成下载所需.bit类型文
件。
5) 在Basys2实验板上下载所生成的.bit文件,观察验证所设计的电路功能。



总体设计思路
主体分为分频模块,正常时间模块(包含两个模60计 数器和一个模24计数器子模块),闹
钟模块(分为一个模60计数器模块,一个模24计数器模块,四 个比较器模块),电台报时
模块,数码管显示模块(分为模式选择模块,片选信号及扫描程序模块,和译 码模块)。将
各模块连接好各接线口即得到数字钟顶层模块。

、各模块设计及源代码
1.
分频模块

分频 模块要将50MHz的时钟信号分成三个分别为1Hz,500Hz,1kHz的三个脉冲信号,
设置三 个计数器,在三个频率信号分别对应的延时时间进行翻转,就可以得到三个不同的脉
冲信号。源代码如下 :
freq.v
module freq(clk,_1Hz,_500Hz,_1kHz);
input clk;
output _1Hz,_500Hz,_1kHz;
reg _1Hz=0,_500Hz=0,_1kHz=0;
reg [24:0] cnt1=0,cnt2=0,cnt3=0;

always @(posedge clk)
begin
if (cnt1<25'd24999999)
if (cnt1<25'd249)
做test仿真时让变化更快
cnt1<=cnt1+1;未达到计数时间计数器加一
else
begin
_1Hz<=~_1Hz;达到计时时间,信号翻转且计数器归零
cnt1<=0;


end
end

always @(posedge clk)
begin
if (cnt2<25'd49999)
if(cnt2<25'd49)
cnt2<=cnt2+1;
else
begin
_500Hz<=~_500Hz;
cnt2<=0;
end
end

always @(posedge clk)
begin
if (cnt3<25'd24999)
if (cnt3<25'd25)
cnt3<=cnt3+1;
else
begin
_1kHz<=~_1kHz;
cnt3<=0;
end
end

endmodule

2.时钟正常显示模块
正常显示模块分为时分秒三个子模块,分别对应一个模24计数器和两个模60计数器。
模2 4计数器和模60计数器设计都BCD码来表示时分秒的值,每个分为高位和低位,均对应
一个十进制的 数。对模24计数器,每个脉冲信号来临时当低位小于9时加一;等于9时高
位加一且低位置零;且高位 小于3,低位小于9,超过时高低位均置零;当高位等于2时,
低位只能到3,同时复位nCR低电平时 高低位均置零。同理可得模60计数器的设计。根据
这个思路,得到模24计数器源代码如下:
counter24.v
module counter24(CntH,CntL,nCR,EN,CP);
input nCR,EN,CP;
output [3:0] CntH,CntL;分别为高位和低位
reg [3:0] CntH,CntL;



always @(posedge CP or negedge nCR)
begin
if (~nCR) {CntH,CntL}<=8'h00;复位键清零
else if(~EN) {CntH,CntL}<={CntH,CntL};使能信号有效则暂停
else if((CntH>2)||(CntL>9)||((CntH==2)&&(CntL>=3)))
{CntH,CntL}<=8'b00;出现计数错误全部清零
else if((CntH==2)&&(CntL<3))
CntL<=CntL+1;超过20时计数方式
else if(CntL==9)
begin CntH<=CntH+1'b1;
CntL<=4'b0 一般情况下计数方式
end
else
CntL<=CntL+1'b1;
end


模60计数器代码如下:
counterM60.v
module counterM60(CntMH,CntML,nCR,EN,CP);
input CP,EN,nCR;
output [3:0] CntMH,CntML;
reg [3:0] CntMH=0,CntML=0;
always @(posedge CP or negedge nCR)
begin
if(~nCR)
{CntMH,CntML}<=8'b00;
else if (~EN)
{CntMH,CntML}<={CntMH,CntML};
else if(CntML>9||CntMH>5||(CntMH==5&&CntML==9))
begin
{CntMH,CntML}<=8'h00;
end
else if(CntMH<5&&CntML==9)
begin
CntMH<=CntMH+1'b1;
CntML<=4'b0;
end
else
CntML<=CntML+1'b1;
end

endmodule



而时钟计时就是调用两个模60计数器和一个 模24计数器,但相应的CP信号是需要修改的
使得秒的60计数一周期可以使分加一,同时分钟跑一个 周期能使得时针加一。同时按照设
计要求需要加入按键调时功能,将两个按键AdjHr和AdjMin 分别作为调时针和分针的按键,
按下时时针和分钟的脉冲信号变为1Hz脉冲,由此时针分钟会以1Hz 的频率改变而达到调时
间的目的。设置分钟和时钟的驱动信号分别为MinCP,HrCP,则可以设置
MinCP=AdjMin?_1Hz:(Second==8'h59); HrCP=AdjHr?_1Hz:({Minute,Second}==16'h5959);
源代码如下:
Top_clock.v
module top_clock(Ho ur,Minute,Second,_1Hz,nCR,AdjMin,AdjHr);
input _1Hz,nCR,AdjMin,AdjHr;
output [7:0] Hour,Minute,Second;分别为时分秒输出
wire [7:0] Hour,Minute,Second;
supply1 Vdd;设置使能
wire MinCP,HrCP;定义激励信号

counterM60 UT1(Second[7:4],Second[3:0],nCR,Vdd,_1Hz);
counterM60 UT2(Minute[7:4],Minute[3:0],nCR,Vdd,~MinCP);
counter24 UT3(Hour[7:4],Hour[3:0],nCR,Vdd,~HrCP);

assign MinCP=AdjMin?_1Hz:(Second==8'h59);分钟激励
assign HrCP=AdjHr?_1Hz:({Minute,Second}==16'h5959);时钟激励

endmodule


3.仿电台报时模块
设置ALARM为报时输出,Minute和Second分别为分钟信号和秒钟信号,先用if-el se语
句来进行Minute是否为59的判断,之后再用case语句在Second为51,53, 55,57时输出500Hz
的信号,在59时输出为1kHz的信号,在板子上没有输出声音的设备, 就接入LED来验证是
否正常报时。
radio.v
module radio(ALARM,Minute,Second,_1kHz,_500Hz);
input _1kHz,_500Hz;
input [7:0] Minute,Second;
output ALARM;
reg ALARM;
always @(Minute or Second)
if(Minute==8'h59)
case(Second)
8'h51,
8'h53,


8'h55,
8'h57:ALARM=_500Hz;500Hz方式输出,报时
8'h59:ALARM=_1kHz;59s以1kHz输出
default:ALARM=1'b0;一般不输出
endcase
else ALARM=1'b0;
endmodule


4.闹钟模块
闹钟模块分为设定闹钟(包含两个按键),闹钟正常响铃,一个关闭闹钟的按键CtrRing。< br>设定闹钟同样可以以1Hz脉冲为激励信号,其主体电路为一个以1Hz为激励信号的受
SetM inkey控制的模60计数器和一个受SetHrkey控制的模24计数器,调用之前已经写好的
模 块即可。同时响铃设置为ALARM_clock,受按键CtrRing控制。设置四个比较器,分别为
小时高位比较,小时低位比较,分钟高位比较和分钟低位比较。当四个比较信号都为1时才
会闹钟响铃 。
比较器的设计很简单直接给出源代码:
comparator.v
module comparator(EQU,A,B);
input [3:0] A,B;
output EQU;
assign EQU=(A==B);
endmodule
而闹钟主体源代码如下:
ring.v
module
ring(ALARM_clock,Set_Hr,Set_Min,Hou r,Minute,Second,SetHrkey,SetMinkey,_1kHz,_500Hz,_1 Hz,
CtrRing );
output ALARM_clock;
output [7:0] Set_Hr,Set_Min;输出的闹钟设定时间
wire ALARM_clock;
wire [7:0] Set_Hr,Set_Min;
input _1kHz,_500Hz,_1Hz;
input [7:0] Hour,Minute,Second;
input SetHrkey,SetMinkey,CtrRing;闹钟设定按键和关闭闹钟按键
supply1 Vdd;设置高电平
wire HrH_Cop,MinH_Cop,HrL_Cop,MinL_Cop;中间变量,为设定闹钟时间 和正常时间比较
wire time_EQU;

counterM60 SU1 (Set_Min[7:4],Set_Min[3:0],Vdd,SetMinkey,_1Hz);调用模 60计数器模块
counter24 SU2(Set_Hr[7:4],Set_Hr[3:0],Vdd,SetHrkey,_1Hz);


comparator SU4(HrH_Cop,Set_Hr[7:4],Hour[7:4]);调用比较器模块
comparator SU5(HrL_Cop,Set_Hr[3:0],Hour[3:0]);
comparator SU6(MinH_Cop,Set_Min[7:4],Minute[7:4]);
comparator SU7(MinL_Cop,Set_Min[3:0],Minute[3:0]);

assign time_EQU=(HrH_Cop&&HrL_Cop&&MinH_Cop&&M inL_Cop);时间比较信号
assign
ALARM_clock=CtrRing ?(time_EQU&&(((Second[0]==1'b1)&&_500Hz)||((Second [0]==1'b0)&&_1k
Hz))):1'b0;设置闹铃输出

endmodule

5.数码管显示模块
之前的模块设置了两个音频信 号输出ALARM和ALARM_clock,这里可以统一起来。数
码管既要显示闹钟设定时间,也要 显示时钟正常显示时间。设置一个按键mode来切换显示
模式,为0时显示正常时间,为1时显示闹钟 定时时间。设置LED_Hr和LED_Min为得到的
当前显示的时和分。还有由LED_Hr和LE D_Min到数码管的显示需要设计扫描程序,分为片
选和译码模块。分别贴出源代码如下:
模式选择模块:mode.v
module
mode(mode,Hour,Mi nute,Second,Set_Hr,Set_Min,LED_Hr,LED_Min,ALARM,AL ARM_clock,ALARM
out);
input mode,ALARM,ALARM_clock;
input [7:0] Hour,Minute,Second,Set_Hr,Set_Min;
output [7:0] LED_Hr,LED_Min;
output ALARMout;
wire ALARM,ALARM_clock;
wire [7:0] Set_Hr,Set_Min;

assign ALARMout=ALARM||ALARM_clock;时钟响铃,闹钟和电台报时均有效
assign LED_Hr=mode?Set_Hr:Hour;选择当前显示的小时
assign LED_Min=mode?Set_Min:Minute;选择当前显示的分

endmodule

之后是译码模块
在配置引脚时将小数点 DP配置为最高位,其余G,F,E,D,C,B,A按从高到低的顺序配置,
低电平段码管亮,由此可 以写出对应段码,源代码如下:
translate.v
module translate(Seg_in,Seg_outH,Seg_outL);
input[7:0] Seg_in;输入的数码
output [7:0] Seg_outH;翻译后的高位段码


output [7:0] Seg_outL;翻译后的低位段码
wire [7:0] Seg_outH,Seg_outL;
reg [7:0] Seg_outH1,Seg_outL1;

always @ (Seg_in[7:4])高位译码
case (Seg_in[7:4])
4'b0000 : Seg_outH1=8'b11000000;0的段码
4'b0001 : Seg_outH1=8'b11111001;1
4'b0010 : Seg_outH1=8'b10100100;2
4'b0011 : Seg_outH1=8'b10110000;3
4'b0100 : Seg_outH1=8'b10011001;4
4'b0101 : Seg_outH1=8'b10010010;5
4'b0110 : Seg_outH1=8'b10000010;6
4'b0111 : Seg_outH1=8'b11111000;7
4'b1000 : Seg_outH1=8'b10000000;8
4'b1001 : Seg_outH1=8'b10010000;9
default: Seg_outH1=8'b10100011;出错显示
endcase

always @ (Seg_in[3:0])低位译码
case (Seg_in[3:0])
4'b0000 : Seg_outL1=8'b11000000;
4'b0001 : Seg_outL1=8'b11111001;
4'b0010 : Seg_outL1=8'b10100100;
4'b0011 : Seg_outL1=8'b10110000;
4'b0100 : Seg_outL1=8'b10011001;
4'b0101 : Seg_outL1=8'b10010010;
4'b0110 : Seg_outL1=8'b10000010;
4'b0111 : Seg_outL1=8'b11111000;
4'b1000 : Seg_outL1=8'b10000000;
4'b1001 : Seg_outL1=8'b10010000;
default: Seg_outL1=8'b10100011;
endcase

assign Seg_outH=Seg_outH1;
assign Seg_outL=Seg_outL1;


endmodule

之后是数码管片选信号的设置和扫描程序,以500Hz为扫描频率。代码如下:
trans.v
module trans(_500Hz,LED_Hr,LED_Min,SGG,SELE);
input [7:0] LED_Hr,LED_Min;


input _500Hz;
output [7:0] SGG;
output [3:0] SELE;
wire [7:0] SGML,SGMH,SGHL,SGHH;经过翻译的段码
reg [1:0] count=2'b00;扫描的计数控制
wire [3:0] SELE;片选信号
wire [7:0] SGG;输入数码管的输出信号
reg [7:0] SG;数码管段码中间变量
reg [3:0] SEL=1110;片选中间变量

translate ST1(LED_Hr,SGHH,SGHL);
translate ST2(LED_Min,SGMH,SGML);

always @(posedge _500Hz)
case(count)
2'b00:
begin SG=SGML;选中第一个数码管
SEL=4'b1110;
count=count+1'b1;扫描信号不断加一,从而实现扫描
end
2'b01:begin SG=SGMH;选中第二个管
SEL=4'b1101;
count=count+1'b1;
end
2'b10:begin SG=SGHL;选中第三个管
SEL=4'b1011;
count=count+1'b1;
end
2'b11:begin SG=SGHH;选中第四个管
SEL=4'b0111;
count=count+1'b1;
end
endcase
assign SELE=SEL;设置片选信号
assign SGG=SG;设置数码管显示信号

endmodule


6、多功能数字钟顶层模块设计
采用图形设计方法,将以上已经写好的各模块都选择create schematic symbol 封装成各个器
件。名字设置为,在这个文件里将各个器件拖出来进行各引脚连线和标记输入


输出端口。由于图太小截图看不清楚,只能先给个大概如下:

其生成的vf文件如下:

module complete(XLXN_10,
XLXN_15,
XLXN_16,
XLXN_17,
XLXN_19,
XLXN_20,
XLXN_21,
XLXN_33,
XLXN_32,
XLXN_39,
XLXN_40);

input XLXN_10;
input XLXN_15;
input XLXN_16;
input XLXN_17;
input XLXN_19;


input XLXN_20;
input XLXN_21;
input XLXN_33;
output XLXN_32;
output [7:0] XLXN_39;
output [3:0] XLXN_40;

wire XLXN_4;
wire XLXN_5;
wire [7:0] XLXN_6;
wire [7:0] XLXN_7;
wire [7:0] XLXN_8;
wire XLXN_11;
wire [7:0] XLXN_13;
wire [7:0] XLXN_14;
wire XLXN_22;
wire XLXN_24;
wire [7:0] XLXN_37;
wire [7:0] XLXN_38;

freq XLXI_1 (.clk(XLXN_10),
._1Hz(XLXN_24),
._1kHz(XLXN_4),
._500Hz(XLXN_5));
radio XLXI_5 (.Minute(XLXN_7[7:0]),
.Second(XLXN_8[7:0]),
._1kHz(XLXN_4),
._500Hz(XLXN_5),
.ALARM(XLXN_11));
ring XLXI_6 (.CtrRing(XLXN_21),
.Hour(XLXN_6[7:0]),
.Minute(XLXN_7[7:0]),
.Second(XLXN_8[7:0]),
.SetHrkey(XLXN_19),
.SetMinkey(XLXN_20),
._1Hz(XLXN_24),
._1kHz(XLXN_4),
._500Hz(XLXN_5),
.ALARM_clock(XLXN_22),
.Set_Hr(XLXN_13[7:0]),
.Set_Min(XLXN_14[7:0]));
top_clock XLXI_7 (.AdjHr(XLXN_16),
.AdjMin(XLXN_15),
.nCR(XLXN_17),


._1Hz(XLXN_24),
.Hour(XLXN_6[7:0]),
.Minute(XLXN_7[7:0]),
.Second(XLXN_8[7:0]));
mode XLXI_8 (.ALARM(XLXN_11),
.ALARM_clock(XLXN_22),
.Hour(XLXN_6[7:0]),
.Minute(XLXN_7[7:0]),
.mode(XLXN_33),
.Second(XLXN_8[7:0]),
.Set_Hr(XLXN_13[7:0]),
.Set_Min(XLXN_14[7:0]),
.ALARMout(XLXN_32),
.LED_Hr(XLXN_37[7:0]),
.LED_Min(XLXN_38[7:0]));
trans XLXI_9 (.LED_Hr(XLXN_37[7:0]),
.LED_Min(XLXN_38[7:0]),
._500Hz(XLXN_5),
.SELE(XLXN_40[3:0]),
.SGG(XLXN_39[7:0]));
Endmodule
7.引脚配置
拨码开关SW0对应mode(高电平为闹钟时间,低电平为正常时间),SW1对应SetHrkey(高电平有效),SW2对应SeyMinkey(高电平有效),SW3对应CtrRing(高电平有效), SW5对
应AdjMin(高电平有效),SW6对应AdjHr(高电平有效),SW7对应nCR( 高电平有效)。
ALARM_out对应LED0。
得到的代码如下:
#Created by Constraints Editor (xc3s100e-cp132-4) - 20141203
NET
TIMESPEC TS_XLXN_10 = PERIOD
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET


NET
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET

六、各模块功能仿真
1.分频模块仿真
将testbench的cnt1,cnt2,cnt3分别改为249, 49,24以使得更快看到仿真结果得到结果如下:


可见三个信号按照设置的分频是功能正常的。
2.时钟模块仿真




从图中看出秒分都是跑到59之后再归零,跳变正常。而时是跑到23再归零的。功能正常。
3.数码管显示仿真



从图中看出,SELE按照预定方式 跳变,与译码表对照,可知相应段码是正确的。该模块功
能也是正常的。
4.闹钟模块仿真


从中看出当SetMinkey有效时Set_Min信号随着_1Hz在跳 变。是正确的。

5.电台报时模块仿真
为了更加方便地看出功能仿真结果,在testbench设置初始参数为 _1kHz=1'b1;
_500Hz=1'b1;Minute=8'h59;Second=8'h50;得到如下仿真波形图:

从上图看出,该模块在Minute=59,和Second=5153,55,59时会有 ALARM的高电平输出,即该
模块功能正常。

其余模块为均非时序性的子功能模 块(如模60计数器)在各自的顶层模块已经可以验证其
正确性,故此处不再单独仿真。
将这 些都做完后将程序在FPGA实验板中进行实际验证,通过了验收,实现了目标的功能,
可以设置闹钟, 电台报时以及正常的时间显示。


七、实验小结
在完成这个实验后我也 从对FPGA只有一点点常识进步到能够很清晰地明白一个程序的
完整设计流程了,在整个过程中是很累 的,一开始总是出各种错误,很多都不明白是什么意
思,只能一点点查找错误原因,但将错误解决后也对 verilog HDL程序理解加深了一层。在
不断调试过程中,我也比以前更加明白了错误该怎样检 查怎样排除。我现在觉得Xilinx ISE
这个软件做的不够好,在win8运行会有很多兼容性问 题,我们应该准备好一个win7环境(可
以用虚拟机)以便更好地运行程序。Verilog一个很方 便的地方是分模块设计可以很方便的
理清思路,检查错误,而且通过打包成器件,可以很直观地综合整个 设计。在整个过程中遇
到了很多小问题,很多报错都感觉不知所措,虽然最后都解决了,但很多错误的原 因还没有
非常明白,看来FPGA还应该更加深入地学习。

后张法-惟有


尽态极妍-aye


伟怎么读-影的成语


睇眄-乱七八糟的意思


德福考试-米用英语怎么说


韩语欧巴是什么意思-类似的英文


保管帐-ydy


天字的成语-臣怎么读



本文更新与2020-10-25 06:04,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/424781.html

基于Xilinx FPGA的数字钟设计的相关文章

  • 爱心与尊严的高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊严高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊重的作文题库

    1.作文关爱与尊重议论文 如果说没有爱就没有教育的话,那么离开了尊重同样也谈不上教育。 因为每一位孩子都渴望得到他人的尊重,尤其是教师的尊重。可是在现实生活中,不时会有

    小学作文
  • 爱心责任100字作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任心的作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文