vivado进阶:FPGA实现(一)

馋奶兔 提交于 2019-12-22 01:30:47
中国大学MOOC

[UESTC数字设计FPGA应用]

通过实践,进一步掌握硬件描述语言(Verilog HDL)与vivado开发的全过程。在vivado的开发环境下,使用Verilog HDL编译代码。根据原理图和对于端口的说明,编写约束文件,对电路进行实现,并进行仿真,然后下载到电路板验证。
以简单工程多数表决器为例,进行实现。掌握Verilog HDL的基本语言,FPGA的仿真方法,以及开发板的使用方法。

第一个工程:多数表决器

使用FPGA实现简单的组合逻辑电路。
三个输入分别是a,b,c,输出是f。

基本思路:

1、根据问题的描述作出真值表;
2、得到最小项表达式;
3、卡诺图圈图得到逻辑函数的表达式;
4、vivado下新建工程进行开发。

进入工程

小贴士:
1、左侧PROGECT MANAGER(工程管理)中有Settings设置一项,可以对使用的开发板进行修改。
在这里插入图片描述
2、在比特流选项中选择-bin.file,是需要最后下载到FPGA配置的Flash。
3、发现自己找不到Sources的小框之后,可以单击左侧栏中的PROGECT MANAGER来找到。
4、界面右上角会显示项目的工作状态。

设计源文件代码

module v_dsbjq(
  input a,
  input b,
  input c,
  output f
    );
    assign f=a&b|b&c|a&c;   //f=ab+ac+bc
endmodule

之后可以进行RTL分析,发现其实正好是一个门级电路。

进行仿真

1、创建仿真文件,建议命名前加sim_,便于记忆区分。该工程的仿真文件命名为sim_dsbjq。
注:仿真文件不需要任何的输入输出参数

module sim_dsbjq();
 reg a,b,c;   //定义reg型,
 wire f;     //定义输入输出变量
 v_dsbjq  u1(a,b,c,f);  //调用模块,命名实例,源模块和仿真模块参数名称这里相同
 initial
 begin
 a=0;b=0;c=0;
 end
 always #10 {a,b,c}={a,b,c}+1;
endmodule

可以看到实现了模块的调用
使用reg型变量的原因:
1、为模块的激励信号准备寄存器,其值可以在仿真文件中改写,如果使用wire型变量就不行了
2、仿真的时候需要对模块施加激励信号,激励信号就从这些寄存器生成
3、可以修改值,存储值,用于仿真的激励信号很合适

调用模块成功的条件:
1、a,b,c这三个寄存器变量和模块dsbjq的三个输入变量同名
2、f这wire变量f和模块dsbjq的输出变量f同名
3、且调用顺序和模块dsbjq的接口信号顺序一致!

module sim_dsbjq();
 reg in_a,in_b,in_c;   //定义reg型,
 wire out_f;     //定义输入输出变量
 v_dsbjq  u1(
 .a(in_a),
 .b(in_b),
 .c(in_c),
 .f(f));  //调用模块,命名实例,源模块和仿真模块参数名称这里相同
 initial
 begin
 in_a=0;in_b=0;in_c=0;
 end
 always #10 {in_a,in_b,in_c}={in_a,in_b,in_c}+1;
endmodule

换一种调用方式:
.a(in_a) 前者表示源模块中的参数,括号是送给该参数的值,也可以直接给0或者1。

使用工程管理窗口的“仿真”选项,进行行为级仿真,仿真结果会在右侧以页框的形式出现。

编写约束文件

在添加设计源文件和仿真文件相同的界面目录中添加约束文件(constraints),进入相同流程,所不同的是创建新文件名:con_dsbjq(习惯前缀con_),文件类型为XDC。finish之后可以看到在文件目录下约束项目录下出现该文件。

注:约束文件的功能

1、为模块分配FPGA管脚;
2、为FPGA的管脚配置输入输出电平标准或其他属性;
3、根据于模块信号的输入输出类型,配置被约束的FPGA管脚是输入还是输出。

## switches拨码开关
set_property PACKAGE_PIN F3 [get_ports a]
set_property IOSTANDARD LVCMOS33 [get_ports a]
set_property PACKAGE_PIN H4 [get_ports b]
set_property IOSTANDARD LVCMOS33 [get_ports b]
set_property PACKAGE_PIN N4 [get_ports c]
set_property IOSTANDARD LVCMOS33 [get_ports c]
## led 灯管显示
set_property PACKAGE_PIN E3 [get_ports f]
set_property IOSTANDARD LVCMOS33 [get_ports f]

注:
1、set_property : 这里可以理解为关键字
2、PACKAGE_PIN E3 [get_ports a] : 管脚E3表示值a
3、IOSTANDARD LVCOMS33 [get_ports a] : 电平标准是3.3V
4、## 代表注释

综合实现

基本过程:

1、Run Synthesis进行综合
在这里插入图片描述
2、综合完成后显示弹窗,可以直接在弹窗中进行实现,也可关闭显示框,在Flow Navigator中进行Run Implementation。
3、实现结束,打开实现的设计(可由弹出窗口打开),点击schematic,出现最后的电路图。
4、Package页框也可以在工具栏——Layout——I/O Planning中打开。
可以通过行列观察到我们所用到的管脚。(双击放大可看到)
在这里插入图片描述

5、在device页框中放大可以观察到我们使用到的管脚,会发现我们只用到了极小的一部分。ctrl+滚轮 放大可以看到我们的H4管脚:
在这里插入图片描述

生成比特流文件

在综合实现之后,就可以生成比特流文件了。比特流文件有两种类型:bit文件用于调试,bin文件用于最终下载到实验板的Flash芯片,每次上电后会根据Flash中的内容对FPGA进行配置。

调试

1、在左侧栏最下面,找到PROGRAM AND DEBUG;
2、点击Generate Bitstream;
(注:综合,实现和生成比特流文件较费时,一分钟以上)
一般生成的比特流文件保存路径为后缀为runs的文件夹->impl_1文件夹中
3、生成之后,打开硬件管理器,和生成比特流文件在同一处,也可由生成比特流文件之后的弹出窗口界面来打开。
在这里插入图片描述
4、点击open target,点击自动连接。(此时保证实验板已连接)
5、观察到设备已连接。
在这里插入图片描述
6、点击上侧绿色区域Program Device,可以找到保存路径。在打开窗口中点击program。比特流文件后缀为bit。
7、在实验板上操作,观察到实验成功。

下载到Flash

1、断电或者复位之后,发现实验不成功,显示的仍然是原先固化的程序。说明我们的文件没有下载到Flash,只是调试通过了。
2、需要下载到Flash,使程序断电之后仍然存在。

需要做的:
1、点击 “打开硬件管理” 最后一项,添加配置储存器件。
在这里插入图片描述
2、输入栏中输入25q32,选择3.3V,点击OK。
在这里插入图片描述
3、配置文件,选择bin文件,点击OK。开始下载到Flash。
在这里插入图片描述
(下载比调试还要慢很多很多)
4、下载到产品。工作就OK!下载到FLASH时速度慢,复位或下电后FPGA的功能能保存。
在这里插入图片描述
5、这个时候发现板子还是没有变化,只需要再次复位。就可以观察到实验板按照我们所需要的工程正常工作了。

任务完成

以上就是实现FPGA的一个简单工程及基本步骤,UESTCer冲冲冲!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!