基于BASYS 2 FPGA的0 — 99秒可设置倒计时器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CLK_IN为50MHZ时钟输入; PAUSE 计时暂停; RESET 计时重置; S1,S0为重置时设置的倒计时的高位和次高位的起始值; QA_OUT连接到数码管阳极; QC_OUT连接到八段数码管(含小数点)阴极;
图 1 RTL SCHEMATIC整体图
图 2 RTL SCHEMATIC细节图
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意思是把动态扫描显示时数码管阳、阴极协调起来) module coordination(QC_OUT,QA_OUT,Q1,Q2,Q3,Q4,CLK); input [7:0] Q1,Q2,Q3,Q4; input CLK; output [7:0] QC_OUT; output [3:0] QA_OUT; reg [1:0]cn; reg [7:0] QC_OUT; reg [3:0] QA_OUT; initial begin cn<=2'd0;end always@(posedge CLK) begin if(cn==2'd3) cn<=2'd0; else cn<=cn+2'd1; case(cn) 2'd0:begin QC_OUT<=Q1;QA_OUT<=4'b1110;end //数码管阳极端 为三极管输入低态有效 2'd1:begin QC_OUT<=Q2;QA_OUT<=4'b1101;end 2'd2:begin QC_OUT<=Q3;QA_OUT<=4'b1011;end 2'd3:begin QC_OUT<=Q4;QA_OUT<=4'b0111;end default :begin QC_OUT<=7'b1111111;QA_OUT<=4'b1111;end endcase end //通过case语句将数码管阳、阴极协调起来,保证 在某一时 //间点,4个数码管中只有一个能有效显示。 Endmodule
Baidu Nhomakorabea
source_counter_1 c1(Q1,Q2,Q3,Q4,CLK_OUT,RESET,PAUSE,S1,S0); display d1(Q1_OUT,Q1); display2 d2(Q2_OUT,Q2); display d3(Q3_OUT,Q3); display d4(Q4_OUT,Q4); coordination o1(QC_OUT,QA_OUT,Q1_OUT,Q2_OUT,Q3_OUT,Q4_OUT,CLK2_OUT); endmodule 2) 分模块具体程序 1、 分频模块frediv.v module frediv(CLK_OUT,CLK2_OUT,CLK_IN); output CLK_OUT,CLK2_OUT; input CLK_IN; //50MHZ输入 reg [18:0] cn; //19位计数器 wire CLK_OUT; wire CLK2_OUT; initial begin cn=0; end always @(posedge CLK_IN) begin if(cn==499999) begin cn<=0; end else cn<=cn+19'd1; end assign CLK_OUT=cn[18]; //输出100HZ,作为四位数码管赋值模块时 钟输入 assign CLK2_OUT=cn[15]; //输出800HZ,作为数码管扫描频率 endmodule 2、 对四位数码管赋值模块 source_counter_1.v module source_counter_1(Q1,Q2,Q3,Q4,CLK,RESET,PAUSE,S1,S0); input CLK,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;
姓名 班级 学号 实验日期 12-10 节次 9-10 教师签字 实验名称
成绩
基于BASYS 2 FPGA的0 — 99秒可设置倒计时器
1.实验目的
利用Xilinx BASYS 2开发板,实现0—99秒的可设置倒计时器。 1、实验板的八个开关,前四个控制十位,后四个控制个位,按照四位 二进制数所对应十进制数输出(大于等于9的均视为9)。 2、四位八段数码管用于显示时间,第一位对应十位,第二位对应个 位,后两位对应1秒的百分数。 3、两个按键,RESET为复位键,按键后,倒计时从当前开关状态重新 开始,PAUSE键为暂停,按住时倒计时暂停,松开后继续。
Ⅲ、用户约束文件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;
3.1:display.v module display(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 module display2(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;
Ⅱ、源程序 1) 主模块顶层程序top.v: module top(CLK_IN,RESET,PAUSE,S1,S0,QC_OUT,QA_OUT); input CLK_IN,RESET,PAUSE; input [3:0] S1,S0; output [7:0] QC_OUT; output [3:0] QA_OUT; wire CLK_OUT; wire CLK2_OUT; wire [3:0] Q1,Q2,Q3,Q4; wire [7:0] Q1_OUT,Q2_OUT,Q3_OUT,Q4_OUT; frediv f1(CLK_OUT,CLK2_OUT,CLK_IN);
2.总体设计方案或技术路线 分 频
计时时钟 100Hz 扫描时钟 800Hz FPGA 内部时钟
时钟模块
RESET 计时时钟 计数初值 四位十进制 减法计数器 开关状态 PAUSE
计时模块
显示码 译码电路 位选线 8段数码显示管 扫描时钟
显示模块
3.实验电路图
Ⅰ、总体RTL SCHEMATIC: 端口说明:
always @(posedge CLK ) 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) begin Q1<=N;Q2<=M;Q3<=4'd0;Q4<=4'd0;end //RESET 重置 else if(PAUSE==1) begin Q1<=Q1;Q2<=Q2;Q3<=Q3;Q4<=Q4; end //PAUSE 暂停 else if (Q4==0) begin Q4<=4'd9; if(Q3==0) begin Q3<=4'd9; if(Q2==0) begin Q2<=4'd9; if(Q1==0) begin Q1<=N;Q2<=M;Q3<=4'd0;Q4<=4'd0;end else Q1<=Q1-4'd1; end else Q2<=Q2-4'd1; end else Q3<=Q3-4'd1; end else Q4<=Q4-4'd1; //对四位数码管依次赋值,类似于递减1 的计数器 end Endmodule 3、 译码显示模块
相关文档
最新文档