当前位置:   article > 正文

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

lvcmos33

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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

约束文件

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

#时钟定义
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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

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

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

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

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

综合,布线,编译

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

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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号