姓名班级学号实验日期节次教师签字成绩基于BASYS2开发板的记忆秒表设计一、实验目的1、熟悉基于Verilog HDL语言输入方式的数字电路的设计方法。
2、掌握基于FPGA的设计流程。
3、熟悉BASYS2开发板的使用方法。
4、熟悉Xilinx ISE软件的使用方法。
5、培养自己独立自主设计并完成实验的能力。
二、总体设计方案或技术路线本实验利用BASYS2开发板的已有资源来进行设计实验,并用Xilinx ISE软件来编写和综合Verilog代码。
总体设计方案是设计一个带有记忆功能的秒表。
具体而言,该秒表通过BASYS2开发板的50M的时钟进行分频计时,最大计时时间为99.99s,用4位数码管动态显示计时时间,除了有基本的运行、暂停及复位清空功能,还有存储当前时间和查看存储时间的功能。
三、实验电路图BASYS2开发板原理图--数码管板上数码管为4位共阳极数码管,每段为低电平点亮,位选接了三极管增大驱动电流,同时为非逻辑,所以位选信号为低电平有效。
BASYS2开发板原理图--按键本实验用到了两个按键BTN0和BTN1,BTN0为复位按键,对应程序的clear信号,BTN1为存储按键,对应程序的btn[1]信号,按一次该按键数据存储一次,下一次按下时这一次存的数据将被替换掉。
BASYS2开发板原理图--开关本实验用到了两个开关SW7和SW1,SW7为运行、暂停开关,对应程序的sw[0]信号,开关打到上方为运行,下方为暂停,SW1为显示切换开关,对应程序的sw[1]信号,在计时暂停的前提下,将开关打到上方显示出存储的时间数据。
四、仪器设备名称、型号和技术指标硬件:BASYS2开发板软件:Xilinx ISE(编程)、Digilent Adept(下载)五、程序流程图六、程序源代码/////////////////////////////////////////////////////////程序文件`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 15:45:01 11/26/2014// Design Name:// Module Name: miaobiao// Project Name:// Target Devices:// Tool versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://///////////////////////////////////////////////////////////秒表的顶层模块module miaobiao(input wire clk,///////////////////////////////开发板系统时钟50MHzinput wire[1:0] btn,////////////////////////两个按键:[0]复位和[1]存时间input wire[1:0] sw,/////////////////////////两个开关:[0]运行/暂停和[1]显示存储时间output wire[7:0] smg,/////////////////////数码管的8个段选信号output wire[3:0] smg_an/////////////////数码管的4个位选信号);wire clear;assign clear=btn[0];////////////////////////////////////将复位按键信号传给clear变量wire clk_1k;clkdiv #(50000) m0(clk,clear,clk_1k);//将50MHz进行5万分频输出1kHz时钟信号wire[15:0]number;timer m1(sw[0]&clk_1k,clear,number);///////////计时器模块,输出当前时间数据wire[15:0]num_save;save m2(clk,clear,btn[1],number,num_save);//////按键按下存储当前时间wire[15:0]num_display;/////////////////////////////////////////////////////////////////////////////根据开关状态选择显示内容choose_4num m3(sw,number,num_save,num_display);display m4(clk_1k,clear,num_display,smg,smg_an);///////将数字送给数码管显示endmodule///////////////////////////////////////////////////////////////////////////////4选1数据选择器模块module choose_4num(input wire[1:0]sw,input wire[15:0]number,input wire[15:0]num_save,output reg[15:0]num_display);always@(*)case(sw)0:num_display<=number;/////////////显示内容为当前时间1:num_display<=number;/////////////。
当前时间2:num_display<=num_save;/////////显示内容为存储时间3:num_display<=number;/////////////。
当前时间default:num_display<=number;endcaseendmodule//////////////////////////////////////////////////////////////////////////////////存储时间模块module save(input wire clk_save,input wire clear,input wire button,input wire[15:0]number,output reg[15:0]num_save);always@(posedge clk_save)beginif(1==clear)num_save<=0;else if(1==button)num_save<=number;elsenum_save<=num_save;endendmodule//////////////////////////////////////////////////////////////////////////////////////计时器模块module timer(input wire clk_timer,input wire clear,output reg[15:0] number);reg[3:0] reg_1ms;always@(posedge clk_timer,posedge clear)beginif(1==clear)beginnumber<=0;reg_1ms<=0;endelsebeginreg_1ms<=reg_1ms+1;if(reg_1ms>=9)///////////////1ms的计数变量到10清零,同时10ms变量加一beginreg_1ms<=0;number[3:0]<=number[3:0]+1;if(number[3:0]>=9)////10ms变量到10清零,100ms加一beginnumber[3:0]<=0;number[7:4]<=number[7:4]+1;if(number[7:4]>=9)////100ms变量到10清零,1s加一beginnumber[7:4]<=0;number[11:8]<=number[11:8]+1;if(number[11:8]>=9)/////1s到10清零,10s加一beginnumber[11:8]<=0;number[15:12]<=number[15:12]+1;if(number[15:12]>=9)////10s变量到10清零number[15:12]<=0;///综上,计时到99.99s后清零endendendendendendendmodule/////////////////////////////////////////////////////////////////////////////////////动态扫描显示数字模块module display(input wire clk_dis,input wire clear,input wire[15:0] number,output wire[7:0] smg,output wire[3:0] smg_an);reg[1:0] counter;reg[3:0] reg_num;wire dp;always@(posedge clk_dis,posedge clear)beginif(1==clear)begincounter<=0;endelsecounter<=counter+1;endalways@(*)begincase(counter)0:reg_num<=number[3:0];////////将10ms 变量送到数码管第0位显示1:reg_num<=number[7:4];////////将100ms 变量送到数码管第1位显示2:reg_num<=number[11:8];//////将1s 变量送到数码管第2位显示3:reg_num<=number[15:12];////将10s 变量送到数码管第3位显示default:reg_num<=0;endcaseendassign dp=(2==counter);//////////////////第2位数码管的小数点点亮,其余小数点熄灭num2smg m0(counter,reg_num,dp,smg_an,smg);endmodule//////////////////////////////////////////////////////////////////////////////////////时钟分频模块module clkdiv#(parameter div=50000)///////默认5万分频(input wire clk,input wire clear,output reg new_clk);reg[31:0] counter;always@(posedge clk,posedge clear)beginif(1==clear)begincounter<=0;new_clk<=0;endelse if(counter>=div/2-1)begincounter<=0;new_clk<=~new_clk;//二分频endelsecounter<=counter+1;endendmodule///////////////////////////////////////////////////////////////////////////数字转换成数码管段、位码模块module num2smg(// input wire clk_smg,input wire[1:0] which,input wire[3:0] num,input wire dp,//dp=1时,点亮小数点output reg[3:0] smg_an,output wire[7:0] smg);always@(*)case(which)/////////////////////////////////////////数码管位选子模块3:smg_an<=4'b0111;2:smg_an<=4'b1011;1:smg_an<=4'b1101;0:smg_an<=4'b1110;default:smg_an<=4'b1111;endcasereg[7:0] r_smg;always@(*)//////////////////////////////////////////////数码管段选子模块begincase(num)0:r_smg<=8'hc0;1:r_smg<=8'hf9;2:r_smg<=8'ha4;3:r_smg<=8'hb0;4:r_smg<=8'h99;5:r_smg<=8'h92;6:r_smg<=8'h82;7:r_smg<=8'hf8;8:r_smg<=8'h80;9:r_smg<=8'h90;10:r_smg<=8'h88;11:r_smg<=8'h83;12:r_smg<=8'hc6;13:r_smg<=8'ha1;14:r_smg<=8'h86;15:r_smg<=8'h8e;default:r_smg<=8'hff;endcaseendassign smg=r_smg-128*dp;////////////////////////////////////判断是否显示小数点endmodule////////////////////////////////////////////////////////////////////////////程序结束END//////////////////////////////////引脚约束文件////////////////////////////////////////////////////时钟约束NET"clk"TNM_NET=clk;TIMESPEC TS_CLK=PERIOD"clk"20ns high 50%;NET"clk"LOC="B8";//////////////////////////////////////////////////////////数码管NET"smg<7>"LOC="N13";NET"smg<6>"LOC="M12";NET"smg<5>"LOC="L13";NET"smg<4>"LOC="P12";NET"smg<3>"LOC="N11";NET"smg<2>"LOC="N14";NET"smg<1>"LOC="H12";NET"smg<0>"LOC="L14";NET"smg_an<3>"LOC="K14";NET"smg_an<2>"LOC="M13";NET"smg_an<1>"LOC="J12";NET"smg_an<0>"LOC="F12";//////////////////////////////////////////////////////按键//NET"btn<3>"LOC="A7";//NET"btn<2>"LOC="M4";NET"btn<1>"LOC="C11";NET"btn<0>"LOC="G12";////////////////////////////////////////////////////开关NET"sw<1>"LOC="L3";NET"sw<0>"LOC="N3";七、实验结果最后,成功地编写出程序,调试通过,完成所有功能,整个设计达到预期目标:最大计时时间为99.99s,用4位数码管动态显示计时时间,除了有基本的运行、暂停及复位清空功能,还有存储当前时间和查看存储时间的功能。