FPGA 点亮LED灯

news2024/11/24 0:36:55

设计流程

  1. 首先对项目要有一个全局的考虑,分析项目需要几个模块构成,确定各个子模块的关系和信号之间 的相互关系,然后确定模块的端口信号有哪些
  2. 根据每个模块的功能并结合芯片、接口的时序手册画 出该模块能正常工作的时序波形图
  3. 根据所画的波形图严格设计代码,保证设计代码的仿真结果要和 所画的波形保持一致
  4. 代码编写完成后对代码进行编译,目的是检查代码中的语法错误。若代码存在语法 错误,对代码进行修改,再次编译,直至通过编译;
  5. 根据 RTL 代码设计合理的 Testbench 进行逻辑仿真(也称为前仿真、功能仿真);
  6. 使用仿真工具进行仿真,并将仿真出来的波形和 画出 的时序波形图进行对比,如果对比有差别则修改代码直至相同;
  7. 绑定管脚后进行分析综合、布局布线,然后下载到硬件板卡中,此时如果硬件板卡 能够正常工作,则说明前期的设计和编写的代码都正确;如果硬件板卡不能够正 常工作,查找并解决问题,反复迭代直至正确实现功能。

功能

通过按键控制一个 led 灯的亮灭,按键未被按下时 led 灯处 于熄灭状态,按键被按下时 led 灯处于点亮状态

 

模块设计

在这一部分,需要根据功能设计模块的结构和分析端口信号。

 

 点亮LED灯,需要两个端口,一个端口负责接在按键上,接收输入信号,一个负责接在LED上,输出信号到LED等上。

波形设计

 框图结构和端口信号设计完毕后就需要设计框图结构下模块功能的实现,也就是输入 和输出之间怎么样的影响关系。输入和输出满足信号与系统的关系,这种关系是一种时序 的、逻辑的关系,即既有时间上的关系又有逻辑上的关系。

 新建工程

 

 1 是这个新建的工程的位置  2 是这个工 程的名字  3 是整个工程设计顶层的文件名,这个名字保持和 2 中的命名一 致即可。

 1 框是选择使用哪个系列的芯片

 2 框是选择该芯片的封装类型

 3 框是管脚数量,选择 256;

 4 框是速度等级,选择 8

 REL代码的编写

 RTL 代码编写出的模块叫 RTL 模块(可综合模块)。RTL 代码能够综合出真实的电路。

module led
(
    input wire key_in,  //输入按键
    output wire led_out  //输出控制led灯
);

assign led_out=key_in;

endmodule

切换到Files ,将文件添加到工程中。 

代码的分析和综合

点击如图 9-38 所示的图标进行代码的分析和综合,该步骤的目的是首先检查语法是否 有错,其次是综合器将代码解释为电路的形式。

RTL 视图的查看

 打开后的界面如图所示,这就是我们设计的硬件电路结构,可见输入是 key_in,然后 通过一根线连接到输出 led_out

Testbench 的原理

 Testbench 是测试脚本.

测试设计电路的整体功能、部分性能是否与预期的目标相符.

编写 Testbench 进行测试的过程如下:

1. 产生模拟激励(输入波形);

2. 将产生的激励加入到被测试模块并观察其输出响应;

3. 将输出响应与期望进行比较,从而判断设计的正确性。

仿真设置

1 框中“Tool name:”栏选择“ModelSim”,“ModelSim”就是独立 的 ModelSim,而“ModelSim-Altera”是安装 QuartusII 时自带的 ModelSim; 

2 框中“Format for output netlist:”栏是选择输出网表的语言格式,该网表主要用于后仿真,因为 我们在逻辑设计中往往不做后仿真,所以这里默认即可;

3 框中“Time scale:”栏是选择 输出网表的时间单位,所以也默认即可;

4 框中的“Output direction:”选择输出网表 的位置,这里我们默认即可。

NativeLink 的设置

基于 NativeLink 的设计就是在 QuartusII 中设置好一些参数后直接打开 ModelSim 软件 可以立刻看到仿真的结果

 

 1 框“Test bench name:”就是前面“Comple test bench:”框中的名 字,也就是上图中新建的这个 Test Benches 的名字(一般情况下框1 和框2 的名字保持一 致即可);

2 框“Top level module in test bench:”是 Testbench 顶层的名字,这里只有一个 层次那就是图 9-59 所示中的名字 tb_led;

3 是“End simulstion at:”是设置打开 ModelSim 时波形运行多久后停止,如果这里不设置就需要在仿真代码中仿真完毕的地方添加 “$stop”代码暂停仿真,或者在弹出的 ModelSim 界面中按暂停按钮,否则 ModelSim 会一 直运行。我们设置的是 1us,这个时间不长不短刚刚好,即打开 ModelSim 后运行 1us 后波形停止运行,如果所需要观察的波形 1us 时刻之后,可以在 ModelSim 中再设置运行时间后 继续运行;

