二、按键控制LED灯实验

二、按键控制LED灯实验

一、实验任务

在这里插入图片描述

二、程序设计

在这里插入图片描述

  • 按键是低电平有效
  • 思路:对于LED状态控制,因为存在不同按键下的不同状态——交替闪烁和同时闪烁,所以需要使用一个变量控制灯的交替和同时 这两种状态。

设计文件


module led_key(sys_clk, sys_rst_n, key, led);
    
    // parameter Total = 25'd2500_0000;
    parameter Total = 25'd25;

    input				sys_clk     ;
    input				sys_rst_n   ;
    input	[1:0]		key   ;
    output reg	[1:0]	led   ;

    reg     [24:0]count ;
    reg     led_ctrl    ;

    //计数器,记0.5秒
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n) begin
            // reset
            count <= 25'd0;
        end
        else if (count < Total) begin
            count <= count + 1'b1;
        end
        else 
            count <= 25'd0;
    end

    //led_ctrl 控制灯的 交替 和 同时 这两种状态
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n) begin
            // reset
            led_ctrl <= 1'b0;
        end
        else if (count == Total)
            led_ctrl <= ~led_ctrl;
    end

    //led模式的选择
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n) begin
            // reset 复位全亮
            led <= 2'b11;
        end
        // case还能这一用
        else case(key)
            //第一个按键按下,由1变为0,低电平有效
            2'b10 : 
                //每0.5s led_ctrl取反一次,实现交替
                if (led_ctrl == 1'b0)
                    led <= 2'b10;
                else 
                    led <= 2'b01;
            2'b01 : 
                //实现同时亮和同时灭
                if (led_ctrl == 1'b0)
                    led <= 2'b11;
                else 
                    led <= 2'b00;
            //无按键按下
            2'b11 : 
                    led <= 2'b11;
            //默认可以为空
            default : ;
        endcase
    end

endmodule

tb文件



`timescale 1ns/1ps

module tb_led_key (); 

	//激励信号一般定义为 reg型
	reg				clk		;
	reg				reset	;
	reg	[1:0]		key 	;
	
	//输出信号——需要观测的信号
	wire[1:0]		led 	;

	initial begin
		clk         = 1'b0;
		reset       = 1'b0;
		key         = 2'b11;

		#10 reset   = 1'b1;
		#40 key     = 2'b10;
		#2000 key   = 2'b11;
		#100 key    = 2'b01;
		#2000 key   = 2'b11;
	end

	always #10 clk = ~clk;

	led_key u_led_key(
		.sys_clk   (clk		),
		.sys_rst_n (reset	),
		.key       (key 	),
		.led       (led 	)
		);

endmodule

仿真波形

在这里插入图片描述

注意

  • output信号默认为wire型,这里在always块中给led赋值了,所以led必须为reg型,所以要在output指明数据类型。
  • 而在tb文件中,input类型的为激励信号,使用reg型,而观测信号使用wire型。如果给观测信号赋初值,则会报错:Illegal reference to net ‘led’
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值