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);endmodule2)分模块具体程序1、分频模块frediv.vmodulefrediv(CLK_OUT,CLK2_OUT,CLK_IN);outputCLK_OUT,CLK2_OUT;inputCLK_IN;//50MHZ输入reg[18:0]cn;//19位计数器wireCLK_OUT;wireCLK2_OUT;initialbegincn=0;endalways@(posedgeCLK_IN)beginif(cn==499999)begincn=0;endelsecn=cn+19'd1;endassignCLK_OUT=cn[18];//输出100HZ,作为四位数码管赋值模块时钟输入assignCLK2_OUT=cn[15];//输出800HZ,作为数码管扫描频率endmodule2、对四位数码管赋值模块source_counter_1.vmodulesource_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)begincase(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;endcasecase(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;endelseQ1=Q1-4'd1;endelseQ2=Q2-4'd1;endelseQ3=Q3-4'd1;endelseQ4=Q4-4'd1;//对四位数码管依次赋值,类似于递减1的计数器endEndmodule3、译码显示模块3.1:display.vmoduledisplay(Q_OUT,Q);input[3:0]Q;output[7:0]Q_OUT;reg[7:0]Q_OUT;always@(Q)begincase(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段码不点亮endcaseendEndmodule3.2:display2.vmoduledisplay2(Q_OUT,Q);input[3:0]Q;output[7:0]Q_OUT;reg[7:0]Q_OUT;always@(Q)begincase(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段码点亮,endcaseend其中,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;endalways@(posedgeCLK)beginif(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;end2'd2:beginQC_OUT=Q3;QA_OUT=4'b1011;end2'd3:beginQC_OUT=Q4;QA_OUT=4'b0111;enddefault:beginQC_OUT=7'b1111111;QA_OUT=4'b1111;endendcaseend//通过case语句将数码管阳、阴极协调起来,保证在某一时//间点,4个数码管中只有一个能有效显示。EndmoduleIII、用户约束文件top.ucfNETCLK_INLOC=B8;NETPAUSELOC=G12;NETQA_OUT[0]LOC=K14;NETQA_OUT[1]LOC=M13;NETQA_OUT[2]LOC=J12;NETQA_OUT[3]LOC=F12;NETQC_OUT[0]LOC=L14;NETQC_OUT[1]LOC=H12;NETQC_OUT[2]LOC=N14;NETQC_OUT[3]LOC=N11;NETQC_OUT[4]LOC=P12;NETQC_OUT[5]LOC=L13;NETQC_OUT[6]LOC=M12;NETRESETLOC=A7;NETCLK_INIOSTANDARD=LVCMOS33;NETPAUSEIOSTANDARD=LVCMOS33;NETQA_OUT[0]IOSTANDARD=LVCMOS33;NETQA_OUT[1]IOSTANDARD=LVCMOS33;NETQA_OUT[2]IOSTANDARD=LVCMOS33;NETQA_OUT[3]IOSTANDARD=LVCMOS33;NETQC_OUT[0]IOSTANDARD=LVCMOS33;NETQC_OUT[1]IOSTANDARD=LVCMOS33;NETQC_OUT[2]IOSTANDARD=LVCMOS33;NETQC_OUT[3]IOSTANDARD=LVCMOS33;NETQC_OUT[4]IOSTANDARD=LVCMOS33;NETQC_OUT[5]IOSTANDARD=LVCMOS33;NETQC_OUT[6]IOSTANDARD=LVCMOS33;NETRESETIOSTANDARD=LVCMOS33;NETS0[0]LOC=P11;NETS0[1]LOC=L3;NETS0[2]LOC=K3;NETS0[3]LOC=B4;NETS1[0]LOC=G3;NETS1[1]LOC=F3;NETS1[2]LOC=E2;NETS1[3]LOC=N3;NETS0[0]IOSTANDARD=LVCMOS33;NETS0[1]IOSTANDARD=LVCMOS33;NETS0[2]IOSTANDARD=LVCMOS33;NETS0[3]IOSTANDARD=LVCMOS33;NETS1[0]IOSTANDARD=LVCMOS33;NETS1[1]IOSTANDARD=LVCMOS33;NETS1[2]IOSTANDARD=LVCMOS33;NETS1[3]IOSTANDARD=LVCMOS33;#PlanAheadGeneratedphysicalconstraintsNETQC_OUT[7]LOC=N13;#PlanAheadGeneratedIOconstraintsNETQC_OUT[7]IOSTANDARD=LVCMOS33;IV、程序仿真测试文件test_top.vmoduletest_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;initialbeginCLK_IN=1'b0;#10;forever#(PERIOD/2)CLK_IN=~CLK_IN;endinitialbeginRES