【FPGA】【入门基础】一、FPGA实现跑马灯

本文详细介绍了如何使用FPGA开发一个简单的LED跑马灯项目,涉及.v文件的编程和.xdc文件的约束设置。通过实例展示了计数器和LED逻辑的实现,并解释了约束文件在匹配管脚的重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FPGA开发概括

FPGA的开发流程主要分为两部分(不考虑仿真),.v文件的编写和.xdc文件的编写,前者为程序文件后者为管脚约束文件。

程序文件

程序文件里实现的功能为每一秒实现两个led的亮灭变化,产生跑马灯的效果。
代码如下,注释也十分清楚。

module led_flash(
         input wire clk ,//定义一个输入的时钟信号
         input wire rst_n ,//定义一个按键复位信号
         output reg [1:0] led //定义两个led灯的电平信号
 );
 
/*---计数器的定义---*/
 reg [27:0] cnt ;//定义一个28位的寄存器,用来存数,目标一秒变化一次,则需要计数到50M,对应一个28位的二进制数
 wire add_cnt ;//计数标志位
 wire end_cnt ;//清零计数标志位

 assign add_cnt = 1; 
 assign end_cnt = add_cnt && cnt== 50000000 - 1; //只有当cnt=50M-1时,及计数时间已经到1S时,end_cnt才为1

 /*---计数器功能实现---*/
 always @(posedge clk or negedge rst_n)begin//当时钟上升沿或者复位信号下降沿时执行

 if(rst_n==1'b0)begin
    cnt <= 'd0;
 end//检测到复位信号,计数器值归零

 else if(add_cnt)begin//恒成立
     if(end_cnt)
     cnt <= 'd0;//计数到目标值时归零
     else
     cnt <= cnt + 1'b1;//正常加一计数
    end
end

/*---led功能实现---*/
 always @(posedge clk or negedge rst_n)begin//当时钟上升沿或者复位信号下降沿时执行

 if(rst_n==1'b0)begin
 led <= 2'b10;////检测到复位信号,led为二位二进制数10
 end

 else if(end_cnt)begin
 led <= {led[0], led[1]};//计数到目标值时,调换led二位二进制数,实现led亮灭效果
 end
 else begin
 led <= led; //计数未到目标值时,保持led的数值
 end
 end

 endmodule 

约束文件

约束文件的作用就是对程序文件中定义的变量进行相应管脚的匹配。
代码如下

#时钟定义
create_clock -period 20.000 [get_ports clk]
set_property PACKAGE_PIN N18 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]

#按键定义
set_property PACKAGE_PIN P16 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]

#管脚电平初始化
set_property PACKAGE_PIN P15 [get_ports {led[0]}]
set_property PACKAGE_PIN U12 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]
set_property IOSTANDARD LVCMOS33 [get_ports clk]

其中时钟定义可有可无,额…我看的手册是这样说的,定义了会更好。
其中的代码无非就是两种,第一种为端口定义,例如:

set_property PACKAGE_PIN P15 [get_ports {led[0]}]

第二中为初始电平定义,例如:

set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]

第一种不同的是原理图上对应的管脚号,如上面的“P15”,“U12”,原理图如下。[ ]里面的就是程序文件中自己定义的变量名了。
在这里插入图片描述
第二种中的关键字就是“LVCMOS33”,它的含义是IO管脚的电平约束CMOS电压3.3V! [ ]里面的就是程序文件中自己定义的变量名了。

综合,布线,编译

代码都写好后就可以生成FPGA的烧录文件了,使用的编辑器为Vivado,接下来就是编译三部曲,也可以直接点击第三个,同时完成上面的功能。
在这里插入图片描述
下面是综合后的结构图,大家感受一下FPGA的魅力吧!
放大前:
请添加图片描述
放大后:(仅仅是输入部分)
请添加图片描述
接下来就是把生成的.bit文件烧录进FPGA了
在这里插入图片描述
成功下载后,FPGA上的两个led灯交替闪烁,至此,over!

注:此下载方法只是在线编译,断电重连后不会执行该代码,要想断电不丢失代码要进行固化下载。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值