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:可以进行波形图的绘制

状态机形状:可以进行状态机的绘制

逻辑图形状:常用的逻辑门电路

相关推荐
乾 乾3 分钟前
VSCode 设置中文
c语言
小柯博客8 分钟前
STM32MP1 没有硬件编解码,如何用 CPU 实现 H.264 编码支持 WebRTC?
c语言·stm32·嵌入式硬件·webrtc·h.264·h264·v4l2
青衫码上行43 分钟前
【Java Web学习 | 第九篇】JavaScript(3) 数组+函数
java·开发语言·前端·javascript·学习
jf加菲猫1 小时前
第1章 认识Qt
开发语言·c++·qt·ui
铅笔小新z1 小时前
深入理解C语言内存管理:从栈、堆到内存泄露与悬空指针
c语言·开发语言
m0_495562781 小时前
Swift-snapKit使用
开发语言·elasticsearch·swift
q***18841 小时前
搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
开发语言·后端·golang
多多*1 小时前
一个有 IP 的服务端监听了某个端口,那么他的 TCP 最大链接数是多少
java·开发语言·网络·网络协议·tcp/ip·缓存·mybatis
Kay_Liang1 小时前
Spring IOC核心原理与实战技巧
java·开发语言·spring boot·spring·ioc·依赖注入·控制反转
xcLeigh2 小时前
Rust入门:基础语法应用
开发语言·rust·编程·教程·基础语法