百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx

上传人:b****6 文档编号:8440772 上传时间:2023-01-31 格式:DOCX 页数:12 大小:211.86KB
下载 相关 举报
百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx_第1页
第1页 / 共12页
百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx_第2页
第2页 / 共12页
百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx_第3页
第3页 / 共12页
百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx_第4页
第4页 / 共12页
百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx

《百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx》由会员分享,可在线阅读,更多相关《百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx(12页珍藏版)》请在冰豆网上搜索。

百秒内任意设置倒计时秒表Verilog编程basys2开发板.docx

百秒内任意设置倒计时秒表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仿真波形

各个信号仿真波形正常。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1