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!
注:此下载方法只是在线编译,断电重连后不会执行该代码,要想断电不丢失代码要进行固化下载。