4 框“File name:”选择 sim 文件夹下的 tb_led.v 文件。都设置好后点击 “Add”将 tb_led.v 文件添加进来。

`timescale  1ns/1ns

module  tb_led();

//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
//wire  define
wire    led_out ;

//reg   define
reg     key_in  ;

//初始化输入信号
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 观察波形

 放大镜图标

 点击框中第一个按钮即添加参考线

点击第二个按钮即去掉参考线

 左下角处的“小锁”即可固定参考线,被固定的参考线显示红色

 其中○1 框中的图标是波形复位

○2 框是设置运行一次仿真的时间,根据实际观察波形的需要填写相应的时间。但仿真 的时间越久所需要等待的时间也会越久,所生成的仿真文件也会越大;

○3 框中的第一个图标是运行左边设置的时间值,图中显示的是 100ps,那么点击一次 就运行 100ps,运行完 100ps 后就会自动停止,也可以手动输入其他的时间单位和时间值

 3 框中的第二个和第三个图标点击一次后波形会一直运行下去,直到点击第四个和第五个 按钮时才会停止;

○4 框中的图标分别是波形的下降沿定位和上升沿定位,当选中要观察的信号时,再点 击这两个按钮时参考线就可以立刻定位到该信号的下降沿或上升沿,再次点击即跳到下一 个下降沿或上升沿;

○5 框中的第一个和第二个图标分别是波形方大和缩小(波形的放大缩小也可以按住键 盘上的“Ctrl”键同时滚动鼠标滚轮)。第三个图标是全局波形显示。第四个图标作用是 将参考线位置处的波形进行放大。第五个图标的作用是将参考线处的波形移动到波形显示 窗口的最开头处。

引脚约束

仿真结束后即验证了代码设计的正确性,也就是说可以进行上板验证了,但是在上板 之前还需要进行引脚约束,就是根据硬件原理图确定按键和 led 分别与 FPGA 芯片的哪个 引脚对应。

 

 (1) Node Name:RTL 代码中定义的端口名字。

(2) Direction:管脚的输入输出方向。

(3) Location:管脚绑定的位置。

(4) I/O Bank:用于支持对应不同的电平标准,即 VCCIO。每个 Bank 只能有一种电压标 准,一般情况下选择默认值就好。一种颜色下的 I/O 口代表一组 Bank。当管脚的 Location 约束完成以后,I/O Bank 会自动进行填充。

(5) VREF Group:Bank 内部的细分区域,非修改属性,会自动填充。

(6) I/O Standard:对管脚内部的 I/O 进行不同的电平约束。FPGA I/O 的电压由 I/O Bank 上 的 VCC 引入,一个 Bank 上如果引入了 3.3V 的 TTL 电平,那么此时整个 Bank 上输出 3.3V 的 TTL 电平。设置好以后工具可以结合 Current Strength 一起计算功率。如果没 有特殊要求默认即可。 (7) Reserved:这个是对管脚内部的 I/O 逻辑进行约束的,这个约束的是 FPGA 在 I/O 端的 输入输出区域的逻辑。无特殊要求可以为空。

(8) Current Strength:是驱动电流强度,一般选择默认值。如果需要驱动大功率的电路, 可以在 FPGA 外围加驱动电路。

(9) Slew Rate:是电压转换速率,表示单位时间内电压升高的幅值,跟信号跳变时间有 关,一般选择默认值。

(10) Differential Pair:差分管脚。

(11) Filter:通过过滤选项显示指定种类的管脚。

 全编译

 全编译和分析综合的不同是全编译需要进行布局布线,管脚绑定后就可以对全局进行 布局布线了。

1 框是综合后的资源使用率报告; 

2 框是综合后提示的错误警告数,这里没有错误,只有警告和严重警告存在,一共 7 个;

3 框是编译时每一步详细的过程,包括执行每一个部分所使用的具体时间,从上到下 顺序执行,第一个是之前进行过的分析与综合,第二个是布局和布线,第三个是生成程序 文件,第四个是静态时序分析,第五个是写入网表,这 5 个步骤编译后都是自动完成的不 需要进行干涉,如果后期自动完成不能满足需求是需要手动进行设置以实现优化

4 框中从左往右依次是错误、严重警告、警告,只要不出现错误就暂时先不用管,当 警告或者严重警告影响功能时再去分析;

5 框是编译的总进度;

6 框是在编译过程中实时显示的时间,该时间随着工程量对增大而增大,硬件的编译 一次的时间是非常慢的,不像软件那样瞬间就完成了,所以这也是需要进行仿真的原因之 一。

通过 JTAG 将网表下载到开发板 

开发板连接 12V 直流电源,USB-Blaster 下载器 JTAG 端连接开发板 JTAG 接口,另一端连接电脑 USB 接口。线路正确连接后,打开开关为板卡上电。

 打开下载界面。

1 框是硬件连接设置,当前显示的是“No Hardware” 即 没 有 连 接 到 硬 件 , 我 们 需 要 选 择 连 接 的 硬 件 是 USB-Blaster , 点 击 “ Hardware Setup...”

2 框是选择下载的方式,我 们选择“JTAG”下载模式 

3 框是下载的进度表,下载成功后会在框内显示绿色并出现 “100%(Successful)”;

4 框是下载的文件,这里是“led.sof”文件。

当设置完成所有的下载设置后

 未使用管脚的默认设置

 在做一个个例子的时候不可能同时全部用上所有 的 FPGA 管脚,而在 Quartus 软件中默认未使用管脚的状态为弱上拉输入,所以未使用到 的管脚上也是有电压的,只是驱动能力很弱,这往往会导致一些不安全的隐患,所以我们 需要将未使用管脚的状态设置为三态输入

 

 程序的固化

当你把下载网表的上板断电后再重新上电发现 之前的功能已经不存在了,也就是说下载后的网表消失了.我们使用的这款 FPGA 芯片是基于 SRAM 的结构,即下载后的网表存储在 FPGA 内部的 SRAM 中,我们也知道 SRAM 有掉电易失的特性,这也就是我们为什么掉电 后功能就消失的原因

所以我们要想使网表重新上电后仍然存在就需要将网表存储到片外 的 flash 中,flash 芯片型号为 WinBond 25Q16,存储容量为 16Mbit(2M 字节),采用 SPI 协议和 FPGA 进行通信,可做为 FPGA 的配置芯片

“Programming file type:”栏是选择输出文件的类型,我们选择“JTAG Indirect ConfIguration File(.jic)” 

 “Configuration device:”栏是 flash 的型号,我们选择“EPCS16”

“File name:”栏是选择输出.jic 文件的位置

 如图 9-112 所示,点击“Input files to convert”框中的“Flash Loader”后会发现“Add Device...”从不能被选择的情况下可以被选择,然后点击“Add Device...”

 如图 9-113 所示,选择我们使用的 FPGA 芯片所属的型号,在“Device family”框中将 “Cyclone IV E”前的括号勾选上,在“Device name”框中将“EP4CE10”前的括号勾选 上,然后点击“OK”。添加后如图 9-114 所示。

 

 

 先将“Program/Configure”下的方框打上钩,然后点击“Start”执行 程序的固化。

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS3【垂直对齐方式、光标类型、 边框圆角 、overflow溢出部分显示效果 、元素本身隐藏】

文章目录二、装饰2.1 认识基线&#xff08;了解&#xff09;2.2 文字对齐问题2.3 垂直对齐方式2.4 小结2.5&#xff08;拓展&#xff09;项目中 vertical-align 可以解决的问题2.6 光标类型2.7 边框圆角2.8 边框圆角的常见应用2.9 小结2.10 溢出部分显示效果2.11 小结2.12 元素…

智慧医院信息化建设解决方案

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。 【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01; 完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 远程会诊 云…

Java的设计模式

本文档是学习后的个人总结&#xff0c;用于备查&#xff0c;如果有冒犯&#xff0c;请联系我删除。 参考文档&#xff1a; 1、简单工厂模式&#xff0c;工厂方法模式&#xff0c;抽象工厂模式 2、Java中常用的设计模式 上面这个链接写的特别清楚&#xff0c;也有代码示例&#…

记一次云服务器EIP出现异常对外攻击的问题

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 首先祝大家圣诞快乐&#xff0c;Merry Christma&#xff01; 中毒了 今天云主机运维人员告诉我说&#x…

【Flask框架】——26 ORM关联关系

1、表的外键关联 使用SQLAlchemy创建外键非常简单。在从表中增加一个字段&#xff0c;指定这个字段外键的是哪个表的哪个字段就可以了。从表中外键的字段&#xff0c;必须和主表的主键字段类型保持一致。 这种关联只关注数据表之间的外键关联&#xff0c;不考虑Python对象之间…

ORB-SLAM3代码和算法学习—双目和单目初始化

0总述 ORB-SLAM3算法中视觉的初始化依旧放在tracking线程中&#xff0c;因此在tracking中没有为imu模式设置单独的初始化函数&#xff0c;而IMU的初始化是在localMapping中实现的。 很有用的参考链接&#xff1a;https://cloud.tencent.com/developer/article/1761043 1双目…

【高阶数据结构】搜索二叉树

&#x1f308;欢迎来到数据结构专栏~~搜索二叉树 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句…

Word控件Spire.Doc 【评论】教程(2):在 C#、VB.NET 中删除和替换 Word 文档中的注释

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

130页5万字某市档案馆数字档案馆建设方案

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01; 完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 国家档案局证…

MySQL主从搭建

MySQL主从搭建一 主从配置原理二 搭建步骤&#xff08;基于两个docker容器&#xff09;三 django实现读写分离3.1 配置数据库3.2 models中创建表3.3 数据库迁移3.4 指定要使用的数据库四 Pycharm远程连接服务器进行代码的运行与调试五 Pycharm远程链接docker开发5.1 操作 docke…

SSM图书管理系统(增强版,附源码)

前篇引入&#xff08;新人必看&#xff09;&#xff1a;SSM图书管理系统&#xff08;原版&#xff09; 之前给大家分享过SSM图书管理系统项目的源码&#xff0c;热度较高&#xff0c;但我也发现功能并不是很全面&#xff0c;所以这次对系统进行了功能增强&#xff0c;以下是系…

新手入门搭建一个spring boot项目

1. 打开Idea,新建一个maven项目&#xff0c;详细情况见下图&#xff0c;&#xff08;idea版本2021.1.2&#xff09; 2.查看新建项目的maven包是否存在&#xff0c; 注意&#xff1a;maven包需要自己去下载&#xff0c;注意要下载与版本对应匹配的包 3.导入spring boot 相关的依…

springboot 连接不上 redis 的三种解决方案!

针对于springboot 连接不上 redis 这种情况&#xff0c;首先&#xff0c;我们最简单直接的方法就是需要确认Redis是否已经正常启动&#xff08;验证方法&#xff1a;如果安装在Linux下的话可以使用ps-ef|grep redis来进行确认是否开启&#xff09; 如果未开启&#xff0c;我们可…

STL-string的接口使用及模拟实现

文章目录string类的介绍string类的常用接口介绍 构造相关 无参构造字符串构造拷贝构造 容量相关的接口 sizereserveresizecapacityemptyclear 数据访问及遍历相关的接口 operator[]begin endrbegin rend 修改数据相关的接口 push_backoperatorinserterasec_strfind npossubs…

Redis搭建主从集群

搭建集群 建集群的第一件事情我们需要一些运行在 集群模式的Redis实例。这意味这集群并不是由一些普通的Redis实例组成的&#xff0c;集群模式需要通过配置启用&#xff0c;开启集群模式后的Redis实例便可以使用集群特有的命令和特性了。 下面是一个最少选项的集群的配置文件…

@Builder注解在子类中使用遇到的问题

场景 在项目开发中&#xff0c;需要基于某个类进行一些字段的拓展&#xff0c;那么自然而然想到的做法是extends该类。而两个类都需要使用Builder进行构造。代码如下&#xff1a; Data Builder AllArgsConstructor NoArgsConstructor public class EmployeeDto {private Stri…

详解 Vue3 中如何使用 Proxy 来实现响应式的技术~

详解 Vue3 中如何使用 Proxy 来实现响应式的技术~写在前面剖析 Vue2 中是如何实现响应式的Vue2 的响应式存在什么问题&#xff1f;Vue3 响应式一、ref 函数二、reactive 函数reactive 响应式原理 - ProxyVue3 中的响应式解决了 Vue2 中存在的问题写在前面 Vue3 中的响应式原理…

C++:STL:常见容器:stack,queue, list

一&#xff1a;stack容器 1.1: stack基本概念 概念&#xff1a;stack是一种先进后出 &#xff08;First in last out FILO&#xff09;的数据结构&#xff0c;它只有一个出口。 栈中&#xff1a; 1&#xff1a;只有栈顶的元素才可以被外界使用&#xff0c;因此栈不允许有遍历…

从FrameDebugger看Unity渲染

从FrameDebugger看Unity渲染(一) Unity如何渲染一个3D2D的游戏画面&#xff0c;今天通过FrameDebugger来看下Unity内置渲染管线的渲染策略, 后续再出一些URP渲染管线相关的文章。 对啦&#xff01;这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c…

MyBatis 实现复杂 Sql 查询

resultMap 结果映射 resultMap 元素是 MyBatis 中最重要最强大的元素&#xff0c;之前所写的 sql 语句&#xff0c;返回值都是简单的基本数据类型或者某一个实体类&#xff0c;比如下面这段 sql 返回的就是最简单的 User 类型。 <select id"getUserById" result…