使用FPGA点亮LED的多种方法讲解

Posted 恒星QRS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用FPGA点亮LED的多种方法讲解相关的知识,希望对你有一定的参考价值。

FPGA点亮LED的多种操作方法

LED的硬件链接

对于嵌入式而言,要想实现预计的功能就必须了解硬件上的连接,在这里使用的是alter的EP4CE10F17C8这款芯片,其LED连接情况如下。

上图为LED与FPGA芯片的连接方式

上图为LED的连接方式,在图中可以看出,LED的正极都连到了同一个3.3V上,这种连接方式称为共阳极连接。相反的就存在共阴极连接,如下图:

在这里我们主要分析共阳极连接,由于所有的LED正极都连接着3.3V的电源,所以我们只需要给LED的负极接入一个低电平,那LED就可以点亮,所以需要点亮的LED芯片管脚需要输出低电平。同理可得:共阴极连接需要在芯片管脚输出高电平。在了解了硬件连接后,我们开始编写代码。

点亮代码

方法一:

module led(
	output led0,			//定义第一个LED灯
	output led1,			//定义第二个LED灯
	output led2,			//定义第三个LED灯
	output led3				//定义第四个LED灯
);

assign led0 = 0;			//将第一个LED灯所连接到的芯片引脚置于低电平
assign led1 = 0;			//将第二个LED灯所连接到的芯片引脚置于低电平
assign led2 = 0;			//将第三个LED灯所连接到的芯片引脚置于低电平
assign led3 = 0;			//将第四个LED灯所连接到的芯片引脚置于低电平

endmodule 

在这里定义LED0-3的输出电压全部都为低电平,特别提示,在代码中二进制的0代表低电平,通常位0V;1代表为高电平,通常为3.3V。代码经过编译后我们进行管脚锁定。

管脚如我们在上面提到的一样去分配;接下来我们去烧录,我们就可以得到结果

在讲第二种编写方式前,我们先查看一下这种编写方式的RTL,打开方式如下:

我们打开后查看RTL图发现,这种方式的编写没有任何寄存器,而是将输入直接给到了输出。

方法二

module led(
	input 	wire clk,			//定义一个时钟,一般情况下为50MHz
	input 	wire rst_n,			//复位信号,高电平有效
	output 	reg  led0,			//定义第一个LED灯
	output 	reg  led1,			//定义第二个LED灯
	output 	reg  led2,			//定义第三个LED灯
	output 	reg  led3			//定义第四个LED灯
);

always@(posedge clk or negedge rst_n)		//定义一个触发器,posedge clk表示clk为上升沿触发,negedge rst_n表示rst_n为下降沿触发
if(!rst_n)begin  									//高电平复位
	led0 <= 1;										//初始化LED管脚输出
	led1 <= 1;										//初始化LED管脚输出
	led2 <= 1;										//初始化LED管脚输出
	led3 <= 1;										//初始化LED管脚输出
end 
else begin 
	led0 <= 0;										//LED管脚输出置0,输出高电平,点亮LED
	led1 <= 0;										//LED管脚输出置0,输出高电平,点亮LED
	led2 <= 0;										//LED管脚输出置0,输出高电平,点亮LED
	led3 <= 0;										//LED管脚输出置0,输出高电平,点亮LED
end 

endmodule 

同样的在编译后分配引脚上板后任然可以点亮,查看RTL图,RTL将会变为下图所示

在图中,我们发现,每一个LED的信号在输出的前面都多加了一个触发器,在模电中,第一种方法产生的电路叫做逻辑电路,不受时间的影响,第二种的叫做时序电路,它有严格的时序要求,在FPGA的后续研究中,多数都是以时序逻辑去分析的,所以这里必须掌握的很好。

方法三

module led(
	input wire clk,
	input wire rst_n,
	output reg[3:0] led
);

always@(posedge clk or negedge rst_n)
if(!rst_n)
	led <= 4'b1111;
else 
	led <= 4'b0000;

endmodule

在进行管脚分配时需要特别注意下,此时的变量变为了led[0]…,在这里我们只需要将他理解为四个led中的第一个既可以。

验证上板后任然是可以点亮的,这时我们在查看RTL图

多个触发器变为了一个,这样可以大大的减少逻辑资源。而且这类方法在后面的流水灯中也有着较大的作用,可以大大较少流水灯的代码冗余度。

总结

到这就大致讲完了LED的点亮,如有问题,还请指出,代码复制后不能达到预计效果,也可以联系我,我将尽我所能的帮助你。

以上是关于使用FPGA点亮LED的多种方法讲解的主要内容,如果未能解决你的问题,请参考以下文章

iCore3 双核心板_FPGA例程二:GPIO输出实验——点亮三色LED

史上最全的LED点灯程序—使用STM32FPGALinux点亮你的LED灯

史上最全的LED点灯程序—使用STM32FPGALinux点亮你的LED灯

FPGA随手记03

FPGA基础入门程序代码

怎么用Verilog的语言点亮一个灯!