百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx
《百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx》由会员分享,可在线阅读,更多相关《百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx(12页珍藏版)》请在冰豆网上搜索。
百秒内任意设置倒计时秒表Verilog编程basys2开发板
百秒内任意设置倒计时秒表-Verilog编程-basys2开发板
DDPP课程设计
0~99秒可设置倒计时器的简单设计与实现
本设计基于XilinxISEDesignSuite13.2软件开发平台和其综合工具进行0~99秒可设置倒计时器数字电路的功能设计,在FPGABSSYS2开发板上来完成设计的测试和实现。
I、总体RTLSCHEMATIC:
端口说明:
CLK_IN为50MHZ时钟输入;
PAUSE计时暂停;
RESET计时重置;
S1,S0为重置时设置的倒计时的高位和次高位的起始值;
QA_OUT连接到数码管阳极;
QC_OUT连接到八段数码管(含小数点)阴极;
图1RTLSCHEMATIC整体图
图2RTLSCHEMATIC细节图
II、源程序
1)主模块顶层程序top.v:
moduletop(CLK_IN,RESET,PAUSE,S1,S0,QC_OUT,QA_OUT);
inputCLK_IN,RESET,PAUSE;
input[3:
0]S1,S0;
output[7:
0]QC_OUT;
output[3:
0]QA_OUT;
wireCLK_OUT;
wireCLK2_OUT;
wire[3:
0]Q1,Q2,Q3,Q4;
wire[7:
0]Q1_OUT,Q2_OUT,Q3_OUT,Q4_OUT;
fredivf1(CLK_OUT,CLK2_OUT,CLK_IN);
source_counter_1c1(Q1,Q2,Q3,Q4,CLK_OUT,RESET,PAUSE,S1,S0);
displayd1(Q1_OUT,Q1);
display2d2(Q2_OUT,Q2);
displayd3(Q3_OUT,Q3);
displayd4(Q4_OUT,Q4);
coordinationo1(QC_OUT,QA_OUT,Q1_OUT,Q2_OUT,Q3_OUT,Q4_OUT,CLK2_OUT);
endmodule
2)分模块具体程序
1、分频模块frediv.v
modulefrediv(CLK_OUT,CLK2_OUT,CLK_IN);
outputCLK_OUT,CLK2_OUT;
inputCLK_IN;//50MHZ输入
reg[18:
0]cn;//19位计数器
wireCLK_OUT;
wireCLK2_OUT;
initial
begin
cn=0;
end
always@(posedgeCLK_IN)
begin
if(cn==499999)
begincn<=0;end
elsecn<=cn+19'd1;
end
assignCLK_OUT=cn[18];//输出100HZ,作为四位数码管赋值模块时钟输入
assignCLK2_OUT=cn[15];//输出800HZ,作为数码管扫描频率
endmodule
2、对四位数码管赋值模块source_counter_1.v
modulesource_counter_1(Q1,Q2,Q3,Q4,CLK,RESET,PAUSE,S1,S0);
inputCLK,RESET,PAUSE;
input[3:
0]S1,S0;
output[3:
0]Q1,Q2,Q3,Q4;
reg[3:
0]Q1,Q2,Q3,Q4;
reg[3:
0]N,M;
always@(posedgeCLK)
begin
case(S1)
4'd0:
N=4'd0;4'd1:
N=4'd1;4'd2:
N=4'd2;4'd3:
N=4'd3;4'd4:
N=4'd4;
4'd5:
N=4'd5;4'd6:
N=4'd6;4'd7:
N=4'd7;4'd8:
N=4'd8;4'd9:
N=4'd9;
default:
N=4'd9;
endcase
case(S0)
4'd0:
M=4'd0;4'd1:
M=4'd1;4'd2:
M=4'd2;4'd3:
M=4'd3;4'd4:
M=4'd4;
4'd5:
M=4'd5;4'd6:
M=4'd6;4'd7:
M=4'd7;4'd8:
M=4'd8;4'd9:
M=4'd9;
default:
M=4'd9;
endcase//高位和次高位的起始值预置
if(RESET==1)beginQ1<=N;Q2<=M;Q3<=4'd0;Q4<=4'd0;end//RESET重置
elseif(PAUSE==1)beginQ1<=Q1;Q2<=Q2;Q3<=Q3;Q4<=Q4;end//PAUSE暂停
elseif(Q4==0)
beginQ4<=4'd9;
if(Q3==0)
beginQ3<=4'd9;
if(Q2==0)
beginQ2<=4'd9;
if(Q1==0)
beginQ1<=N;Q2<=M;Q3<=4'd0;Q4<=4'd0;end
elseQ1<=Q1-4'd1;
end
elseQ2<=Q2-4'd1;
end
elseQ3<=Q3-4'd1;
end
elseQ4<=Q4-4'd1;//对四位数码管依次赋值,类似于递减1的计数器
end
Endmodule
3、译码显示模块
3.1:
display.v
moduledisplay(Q_OUT,Q);
input[3:
0]Q;
output[7:
0]Q_OUT;
reg[7:
0]Q_OUT;
always@(Q)
begin
case(Q)
4'd0:
Q_OUT<=8'b11000000;//共阳极数码管
4'd1:
Q_OUT<=8'b11111001;
4'd2:
Q_OUT<=8'b10100100;
4'd3:
Q_OUT<=8'b10110000;
4'd4:
Q_OUT<=8'b10011001;
4'd5:
Q_OUT<=8'b10010010;
4'd6:
Q_OUT<=8'b10000010;
4'd7:
Q_OUT<=8'b11111000;
4'd8:
Q_OUT<=8'b10000000;
4'd9:
Q_OUT<=8'b10010000;
default:
Q_OUT<=8'b11111111;//数码管的小数点DP段码不点亮
endcase
end
Endmodule
3.2:
display2.v
moduledisplay2(Q_OUT,Q);
input[3:
0]Q;
output[7:
0]Q_OUT;
reg[7:
0]Q_OUT;
always@(Q)
begin
case(Q)
4'd0:
Q_OUT<=8'b01000000;
4'd1:
Q_OUT<=8'b01111001;
4'd2:
Q_OUT<=8'b00100100;
4'd3:
Q_OUT<=8'b00110000;
4'd4:
Q_OUT<=8'b00011001;
4'd5:
Q_OUT<=8'b00010010;
4'd6:
Q_OUT<=8'b00000010;
4'd7:
Q_OUT<=8'b01111000;
4'd8:
Q_OUT<=8'b00000000;
4'd9:
Q_OUT<=8'b00010000;
default:
Q_OUT<=8'b01111111;//数码管的小数点DP段码点亮,
endcase
end
其中,3.1和3.2的区别在于数码管的小数点DP段码的点亮与否,在top模块的调用时保证其整体上显示为Q1Q2.Q3Q4形式,即只有Q2通过display2来译码,其他三个通过
Display来译码。
4、数码管动态扫描显示模块coordination.v
(此处coordination意思是把动态扫描显示时数码管阳、阴极协调起来)
modulecoordination(QC_OUT,QA_OUT,Q1,Q2,Q3,Q4,CLK);
input[7:
0]Q1,Q2,Q3,Q4;
inputCLK;
output[7:
0]QC_OUT;
output[3:
0]QA_OUT;
reg[1:
0]cn;
reg[7:
0]QC_OUT;
reg[3:
0]QA_OUT;
initialbegincn<=2'd0;end
always@(posedgeCLK)
begin
if(cn==2'd3)cn<=2'd0;
elsecn<=cn+2'd1;
case(cn)
2'd0:
beginQC_OUT<=Q1;QA_OUT<=4'b1110;end//数码管阳极端为三极管输入低态有效
2'd1:
beginQC_OUT<=Q2;QA_OUT<=4'b1101;end
2'd2:
beginQC_OUT<=Q3;QA_OUT<=4'b1011;end
2'd3:
beginQC_OUT<=Q4;QA_OUT<=4'b0111;end
default:
beginQC_OUT<=7'b1111111;QA_OUT<=4'b1111;end
endcase
end//通过case语句将数码管阳、阴极协调起来,保证在某一时//间点,4个数码管中只有一个能有效显示。
Endmodule
III、用户约束文件top.ucf
NET"CLK_IN"LOC=B8;
NET"PAUSE"LOC=G12;
NET"QA_OUT[0]"LOC=K14;
NET"QA_OUT[1]"LOC=M13;
NET"QA_OUT[2]"LOC=J12;
NET"QA_OUT[3]"LOC=F12;
NET"QC_OUT[0]"LOC=L14;
NET"QC_OUT[1]"LOC=H12;
NET"QC_OUT[2]"LOC=N14;
NET"QC_OUT[3]"LOC=N11;
NET"QC_OUT[4]"LOC=P12;
NET"QC_OUT[5]"LOC=L13;
NET"QC_OUT[6]"LOC=M12;
NET"RESET"LOC=A7;
NET"CLK_IN"IOSTANDARD=LVCMOS33;
NET"PAUSE"IOSTANDARD=LVCMOS33;
NET"QA_OUT[0]"IOSTANDARD=LVCMOS33;
NET"QA_OUT[1]"IOSTANDARD=LVCMOS33;
NET"QA_OUT[2]"IOSTANDARD=LVCMOS33;
NET"QA_OUT[3]"IOSTANDARD=LVCMOS33;
NET"QC_OUT[0]"IOSTANDARD=LVCMOS33;
NET"QC_OUT[1]"IOSTANDARD=LVCMOS33;
NET"QC_OUT[2]"IOSTANDARD=LVCMOS33;
NET"QC_OUT[3]"IOSTANDARD=LVCMOS33;
NET"QC_OUT[4]"IOSTANDARD=LVCMOS33;
NET"QC_OUT[5]"IOSTANDARD=LVCMOS33;
NET"QC_OUT[6]"IOSTANDARD=LVCMOS33;
NET"RESET"IOSTANDARD=LVCMOS33;
NET"S0[0]"LOC=P11;
NET"S0[1]"LOC=L3;
NET"S0[2]"LOC=K3;
NET"S0[3]"LOC=B4;
NET"S1[0]"LOC=G3;
NET"S1[1]"LOC=F3;
NET"S1[2]"LOC=E2;
NET"S1[3]"LOC=N3;
NET"S0[0]"IOSTANDARD=LVCMOS33;
NET"S0[1]"IOSTANDARD=LVCMOS33;
NET"S0[2]"IOSTANDARD=LVCMOS33;
NET"S0[3]"IOSTANDARD=LVCMOS33;
NET"S1[0]"IOSTANDARD=LVCMOS33;
NET"S1[1]"IOSTANDARD=LVCMOS33;
NET"S1[2]"IOSTANDARD=LVCMOS33;
NET"S1[3]"IOSTANDARD=LVCMOS33;
#PlanAheadGeneratedphysicalconstraints
NET"QC_OUT[7]"LOC=N13;
#PlanAheadGeneratedIOconstraints
NET"QC_OUT[7]"IOSTANDARD=LVCMOS33;
IV、程序仿真
测试文件test_top.v
moduletest_top;
regCLK_IN;
regRESET;
regPAUSE;
reg[3:
0]S1;
reg[3:
0]S0;
wire[7:
0]QC_OUT;
wire[3:
0]QA_OUT;
topuut(
.CLK_IN(CLK_IN),
.RESET(RESET),
.PAUSE(PAUSE),
.S1(S1),
.S0(S0),
.QC_OUT(QC_OUT),
.QA_OUT(QA_OUT)
);
parameterPERIOD=20;
initialbegin
CLK_IN=1'b0;
#10;
forever
#(PERIOD/2)CLK_IN=~CLK_IN;
end
initial
begin
RESET=0;
PAUSE=0;
S1=4'd0;
S0=4'd0;
#100;
S1=4'd2;
S0=4'd4;
#100;
S1=4'd4;
S0=4'd2;
#100;
RESET=1;
#100;
RESET=0;
#100;
PAUSE=1;
#100;
PAUSE=0;
end
endmodule
仿真波形如图三。
图3仿真波形
各个信号仿真波形正常。