开发板实物图

xilinx fpga 架构 xilinx fpga开发实用教程_LED灯闪烁


xilinx fpga 架构 xilinx fpga开发实用教程_LED灯闪烁_02


根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤。比如非常简单的项目,我们可以省去虚线框里面的步骤,但是我们的入门级课程,即使再简单,也按照这12个步骤来进行讲解。

1. 需求解读

1.1 需求

实现LED灯(D2)间隔1秒闪烁1次

1.2 知识背景

LED灯简介
LED,又名发光二极管。 LED灯工作电流很小(有的仅零点几毫安即可发光) , 抗 冲击和抗震性能好,可靠性高,寿命长。由于这些优点, LED灯被广泛用在仪器仪表 中作指示灯、 液晶屏背光源等诸多领域。不同材料的发光二极管可以发出红、 橙、 黄、 绿、 青、蓝、 紫、白这八种颜色的光。 如下图所示:

xilinx fpga 架构 xilinx fpga开发实用教程_xilinx fpga 架构_03

图2.插件LED灯

这种二极管长的一端是阳极,短的那端是阴极。 开发板上板载的是贴片LED灯,实物 如下图所示:

xilinx fpga 架构 xilinx fpga开发实用教程_LED灯闪烁_04

图3.贴片LED灯

贴片发光二极管的正面一般都有颜色标记,有标记的那端就是阴极。发光二极管与普通二极管一样具有单向导电性。 给它加上阳极正向电压后,通过 5mA左右的电流就可以使二极管发光。 通过二极管的电流越大, 发出的光亮度越强。 不过我们一般将电流限定在3~20mA之间,否则电流过大就会烧坏二极管。

1.3 硬件设计

xilinx fpga 架构 xilinx fpga开发实用教程_Modelsim_05


xilinx fpga 架构 xilinx fpga开发实用教程_xilinx fpga 架构_06

图4.LED灯原理图及PCB

xilinx fpga 架构 xilinx fpga开发实用教程_fpga开发_07

图5.有源晶振

xilinx fpga 架构 xilinx fpga开发实用教程_Modelsim_08

图6.按键电路

发光二极管的原理图如上图4所示, LED1到LED8这8个发光二极管的阳 极都连到3.3V上, 阴极分别与FPGA相应的管脚相连。原理图中LED与地 之间的电阻起到限流作用。通过原理图我们可以看出,LED1与FPGA的管脚 L12相连。在PCB图或实物上我们都标注出了管脚号,所以在绑管脚的时候 可以不用看原理图,直接看板上的丝印就可以,如上图PCB图所示。我们只 点亮一个LED灯(LED1),那我们只用关心LED1的管脚号(L12)。当管脚L12 输出低电平时,LED灯便有电流流过,驱动LED灯发光,如果L12输出高电 平,LED灯没有电流流过,LED不发光。

1.4 接口说明

信号名

方向

FPGA管脚号

说明

LED0

输出

L12

与LED灯相连,低电平LED灯亮

CLK50M

输入

B10

时钟信号,50MHZ

KEY1

输入

E4

独立按键,按下低电平,当作复位使用

总结:通过上述说明,可以将需求解读成,只要将FPGA的L12管脚置为低 电平(500ms),即可以点亮D2这个LED灯500ms,然后再将L12管脚置为 高电平(500ms),即可以让D2这个LED灯熄灭500ms,如此循环,便实现 了1秒闪烁1次的效果。

2. 绘制理论波形图

clk是50Mhz时钟,一个周期就是20ns,1秒=1000000000ns,1秒是50000000个时钟周期,500ms=25000000个时钟周期。

xilinx fpga 架构 xilinx fpga开发实用教程_LED灯闪烁_09

3.新建ISE工程

