FPGA 第5讲 点亮你的LED灯
时间:2024.11.10
一、学习内容
1.设计流程(9个步骤)
2.项目工程的文件体系
我们将不同类型的文件进行分类存放在不同的文件夹中,这样方便文件的查找、管理和移植。
2.1新建文件夹
doc文件夹:
主要放置一些文档资料,比如数据手册、我们绘制的波形图以及自己编写的文档或项目日志等。
quartus_prj文件夹:
主要放置工程文件
rtl文件夹:
主要放置可综合的代码,即最后可以生成硬件电路的代码,这部分代码主要是寄存器描述的、寄存器传输级的代码,rtl是寄存器传输级的英文首字母缩写。
sim文件夹:
主要放置可综合代码的仿真文件。
3.点亮你的LED灯
3.1设计规划
功能实现:可以使用按键控制LED灯的亮灭
层次划分(将整个系统划分为子功能模块):一个模块即可
硬件资源:KEY1-->LED6
原理图查看:
3.2波形绘制
打开doc文件夹-->新建一个visio绘图-->打开visio软件,不选择绘图类型-->进行波形工具箱的加载-->进行波形图的绘制
模块框图的绘制:模块框图的绘制只需要知道输入信号、输出信号即可,具体的模块功能的实现在波形图中体现。
波形图的绘制:
输入信号一般使用绿色填充,输出信号一般使用红色填充,如果使用了内部变量,可以填充为黄色。
按键未按下时输出0,按下时输出1,led是输入0点亮,输入1熄灭。
3.3代码编写
打开rtl-->新建.v文件-->进行代码的编写
module led
(
input wire key_in ,//输入按键
output wire led_out //输出控制 led 灯
);
//led_out:led 灯输出的结果为 key_in 按键的输入值
//因为输入信号和输出信号一致,所以直接使用组合逻辑将输入信号赋值给输出信号
assign led_out = key_in;
endmodule
3.4代码编译
代码编译之前,先要新建工程
工程新建完成,将编写的.v文件加载到工程当中
添加.v文件-->apply
3.5逻辑仿真
编写测试文件-->Files-->添加文件
`timescale 1ns/1ns
module tb_led();
//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
//wire define
wire led_out ;
//reg define
reg key_in ;
//********************************************************************//
//***************************** Main Code ****************************//
//********************************************************************//
//初始化输入信号
initial key_in <= 1'b0;
//key_in:产生输入随机数,模拟按键的输入情况
always #10 key_in <= {$random} % 2; /*取模求余数,产生非负随机数 0、1
每隔 10ns 产生一次随机数*/
//********************************************************************//
//**************************** Instantiate ***************************//
//********************************************************************//
//------------- led_inst -------------
led led_inst
(
.key_in (key_in ), //input key_in
.led_out(led_out)
//output led_out
);
endmodule
仿真的设置-->跳转到modelsim软件中查看波形
3.6管脚绑定-->全编译-->上板验证
3.7程序的固化:
我们下载到FPGA的程序断电之后就会丢失,进行程序的固化之后,断电后重新上电,仍可以执行固化的程序。
生成jic文件-->选择芯片-->添加器件、添加文件-->generate
二、知识点和小技巧
1.正确的设计流程(9个步骤)
正确的设计流程是开发项目的关键,大概主要分为以下几个步骤:
1. 设计规划
首先我们要进行设计前的规划,即对项目要有一个全局的考虑,分析项目的具体需求来设计系统的结构、划分系统的层次,确定各个子模块的结构关系和信号之间的相互关系,然后确定模块的端口信号有哪些;
2.波形绘制
根据每个模块的功能和自己的理解并结合芯片、接口的时序手册我们使用 Visio 画出该模块能正常工作的时序波形图;
3.代码编写
根据所画的波形图严格设计代码,所谓的严格就是要保证设计代码的仿真结果要和所画的波形保持一致;
4.代码编译
代码编写完成后对代码进行编译,目的是检查代码中的语法错误。若代码存在语法错误,对代码进行修改,再次编译,直至通过编译;
5.逻辑仿真
根据 RTL 代码设计合理的 Testbench 进行逻辑仿真(也称为前仿真、功能仿真);
6.波形对比
使用仿真工具进行仿真(可以使用软件自带的仿真工具,也可以使用其他的第三方仿真工具,本教程中我们使用 ModelSim),并将仿真出来的波形和用 Visio 画出的时序波形图进行对比,如果对比有差别则修改代码直至相同;
7.绑定管脚、分析综合布局布线、上板验证
绑定管脚是将工程中的输入输出信号和对应的FPGA的芯片的I/O管脚进行绑定,这一步可以通过引脚勾选或者编写引脚约束来实现管脚绑定。
绑定管脚后进行分析综合、布局布线,对整个工程进行分析综合、布局布线,生成网表文件。
然后下载到硬件板卡中,此时如果硬件板卡能够正常工作,则说明前期的设计和编写的代码都正确;如果硬件板卡不能够正常工作,查找并解决问题,反复迭代直至正确实现功能,并重复后面的流程,最终保证硬件板卡能够正常工作。
2.波形绘制的好处
波形图的绘制有利于模块功能实现的理解,同时波形图的绘制更加方便代码的编写。
模块功能的实现就是通过我们的输入信号得到我们需要的输出信号,输入信号和输出信号之间的关系近似为时间和逻辑的关系,表示这种关系最清晰和直观的方式就是波形图,FPGA本身是并行执行,当信号较多时,仅靠我们的记忆和联想,很难理清各信号之间的时序和逻辑的关系,所有我们可以通过绘制波形图来将这种关系表达出来。
参考波形图可以更加清晰直观地了解各个信号之间的跳变点和跳变条件,代码写起来更加轻松,准确率更高。同时,如果进行项目的升级,参考波形图更加方便直观。
3.波形工具箱的加载
FPGA_DESIGN:可以进行波形图的绘制
状态机形状:可以进行状态机的绘制
逻辑图形状:常用的逻辑门电路