FPGA通过一个按键控制三个LED灯亮灭(状态机法)

这篇具有很好参考价值的文章主要介绍了FPGA通过一个按键控制三个LED灯亮灭(状态机法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FPGA型号:Cyclone IV EPFCE10F17C8    开发工具:Quartus13.0专业版  Modelsim 10.1d

文章目录

  • 状态机
  • 一、设计思路
  • 二、代码设计
    • 1.顶层代码
    • 2.测试代码
  • 三、仿真

状态机

状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。状态机的4个要素:现态、条件、动作、次态。“现态”和“条件”是因 ,“动作”和“次态”是果。

1)现态:指当前所处状态;

2)条件:又称“事件”。当条件被满足时,将会触发一个动作,或者执行一次状态的迁移。

3)动作:条件满足后执行的动作。条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必须的,当条件满足后,也可以不执行任何动作,迁移到新状态。

4)次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就变成新的“现态”了。

有限状态机简写为FSM(Finite State Machine),主要分为2大类:

第一类,若输出只和状态有关而与输入无关,则称为Moore状态机。

第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机

常用的三段式状态机的设计思路为:

1)一段式:利用一个进程来描述状态的转换及输出信号的定义;

2)二段式:一个为时序电路主要负责状态变量的更新,此进程为同步电路,而另一个进程语句主要是描述下次态变量和输出的更新;

3)三段式:第一个进程主要负责状态变量的更新,第二个进程语句负责描述次态变量,而最后一个则是负责输出信号的更新。

一、设计思路

FPGA实现一个按键控制三个LED灯亮灭的状态机如图所示。在初始状态下,LED灯全部处于熄灭状态。当按键被按下时,会启动消抖程序,默认按键按下时,延迟10ms,若按键仍处于低电平,则说明按键确实被按下,系统进入进入状态1,即LED_r处于低电平,红色LED灯亮起,并保持。当按键再次被按下时,继续进行消除抖动检测,若满足,则系统进入状态2,即LED_g处于低电平,绿色LED灯亮起,并保持。同理,当系统进入状态3时,LED_b处于低电平,蓝色LED灯亮起,并保持。当系统复位时,系统返回至初始状态。fpga一个按键控制多个led,fpga开发,嵌入式硬件

 时序图如图所示:

fpga一个按键控制多个led,fpga开发,嵌入式硬件

 二、代码

1.顶层代码

`timescale 1ns/1ps

//模块定义
module FSM(
		clk,
	  rst_n,
	    key,
	  led_r,
	  led_g,
	  led_b
);

//输入输出
input      clk;
input    rst_n;
input      key;
output   led_r;
output   led_g;
output   led_b;

//信号类型定义
parameter ms_10 = 250_000;

reg         key_en;
reg [17:0] low_cnt;
reg [17:0] hig_cnt;
reg [1:0]  led_cnt;
reg          led_r;
reg          led_g;
reg          led_b;

wire      key_flag;

//按键消抖
always @ (posedge clk or negedge rst_n)  begin
		if (!rst_n) begin
			key_en  <= 1'd0;
			low_cnt <= 18'd0;
			hig_cnt <= 18'd0;
		end
		else if (key_en) begin                     //检测按键为高电平时,延时10ms将状态读取
			low_cnt <= 18'd0;
			if (hig_cnt == ms_10) begin
					key_en <= key;
				   hig_cnt <= hig_cnt;
			end
			else begin
				   hig_cnt <= hig_cnt +1'd1;
			end
		end
		 else  begin                               //检测按键为低电平时,延时10ms将状态读取
			hig_cnt <= 18'd0;
			if (low_cnt == ms_10) begin
					 key_en <= key;
				   low_cnt <= low_cnt;
			end
			else  begin
				   low_cnt <= low_cnt +1'd1;
			end
		 end
end

assign  key_flag = key_en;

//按键下降沿控制led状态切换
always @ (negedge key_flag or negedge rst_n) begin
		if (!rst_n) begin
				led_cnt <= 2'd0;
		end
		else if (led_cnt == 2'd2) begin
				led_cnt <= 2'd0;
		end
	   else  begin
				led_cnt <= led_cnt +2'd1;
		end
end

//状态机:led状态切换
always @ (posedge clk or negedge rst_n) begin
		if (!rst_n) begin
				led_r <= 1'd1;
				led_g <= 1'd1;
				led_b <= 1'd1;
		end
		else case(led_cnt) 
			2'd0: begin             //红灯亮
				led_r <= 1'd0;
				led_g <= 1'd1;
				led_b <= 1'd1;
			end
			2'd1: begin             //绿灯亮
				led_r <= 1'd1;
				led_g <= 1'd0;
				led_b <= 1'd1;
			end
			2'd2: begin             //蓝灯亮
				led_r <= 1'd1;
				led_g <= 1'd1;
				led_b <= 1'd0;
			end
			default: begin          //都不亮
				led_r <= 1'd1;
				led_g <= 1'd1;
				led_b <= 1'd1;
			end
	    endcase
end

endmodule

2.测试代码

`timescale 1 ps/ 1 ps
module FSM_vlg_tst();
reg clk;
reg key;
reg rst_n;
// wires                                               
wire led_b;
wire led_g;
wire led_r;
// wires                                               
// assign statements (if any)                          
FSM i1 (
// port map - connection between master ports and signals/registers   
	.clk(clk),
	.led_b(led_b),
	.led_g(led_g),
	.led_r(led_r),
	.rst_n(rst_n)
);
initial                                                
begin                                                  
clk = 0;
key = 0;
forever #5 clk = ~clk;                          
end   

