第一个工程
led闪烁
1.创建工程
注:工程文件主要包括三大部分:
- 设计文件
- 即设计源码,是程序实际运行时的执行代码。
- 仿真文件(也称测试文件)
- 用于验证测试设计文件逻辑是否正确,用户可通过仿真结果来验证设计文件的正确性。
- 约束文件
- 是设计文件与实体芯片交互的桥梁,将设计文件与实体芯片管脚相对应,实现具体的功能。
创建工程的步骤如下:
(1)Create Project;
(2)设置工程名称以及工程保存路径;
(3)选择工程类型 ;
(4)创建源文件 ;
(5)创建约束文件 ;
(6)选择FPGA型号 ;
(7)确认工程信息;
- (8)设置模块名称。
2.创建仿真文件
- (1)添加仿真文件;
- (2)创建仿真文件并为其命名;
- (3)确认仿真文件信息 。
3.设置vivado文件打开方式为Notepad++
- (1)选择Tools-》Settings;
- (2)在Settings界面,首先,选择Text Editor,然后,在Current Editor中,选择Custom Editor…;
- (3) 在Custom Editor Definition界面,Editor一栏中输入本地Notepad++.exe的路径,笔者本地Notepad++.exe的安装路径为
F:/Program Files (x86)/Notepad++/notepad++.exe,最终设置如下图所示;
- (4)双击打开文件,文件自动调出notepad++窗口。
4.编写设计代码
在Sources-》Design Sources中,找到设计文件“ex01”,然后双击打开文件,编辑设计代码如下:
module ex01(
input sys_clk_i, //时钟为100MHz
output reg led //led输出信号
);
reg[31:0] cnt = 32'd0; //定义20位计数器
reg flag = 1'd0; //标记led状态,用于led初始化
//初始化led状态
always @(posedge sys_clk_i)
if(!flag) led = 1'b0;
else ;
//设置计数器峰值为ffffff,当cnt到达峰值时,led切换当前状态(闪烁)
always @(posedge sys_clk_i)
if(cnt == 32'hffffff) begin
led <= ~led;
flag <= 1'b1;
cnt <= 32'd0; //cnt计数器循环计数,当cnt达到峰值时,重新计数,led状态翻转
end
else cnt <= cnt + 32'd1; //cnt计数器累加
endmodule
5.编写仿真测试代码
- (1)在Sources-》Simulation Sources中,找到仿真文件“sim_ex01”,然后双击打开文件进行编辑;
- (2)编写仿真代码:
module sim_ex01();
reg sys_clk_i;
wire led;
ex01 uut_ex01(
.sys_clk_i(sys_clk_i),
.led(led)
);
initial begin
sys_clk_i = 0;
#1000;
@(posedge sys_clk_i) #2;
repeat(4);
#900_000_000;
$finish;
end
always #10 sys_clk_i = ~sys_clk_i; //产生时钟
endmodule
6.功能仿真
-
(1)选择Project Manage-》SIMULATION,然后点击右键,在弹出的菜单中选择“Simulation Settings”进入仿真设置Settings界面;
-
(2)在Settings界面,选择“General”,
首先,确认FPGA设备名称信息,如有修改,可点击后面的选项框进行修改;
接着,确认目标语言,选择为Verilog;
然后,确认Top Module name(顶层模块名称)信息; -
(3)在Settings界面,选择“Simulation”,
首先,确认Simulation set,如有修改,可点击后面的倒三角进行修改;
接着,确认Simulation top module name(模拟顶层模块名称)信息。
运行仿真
- (1)选择Project Manage-》SIMULATION-》Run Simulation,在弹出的菜单栏中选择“Run Behavioral Simulation”,随后等待进入仿真界面;
- (2)选择SIMULATION-》Run Simulation,然后右键点击Run Simulation,然后在弹出菜单中选择Run Behavioral Simulation,等待进入simulation窗口;
- (3)在simulation窗口,点击“Run All”图标,或者在菜单栏选择Run-》Run All,运行仿真,在此窗口可查看设计代码中各变量的变化值情况,来验证设计代码的准确性。
7.代码综合
-
(1)选择Project Manage-》SYNTHESIS-》Run Synthesis,执行综合;
-
(2)综合结束后,在弹出的对话框中选择“Open Synthesized Design”,进入综合设计界面;
-
(3)在Device窗口可以查看FPGA内部逻辑框图(此步无需实际操作,仅供了解信息)
8.设置约束文件
(1)选择Project Manage-》SYNTHESIS-》Schematic,随后在Schematic窗口中,选择“2 I/O Ports”,进入I/O管脚配置界面;
- (2)在I/O管脚配置界面,可以查看当前端口的名字,端口类型以及端口电平信息(此部分信息默认即可);用户需要操作的信息为Package Pin,需要根据用户手册找到设计文件中使用的信号所对应的FPGA接口实际管脚进行设置,设置后点击保存;
(3)此时,打开constr1.xdc可以看到当前端口设置已被写入文件;
-
(4)设置系统时钟
在SYNTHESIS中选择Edit Timing Constraints,进入Timing Constraints界面,在此界面选择添加图标,随后进入时钟设置界面,对时钟进行设定;
-
(5) 设置系统工作电压,在菜单栏中选择Tools-》Edit Device Properties …,进入配置界面,在配置界面选择Configuration,随后对Configuration Voltage和Configuration Bank Voltage Selection进行配置;
-
(6)此时,打开constr1.xdc可以看到时钟和电压信息已被写入文件;
9.代码执行
- (1)选择PROJECT MANAGE-》IMPLEMENTATION-》Run Implementation;
10.生成bitstream文件(此文件用于FPGA在线编程)
- (1)选择PROJECT MANAGE-》PROGRAM AND DEBUG-》Generate Bitstream(右键)-》Bitstream Settings,进入Settings设置界面;
- (2)在Settings界面,选择Project Settings-》Bitstream-》Configure additional bitstream settings,进入设备属性界面,在该界面,设置SPI Bus Width为4;
- (3)确认执行生成bitstream文件操作;
11.FPGA在线编程
注:执行此操作之前,需将开发板使用jtag调试器连接至电脑,并给开发板上电,如果开发板没有自动连接,需要选择PROGRAM AND DEBUG-》Open Hardware Manager-》Open Target(右键)-》Auto Connect,先将开发板与vivado建立连接。
- (1)选择PROJECT MANAGE-》PROGRAM AND DEBUG-》Program Device(右键)-》选择弹出的FPGA型号;
- (2)在Program Device界面中,选择Bitstream file文件,然后执行Program操作,即可完成bitstream文件的编程(注此文件掉电即丢失,如若希望程序固化,需要将程序编程至SPI FLASH芯片内部)。
FPGA程序下载成功后,可以看到LED灯闪烁。
12.生成memory配置文件(用于将程序固化至SPI FLASH芯片内部)
- (1)在菜单栏中,选择Tools-》Generate Memory Configuration File…;
() - (2)在配置界面,首先在Memory Part选择硬件使用的SPI FLASH型号,接着在Filename中输入要保存的mcs文件路径和名称;
- (3)在Options中,设置SPI端口类型,然后勾选Load bitstream files,并选择Bitfile的文件路径(Bitfile文件的默认路径为./xxxx.runs/impl_1/xxxx.bit,如若执行多次implementation,将会存在多个impl_x文件,此时根据自己设定选择最新生成的bit文件即可);
13 程序固化至SPI FLASH
-
(1)在HARDWARE模块中找到FPGA型号,然后右键,选择Add Configuration Memory Device,进入设备选择界面,选择开发板上SPI FLASH芯片型号,至此完成SPI FLASH芯片的配置。
-
(2)在Hardware模块中中,选择spi flash芯片型号(右键),然后选择Program Configuration Memory Device…;进入memory配置界面;
-
(2)在memory配置界面,选择Configuration file以及PRM file文件(此两个文件位于同一路径下),并选择Program Operations选项,随后点击“ok”,等待文件自动烧写完成,即完成SPI FLASH文件的固化,随后开发板断电,然后在上电,即可自动从SPI FLASH芯片内部加载已下载的代码并自动运行。
-
(3)待程序固化至SPI FLASH成功之后,给开发板断电,然后再次上电,可以看到开发板的led灯开始闪烁,至此表明led闪烁的设计代码验证成功。
tips
- (1)创建工程之前,务必确定好FPGA型号以及SPI FLASH型号;
若FPGA型号错误,会导致生成Bitstream文件失败。
若SPI FLASH 的BUS WIDTH设置错误,亦会导致生成Bitstream文件失败。 - (2)工程出现警告信息时,仔细查看Tcl Console的提示信息,这个很重要。