为了让工程看起来整洁,同时方便工程移植。我们新建4个文件夹,分别是Project,Source,Sim,Doc。
Project — 工程文件夹,里面放的ISE工程
Source — 源代码文件夹,里面放的工程源码(.v文件或.vhd文件)
Sim — 仿真文件夹,里面放的仿真相关的文件
Doc — 存放相关资料,比如数据手册,需求文档等

4.编写代码

///
//QQ:3181961725
//TEL/WX:13540738439
//作者:Mr Wang
//模块介绍:实现LED灯(D8)间隔1秒闪烁1次
///
module led_ctrl(
	input		clk		,//时钟,50MHZ
	input		rst_n	,//复位,低电平有效
	output	reg	led		 //LED灯控制信号
	);
	parameter	time_500m=25000000;//500ms
	//为了缩短仿真时间,减小了参数值,仅仅用于仿真
	//parameter	time_500m=2500;//500ms
	reg	[24:0] cnt;
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			cnt<=0;
		else if(cnt==time_500m-1)
			cnt<=0;
		else
			cnt<=cnt+1;
	end
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			led<=1;
		else if(cnt==time_500m-1)
			led<=~led;
		else;
	end
endmodule

5.编写仿真测试激励文件

xilinx fpga 架构 xilinx fpga开发实用教程_xilinx fpga 架构_10

