论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
DevOps与敏捷开发
›
跟着逻辑先生学习FPGA-实战篇第二课 6-2 LED灯流水灯实 ...
跟着逻辑先生学习FPGA-实战篇第二课 6-2 LED灯流水灯实验 ...
立山
论坛元老
|
2024-12-31 00:56:47
|
显示全部楼层
|
阅读模式
楼主
主题
1030
|
帖子
1030
|
积分
3090
** 硬件平台:征战Pro开辟板
软件平台:Vivado2018.3
仿真软件:Modelsim10.6d
文本编译器:Notepad++**
征战Pro开辟板资料
链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwd=x3u8
提取码:x3u8
1 知识背景
我们在《LED 灯闪烁实验》中对 LED 灯作了详细的先容,如果各人对这部分内容不是很认识的话, 请参考《LED 灯闪烁实验》中的简介部分。
2 实验任务
流水灯是指同一时刻只有一个灯处于点亮状态,其余的 LED 灯处于熄灭状态,然后每隔一段时间 LED 灯从左往右依次点亮,从而形成流水灯的效果。实验我们将实现 8 个 LED 灯依次点亮,每 100ms 点亮 1 个灯。
3 硬件计划
3.1 原理图分析
八个 LED 灯均连接到了 FPGA 的 IO。当 FPGA 输出 LED0~LED7 为高电平常,发光二极管的正负极有电压差,便会产生电流流过发光二极管,从而点亮 LED 灯;当 FPGA 输出 LED0~LED7 为低电平常,发光二极管正负级没有电压差,也不会产生电流,LED 灯熄灭。
图6-2- 1 发光二极管原理图
3.2 管脚映射表
表6-2- 1 管脚映射表
同学们可能会好奇,为什么原理图中的网络名不和程序中的信号名同等呢?这是由于一般有两个原因:
1. 在公司内里,计划硬件的工程师和计划软件的工程师并不是同一个人,每个人的命名习惯不同,以是就会命名不一样的环境。
2. 硬件上的器件功能和软件上的功能并不一样。好比我们的按键 SW1 ,在硬件上它就是一个按键,但是在软件计划中,我们可以认为它是复位管脚,也可以认为它是控制管脚,以是原理图中的网络名和程序中的信号名没办法同一。
这种环境是很常见的,只要同学们掌握了原理,这个命名恣意怎么变我们都知道怎样去约束 FPGA 管脚。
3.3 编写 XDC 约束文件
4 程序计划
4.1 模块框图
八个灯流水的隔断时间为 100ms,隔断时间的控制需要通过计数器来实现,即通过计数器来实现计时的功能,因此本次实验需要用到系统时钟;除此之外,系统复位在 FPGA 系统中也是必不可少的,当程序出现跑飞等异常环境时,可以使程序恢复至默认状态;由以上分析可知,本次实验需要两个输入的端口,分别为系统时钟和系统复位,输出为 8 位的 LED 端口,模块框图如下图所示:
图6-2- 2模块框图与端口
4.2 计划思路
在硬件计划部分中我们先容过,当 IO 输出高电平 1 时,点亮 LED 灯;当 IO 输出低电平 0 时, LED灯熄灭,因此要想控制 LED3 到 LED10 实现流水灯效果,第一次的时间给 led 端口赋值为 8’b00000001;等候 0.1s 后,给 led 端口赋值为 8’b00000010; 等候 0.1s 后,给 led 端口赋值为 8’b00000100;等候 0.1s,给 led 端口赋值为 8’b00001000;再次等候 0.1s 后,给 led 端口赋值为 8’b00010000,后面依次类推,八个 LED 即可实现流水的效果。
LED 灯流水的隔断为 0.1s,因此接下来还需要做一个 0.1s 的延时,延时的功能可以通过计数器实现,每当计数器计时到 0.1s 后,切换一次 LED 灯的显示状态即可。当计时完成后,开始控制 LED 灯的状态。
LED 共八种状态:
8’b00000001:对应 LED3 点亮,别的熄灭;
8’b00000010:对应 LED4 点亮,别的熄灭;
8’b00000100:对应 LED5 点亮,别的熄灭;
8’b00001000:对应 LED6 点亮,别的熄灭;
8’b00010000:对应 LED7 点亮,别的熄灭;
8’b00100000:对应 LED8 点亮,别的熄灭;
8’b01000000:对应 LED9 点亮,别的熄灭;
8’b10000000:对应 LED10 点亮,别的熄灭;
从上面我们得知,总共8个状态,那不用状态机来实现,岂不是对不起这 8 种状态。
由此绘制出 led_flow 模块的波形图如下图所示:
图6-2- 3 led_flow模块波形图
系统时钟 clk 的时钟周期为 20ns(对应开辟板板载的晶振频率为 50Mhz),计数器计时 0.1s 需要0.1s/20ns = 100000000ns/20ns = 5000000 个时钟周期,由于计数器是从 0 开始计数,以是计数器最大计数到 25000000-1。
4.3 代码编写
限于篇幅,仅贴出部份代码(详见 Source 文件夹下led_flow.v文件)
定义模块端口,代码如下所示:
代码中使用了状态机,定义了九种状态,如下所示:
通过判断计数器cnt计数值到达最大值进行状态跳转,依次为:IDLE–>S0–>S1–>S2–>S3–>S4–>S5–>S6–>S7–>S0–>S1…,代码如下所示:
当状态机计划好以后,就可以根据不同状态给 led 端口赋值,代码如下所示:
5 仿真验证
对 RTL 代码进行仿真之前,我们首先需要编写实验对应的仿真文件(TestBench)。 TestBench 是用于验证功能模块的计划是否符合预期,其内容重要分为以下三个步骤:
1、 向被测功能模块的输入接口添加激励
2、 对被测功能模块的顶层接口进行信号例化
3、 判断被测功能模块的输出是否满足计划预期
5.1 led流水灯模块(led_flow)仿真验证
5.1.1 仿真激励代码编写
流水灯模块的输入端口为系统时钟 clk 和系统复位 rst_n,输出端口为 led。 clk 对应开辟板所板载的 50MHz 的晶振,周期为 20ns,以是 TB 模块产生 clk 时,可以控制该信号每隔 10ns 翻转一次。而系统复位信号对应输入的复位按键,按键在未按下时为高电平,按下后为低电平,以是 TB 模块可以将 rst_n 初始状态赋值为 0,使程序处于复位状态,在延时一段时间后拉高 rst_n 来结束复位。在正常运行之前,先使程序处于一段时间的复位状态,是为了给流水灯模块里的相关信号赋初始值。
TB 模块产生的系统时钟和复位信号通过例化被测模块,将信号传递至被测模块中。
由于在上一章我们已经把仿真脚本写好了,这一章我们只用将 Sim 这个文件夹拷贝到我们当前课程文件夹中,文件结构如下所示:
图6-2- 4 工程结构
打开Sim文件夹,将“tb_led_shark.v”文件改为“tb_led_flow.v”,然后使用“Notepad++”工具打开“tb_led_flow.v”文件,就可以开始编写仿真代码了。
程序中第一行代码定义的仿真单元和仿真精度都是 1ns,对应程序中第 15 行代码表示延时 200ns。程序中第 20 行代码用于产生系统时钟, clk 每隔 10ns 翻转一次,一个完备的时钟周期包含一个高电平和一个低电平,因此系统时钟为 20ns,对应系统时钟频率为 50MHz。
需要注意的是,由于流水灯模块定义的流水隔断较长,为 0.1s,固然 0.1s 从时间上来说比较短暂,但是对于仿真来说,仿真 0.1s 需要的时间较长。尤其是对于复杂的程序来说,有时间仿真几十毫秒,就需要好几个小时,因此为了降低仿真的等候时间和提升效率,一般需要对程序中延时较长的参数在仿真代码中进行重定义,如仿真代码第 23 行将led_flow 模块中的TIME_0S1进行重新定义赋值。
5.1.2 批处置惩罚仿真
仿真代码编写好,就可以使用批处置惩罚仿真了,在该章节我们可以不用再更改 modelsim.bat 文件。sim.do 文件也仅仅只用修改一处地方,如下图所示:
此处改为我们当前的仿真代码模块名:tb_led_flow,改好以后,保存。
双击modelsim.bat,我们就不管了,先喝茶,等软件自已跑(具体步骤参考前一章节),细心的读者会发现,modelsim界面报错了,如下图所示:
图6-2- 5 Modelsim报错信息
报错提示clk在wave.do不能被发现,这是由于我们的wave.do文件还是上一章节的波形,以是此处报错我们不用理会。当我们保存波形文件再运行 sim.do 文件就不会再报该错误了。
5.1.3 仿真波形分析
我们将led_flow模块的信号参加波形窗口,并将波形文件保存,运行sim.do指令(具体步骤参考《6-1 LED灯闪烁实验》),仿真出的波形如下图所示:
图6-2- 6 led_flow模块仿真波形
图6-2- 7 led_flow模块仿真波形(局部放大)
由图可知,状态机(curr_st)跳转正确,led 赋值正确;由图可知,状态机在 cnt 即是 9 时跳转,波形和预期相符。
6 综合编译
在前面我们已经将Source内里的源码(led_flow.v)和约束文件(pin.xdc)通过notepad++软件编辑好了,而且通过Modelsim进行了功能仿真,接下来我们新建Vivado工程并生成bit文件。具体步骤见《6-1 LED灯闪烁实验》章节,此处不再赘述。
7 下载验证
具体步骤见《6-1 LED灯闪烁实验》章节,此处不再赘述。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
立山
论坛元老
这个人很懒什么都没写!
楼主热帖
IoTOS-v1.5.3 新增 智能诊断&会话记录 ...
【学习笔记】WPF-01:前言
基于SqlSugar的开发框架循序渐进介绍( ...
网络安全-技术与实践 书本习题练习 ...
CentOS7 单机版使用kubeadm安装K8S ...
IO流的使用
开源直播课丨大数据集成框架ChunJun类 ...
Python中可以用三种方法判断文件是否存 ...
WEB安全基础入门—身份验证漏洞 ...
解读数仓常用模糊查询的优化方法 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
Oracle
快速回复
返回顶部
返回列表