按键驱动LED地实验课设资料.doc
word设计一:按键驱动LED的实验一、 设计目的学会用Verilog语言编写所需要的程序,会对自己编写的程序进展编译和仿真,懂得根据仿真软件提示的错误进展修改,也需要对通过仿真改正功能的错误。并学会检测按键和控制LED的输出。本实验是通过FPGA检测I/O口上的按键信号,通过时序控制两个LED灯以流水灯的方式各亮灭六次。最后灯保持灭的状态。二、 设计原理该实验的主要问题是FPGA如何捕获到按键是否按下。当按键按下时,输入电平会由高变低,按键松开后,输入电平会由低变高,这就有一个上升沿和一个下降沿。捕获到这两个沿。就可以确认按键按下。检测到按键按下时,开始实现设计的功能。由于两个LED灯亮灭有时间控制。所以需要分频。由于FPGA的内部频率是66兆赫兹,如此需要分频65999999次能达到一秒。最后编写主要的功能程序,首先让两个LED灯都置于高电平,当检测到按键按下时,时间过了一秒之后,led1开始亮,又过了一秒,LED2和LED1对LED1取反,实现了一亮一灭的功能。这样循环六次后,分别将两灯置于高电平,即灭的状态。在此过程中,假如复位键置于高电平,如此亮灯都暗。三、 设计成果1、模块划分或者状态机1键盘的检测2分频3实现流水灯的模块2、模块设计计数模块用来计数的。低电平和计数器满时,复位。否如此计数器不断的计数加一,直到计数满时再复位。 always(posedge clk or negedge reset_n)begin if(!reset_n) t1<=20'd0;else t1<=t1+1'b1;endalways(negedge reset_n or posedge clk)begin if(reset_n=1'b0) begin t<=28'd0; end else begin if(t=28'd00000099) begin t<=28'd0; end else t<=t+1; endendreg yimiao;always(negedge reset_n or posedge clk)begin if(reset_n=1'b0) begin yimiao<=1'b0; end else begin if(t=28'd00000099) yimiao<=1'b1; else if(yimiao) yimiao<=1'b0; end end键盘的检测模块 always(negedge reset_n or posedge clk) begin if(reset_n=1'b0) key1_dly<=1'b0; else key1_dly<= key1; end always(negedge reset_n or posedge clk) begin if(reset_n=1'b0) key1_dly1<=1'b0; else key1_dly1<= key1_dly; end always(negedge reset_n or posedge clk) begin if(reset_n=1'b0) key1_nege_flag<=1'b0; else if(key1_dly=1'b0&&key1_dly1=1'b1) key1_nege_flag <=1'b1; else if(key1_valid=1'b1) key1_nege_flag <=1'b0; end always(negedge reset_n or posedge clk) begin if(reset_n=1'b0) key1_pose_flag<=1'b0; else if(key1_nege_flag=1'b1) begin if(key1_dly=1'b1&&key1_dly1=1'b0) key1_pose_flag <=1'b1; else if(key1_valid=1'b1) key1_pose_flag <=1'b0; end end always(negedge reset_n or posedge clk) begin if(reset_n=1'b0) key1_valid<=1'b0; else if(key1_nege_flag=1'b1&&key1_pose_flag=1'b1) key1_valid <=1'b1; else key1_valid <=1'b0; end always(negedge reset_n or posedge clk) begin if(reset_n=1'b0) begin key_ok1<=1'b0; end else if(key1_valid=1'b1) key_ok1<=1'b1; endLED灯的驱动模块 always(negedge reset_n or posedge clk) begin if(reset_n=1'b0) begin count<=0; led1<=1'b1; led2<=1'b1; end else if(yimiao) begin if(key_ok1=1'b1) begin if(count=12) led2<=1; if(count<12) begin led1<=led1; led2<=led1; count<=count+1; end end endendmodule四、 仿真结果分析功能仿真和时序仿真仿真程序timescale 1ns/1psmodule textbench();reg clk;reg reset_n;reg key1;wire led1;wire led2;key x_key( .clk (clk), .reset_n (reset_n), .key1 (key1), .led1 (led1), .led2 (led2);always begin #10; clk<=1'b0;#10; clk<=1'b1; end initialbegin reset_n =1'b0; # 300; reset_n =1'b1; key1=1'b1;# 200; key1=1'b0;# 300; key1=1'b1;#10000;$finish;endEndmodule功能仿真时序仿真将仿真好的verilog程序,通过JTAG下载到开发板上。通过设置UCF文件,对按键,复位时钟,LED与开发板的实际电路相对应NET "clk" LOC = P183 | IOSTANDARD = "LVCMOS33"NET "key1" LOC = P154 | IOSTANDARD = "LVCMOS33"NET "led1" LOC = P56 | IOSTANDARD = "LVCMOS33"NET "led2" LOC = P60 | IOSTANDARD = "LVCMOS33"NET "reset_n" LOC = P118 | IOSTANDARD = "LVCMOS33" | PULLUP;6 存在问题和改良本实验只实现了简单的按键控制LED的亮灭功能,在逻辑上显的简单。在功能的时间上我比拟后悔没有按教师说的用同步复位,异步复位在逻辑正确的情况下可能不能仿真出想要的结果。我觉得在难度上可以再加大一些。七心得体会 本次试验我熟悉了开发板的一些硬件资源和verilog语言的一些根本特点,对modelsim和ise仿真软件比拟了解。 也让我对开发流程有了更进一步的认识,逻辑和仿真是很重要的局部,它能大大缩短你成功设计的时间。8 / 8