LED控制 verilog FPGA 基础练习6
发现问题,用技术解决问题。兴趣是自己的源动力 !
目录
- LED控制 verilog FPGA 基础练习6
- 前言
- 一、LED控制
- 1.1 控制方案
- 1.1.1 功能代码
- 1.1.2 仿真代码
- 1.1.3 仿真结果
- 总结
前言
借用LED灯的开关切换控制,主要来联系如何通过上升沿或者下降沿来进行特定的操作。核心就是通过打拍进行边沿的判断。
一、LED控制
实际场景:按一下,切换LED的开和关
1.1 控制方案
- 触摸LED控制的核心就是判断上升沿和下降沿
- 实现方法就是:每一个变动flag就取反
1.1.1 功能代码
module touch_ctrl_led
(
input wire sys_clk , //系统时钟,频率50MHz
input wire sys_rst_n , //复位信号,低电平有效
input wire touch_key , //触摸按键信号
output reg led //led输出信号
);
// *******************************************
// 触摸LED控制的核心就是判断上升沿和下降沿
// 实际场景:按一下,切换LED的开和关(即上或者下降沿)
// 实现方法就是:每一个变动flag就取反
// *******************************************
// 上升沿和下降沿判断
// 先对输入信号进行打一拍
reg touch_key_dly1;
reg touch_key_dly2;
wire [1:0] touch_en;
always@(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_rst_n == 1'b0)
begin
touch_key_dly1 <= 1'b1; // 低电平亮
touch_key_dly2 <= 1'b1;
end
else
begin
touch_key_dly1 <= touch_key; // 因为触摸相当于和当前时钟是异步的,所以打两排,第一拍先同步
touch_key_dly2 <= touch_key_dly1;
end
end
assign touch_en = {touch_key_dly2,touch_key_dly1}; // 2'b10表示下升沿,2'b01表示下升沿,
always@(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_rst_n == 1'b0)
begin
led <= 1'b1;
end
else if(touch_en == 2'b10 | touch_en == 2'b01 )
begin
led <= ~led; // 每次变化,对led来说就是一开一关
end
end
endmodule
1.1.2 仿真代码
`timescale 1ns/1ns
module tb_top;
reg sys_clk;
reg sys_rst_n;
reg touch_key;
wire led;
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#50;
sys_rst_n = 1'b1;
end
always #10 sys_clk = ~sys_clk;
// 模拟开关
initial
begin
#200
touch_key <= 1'b0 ;
#2000
touch_key <= 1'b1 ;
#1000
touch_key <= 1'b0 ;
#3000
touch_key <= 1'b1 ;
end
touch_ctrl_led u0_touch_ctrl_led
(
.sys_clk (sys_clk ), //系统时钟,频率50MHz
.sys_rst_n (sys_rst_n ), //复位信号,低电平有效
.touch_key (touch_key ), //触摸按键信号
.led (led ) //led输出信号
);
endmodule
1.1.3 仿真结果
图1 上升沿判断,LED拉低,亮
图2 下升沿判断,LED拉低,灭
注意:这里只要是有切换,就变换LED灯的亮或者灭
总结
- 核心思想:判定条件是上升沿或者下降沿才进行的某个特定的操作。
- 知识点总结:
- 如何通过边沿切换控制LED的亮和灭?
- 异步的信号进来需要进行clk同步
- 边沿判断的方式?如下面代码,2拍写前,1写后;2’b10,其中1变成0,就是代表下降沿;2’b01,其中0变成1,就是代表上降沿;
// 2'b10表示下升沿,2'b01表示下升沿, assign touch_en = {touch_key_dly2,touch_key_dly1};
- 欢迎一起交流学习,如有错误之处,还请各位指正。
参考资料
[1] FPGA系列教学