initial
begin
rst_n = 1;
#30 rst_n = ~rst_n; 
#10 rst_n = ~rst_n;    
end
                                                
always                                                                
begin                                                  
 #50 key = ~key;                                                                  
end                                                    
endmodule

三、仿真

fpga一个按键控制多个led,fpga开发,嵌入式硬件

 由图可见,仿真结果基本符合预期。 文章来源地址https://www.toymoban.com/news/detail-786617.html

到了这里,关于FPGA通过一个按键控制三个LED灯亮灭(状态机法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • arm学习之stm32设备树学习-中断控制led灯亮灭+字符设备指令控制led灯亮灭

    中断控制led灯亮灭 驱动文件源码 led-key.c 字符设备指令控制led灯亮灭 驱动文件 led-cmd.c 应用文件 led.c

    2024年02月14日
    浏览(33)
  • C51---串口发送指令,控制LED灯亮灭

    1.Code: #include \\\"reg52.h\\\" #include \\\"intrins.h\\\" sfr   AUXR = 0x8E; sbit  D5 = P3^7; void UartInit(void)        //9600bps@11.0592MHz {     //PCON = 0x7F;        //波特率不倍速     AUXR  = 0x01;         SCON  = 0x50;        //8位数据,可变波特率     //AUXR = 0xBF;        //定时器1时钟为Fosc/12,即12T

    2024年02月12日
    浏览(25)
  • 毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

    选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的! 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业

    2024年02月07日
    浏览(46)
  • 51单片机按键控制LED亮灭

    通过单片机按键控制LED亮灭与传统电路的物理逻辑不同,在物理逻辑中开关控制电路的通断来控制LED的亮灭,而通过单片机完成该项目至于要不断地读取按键所连接IO口的电平来判断对LED连接的IO口输出的电平即可。 原理图如下:  根据原理图,我们可以发现按键按下时P2.1口

    2023年04月18日
    浏览(38)
  • ARM day9 (按键中断控制led亮灭)

     保存现场 异常的处理流程,保存现场会做哪些事情(四大步三小步) ----CPU自动完成 1.保存CPSR寄存器中的值,到SPSR_mode寄存器中 2.修改CPSR寄存器对应的位         1修改CPSR寄存器对应的状态位(T位)         2根据需要,禁止相应中断位(I位 / F位)         3修改CPSR寄存

    2024年02月13日
    浏览(34)
  • 【STM32】按键控制LED亮灭实验——GPIO、LED、KEY、SYS

    无锁存时:当按下独立按钮时LED亮,松开LED灭。 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。 硬件部分 软件部分 1、引入头文件 2、主函数 首先时钟、led、按键初始化 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。常

    2024年02月08日
    浏览(80)
  • 按键控制LED亮灭(按一次常亮和按一次亮一下)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一、51单片机按键控制LED亮灭 51单片机的LED灯是共阴极,阴极默认是高电平,不亮。如果给低电平,亮 按键是不按为高电平,按下后为低电平 操作中,给你想要的接口输入不同的高低电平信号,即可实

    2024年02月05日
    浏览(25)
  • FPGA/Verilog HDL/AC620零基础入门学习——第一个项目按键控制LED

    最近要考试了,所以我赶紧补习FPGA,我们用的是小梅哥的AC620开发板,软件是Quartus。推荐看这个视频教程:零基础轻松学习FPGA,小梅哥FPGA设计思想与验证方法视频教程 用按键控制LED灯的亮灭就是一个二选一多路器,两个IO,a、b,可以是高电平,也可以是低电平。 输入按键

    2024年02月05日
    浏览(43)
  • STM32G030C8T6:使用按键控制LED亮灭(外部中断)

    本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考; 本小节的目标是,系统主频64 MHZ,采用高速外部晶振,通过KEY1 按键的PA0 引脚配置成中断输入引脚,PB9引脚配置成输出,每次按键,PA0 引脚就会进入一次外部中断,每进

    2024年02月05日
    浏览(31)
  • 单片机C51(STC89C52RC)独立按键控制LED亮灭、状态、显示二进制、位移

    目录 1.独立按键控制LED灯亮灭 2.独立按键控制LED灯状态 3.独立按键控制LED灯显示二进制 4.独立按键控制LED灯位移 5.附录 独立按键控制LED灯状态,在独立按键按下时,LED灯点亮,松手后LED灯熄灭。独立按键按下为0,松开为1,在STC89C52RC芯片上,P2为LED灯IO口,P2_0表示第一个LED灯

    2024年02月01日
    浏览(85)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包