标准的 FPGA 开发流程主要有以下几个步骤:
从上面的 FPGA 的开发流程可知,在 FPGA 开发的过程中会产生很多不同功能的文件,为了方便随时查找到对应文件,所以在开始开发设计之前对文件进行分类,便于后期后期文件的查找、管理、移植。在整个开发过程中注意会生成4种文件:
这里以一个简单的按键控制LED的项目来熟悉FPGA开发流程
使用正点原子达芬奇 Pro 开发板上的 KEY0 按键来控制 LED0 灯亮灭。当按键 KEY0 被按下时,LED0 灯被点亮,当按键 KEY0 被弹起时,LED0 灯被熄灭。
发光二极管的原理图如下所示,发光二极管LED0阴极连到 S8050(NPN三极管)的集电极上,阳极通过电阻与 3.3V 电压相连,三极管的基极与 FPGA 的V9脚相连。可以通过改变三极管的状态来控制 LED 的亮灭,当 FPGA 输出到为高电平时,三极管导通,LED 灯亮,当 FPGA 输出到为低电平时,三极管截止,LED 灯灭。
按键原理图如下所示,K0按键一端连接到FPGA的T4脚,另一端连接到地,同时FPGA的T4脚又通过电阻连接到1.5V电源,当按键按下时FPGA的T4脚通过按键与地相通,为低电平,当按键松开时FPGA的T4脚通过电阻与1.5v电源相通,为高电平。
因为按键控制LED非常简单,只需要一个模块就可以实现功能,所以本实验不需要模块划分、模块间交互信号梳理的步骤。
按键控制LED的系统框图如下:
模块端口描述
----------------------------------
信号名 |位宽 |方向 |端口说明
----------------------------------
KEY |1 |输入 |按键
----------------------------------
LED |1 |输出 |LED
----------------------------------
按键按下时为低电平,弹起时为高电平,而LED却是高电平点亮,低电平熄灭,所以按键和LED的真值表如下:
-----------------
输入 |输出 |
-----------------
KEY |LED |
-----------------
1 |0 |
-----------------
-----------------
0 |1 |
-----------------
所以按键控制LED的波形图(时序图)如下:
`timescale 1ns / 1ps //仿真单位/仿真精度
//
// Company:
// Engineer:
//
// Create Date: 2024/01/21 20:41:05
// Design Name:
// Module Name: led
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module led(
input key , //输入按键
output led //输出led灯
);
//*****************************************************
//** main code
//*****************************************************
//上电按键默认高电平,led灯保持常灭
//按键被按下,按键值为低电平,led灯被点亮
assign led = ~key; //将按键的值取反后赋值给led灯
endmodule
对 代码进行仿真之前,首先要编写对应的仿真文件(TestBench),TestBench 是用于验证功能模块的设计是否符合预期,其内容主要分为以下三个部分:
`timescale 1ns / 1ns //仿真单位/仿真精度
module tb_led();
//reg define
reg key;
//wire define
wire led;
//信号初始化
initial begin
key <= 1'b1; //按键上电默认高电平
//key信号变化
#200 //延迟200ns
key <= 1'b1; //按键没有被按下
#1000
key <= 1'b0; //按键被按下
#600
key <= 1'b1;
#1000
key <= 1'b0;
end
//例化led模块
led u_led(
.key (key),
.led (led)
);
endmodule
接下来就可以在vivado中进行分析与综合了。
#IO 管脚约束
set_property -dict {PACKAGE_PIN T4 IOSTANDARD LVCMOS15} [get_ports key]
set_property -dict {PACKAGE_PIN V9 IOSTANDARD LVCMOS15} [get_ports led]
在下载程序之前,首先要先生成用于下载到器件中的比特流文件,该文件的后缀为“.bit”。
需要让程序每次开机能自动运行则需要对其进行固化
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property BITSTREAM.GENERAL.COMPRESS true [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property BITSTREAM.CONFIG.SPI_FALL_EDGE Yes [current_design]