///
//QQ:3181961725
//TEL/WX:13540738439
//作者:Mr Wang
`timescale 1ns/1ns
module led_ctrl_tb;
	reg	clk;
	reg	rst_n;
	initial
		begin
			clk=0;
			rst_n=0;//生成复位激励信号
			#1000
			rst_n=1;//生成复位激励信号
		end
	//生成时钟激励信号
	always #10 clk<=~clk;
	//例化被仿真模块
	led_ctrl Uled_ctrl(
	.clk		(clk	),
	.rst_n		(rst_n	),
	.led        (		)
	);
endmodule

仿真时,我们主要关心的是输入端口,在led_ctrl这个模块中,有两个输入端口, rst_n,clk,所以,我们在仿真测试文件编写时,就是给这两个端口灌入激励信号。

6.Modelsim仿真

这个例程非常简单,只用了一条语句,所以不需要仿真验证。但是为了给大家演示一个完整的开发流程,这个实验我们也新建一个仿真工程,从最简单的一个代码开始教大家如何编写仿真激励文件以及如何使用Modelsim软件进行仿真。将第三步编写的源码和第四步编写的仿真测试激励文件一起加入到Modelsim仿真工程中,即可进行仿真观察波形。
Modelsim仿真一般有两种方法

  1. 图形化界面仿真,即所有的操作都是在Modelsim软件界面上来完成,该方式的优点是,简单易学,适用于简单的项目,缺点是操作步骤繁琐。
  2. 批处理仿真,这种方式在仿真前需要编写相应的脚本文件,该方式的优点是,一键即可完成仿真,省时省力,缺点是前期需要编写脚本文件。为了让大家所学的能够很快的应用到工程实践,仅仅第一个实验和第二个实验,采用图形化界面仿真,后面的实验均采用批处理方式仿真。

图形化界面仿真步骤:

1.新建工程,file–>new–>Project

xilinx fpga 架构 xilinx fpga开发实用教程_LED灯闪烁_11

2.填写工程名以及指定仿真工程存放路径

xilinx fpga 架构 xilinx fpga开发实用教程_xilinx fpga 架构_12

3.添加文件,源文件和仿真激励文件

4.编译

5.开始仿真

xilinx fpga 架构 xilinx fpga开发实用教程_Modelsim_13


xilinx fpga 架构 xilinx fpga开发实用教程_LED灯闪烁_14

6.添加观测信号

xilinx fpga 架构 xilinx fpga开发实用教程_Verilog_15


7.中断仿真

xilinx fpga 架构 xilinx fpga开发实用教程_Verilog_16

8.输入运行命令,run+仿真时间

xilinx fpga 架构 xilinx fpga开发实用教程_Verilog_17

到此,我们就可以在波形窗口观察到仿真信号的电平状态。

当我们改变了源码,又需要从第4步开始操作一次。

仿真出的波形如下图所示:

xilinx fpga 架构 xilinx fpga开发实用教程_Verilog_18

7.对比波形图

将第二步绘制的理论波形图与第六步Modelsim仿真出来的波形图进行对比,结果一致,说明我们的逻辑设计是正确的。如果发现比对结果不一致,就需要找到不一致的原因,最终要保证对比结果一致。
通过对比,理论波形与仿真波形一致,说明功能符合设计要求。

8.绑定管脚(编写UCF文件)

NET "clk" TNM_NET = "clk";
TIMESPEC TS_sys_clk_i = PERIOD "clk" 20 ns HIGH 50 %;
NET "clk" 		LOC = B10	| IOSTANDARD = LVCMOS33 ;

NET "rst_n" 	LOC = E4	| IOSTANDARD = LVCMOS33;
NET "led" 		LOC = L12	| IOSTANDARD = LVCMOS33;

9.添加.v和.ucf文件

xilinx fpga 架构 xilinx fpga开发实用教程_Modelsim_19

10.编译综合,同时将未使用管脚设置为悬空状态

1.设置未使用管脚为悬空状态

xilinx fpga 架构 xilinx fpga开发实用教程_fpga开发_20


xilinx fpga 架构 xilinx fpga开发实用教程_fpga开发_21

2.编译综合

xilinx fpga 架构 xilinx fpga开发实用教程_Modelsim_22

11.下载BIT文件

编译综合成功后便可以将生成的BIT文件下载到开发板(记得插上下载器,同时开发板上电)

1.打开IMPACT

xilinx fpga 架构 xilinx fpga开发实用教程_LED灯闪烁_23

2.搜索器件

xilinx fpga 架构 xilinx fpga开发实用教程_Verilog_24

xilinx fpga 架构 xilinx fpga开发实用教程_fpga开发_25


xilinx fpga 架构 xilinx fpga开发实用教程_fpga开发_26


xilinx fpga 架构 xilinx fpga开发实用教程_LED灯闪烁_27

3.选择bit文件

xilinx fpga 架构 xilinx fpga开发实用教程_fpga开发_28


xilinx fpga 架构 xilinx fpga开发实用教程_LED灯闪烁_29

xilinx fpga 架构 xilinx fpga开发实用教程_Modelsim_30

下载成功后,便可以观察到开发板上的实验现象,如果实验现象与设计需求相符,那说明我们的设计是没有问题的,即可进行下一步生成MCS文件

12.生成MCS文件,同时固化到配置芯片中

FPGA有一个特性,就是掉电后配置信息会丢失,所以我们需要将配置信息存储在配置芯片(FLASH)中,待开发板上电后,FPGA便会读取配置芯片中的配置信息,这样开发板掉电再上电后同样可正常工作。要将程序固化到配置芯片,需要先生成MCS文件。
BIT文件转换成MCS文件步骤:

xilinx fpga 架构 xilinx fpga开发实用教程_xilinx fpga 架构_31


xilinx fpga 架构 xilinx fpga开发实用教程_Modelsim_32


xilinx fpga 架构 xilinx fpga开发实用教程_Modelsim_33

xilinx fpga 架构 xilinx fpga开发实用教程_LED灯闪烁_34

固化MCS文件

xilinx fpga 架构 xilinx fpga开发实用教程_Verilog_35


xilinx fpga 架构 xilinx fpga开发实用教程_Modelsim_36


xilinx fpga 架构 xilinx fpga开发实用教程_xilinx fpga 架构_37


xilinx fpga 架构 xilinx fpga开发实用教程_xilinx fpga 架构_38


固化成功后,开发板断电再重新上电,可以观察到开发板仍然可以执行刚刚的功能。

实验现象

与FPGA管脚L12相连的LED灯实现1秒闪烁1次的效果,符合设计要求,设计完成!