FPGA_学习_03_第一个FPGA程序流水灯

news2025/1/20 14:54:28

学习编程,最重要永远就是动手,本文将在开发板上实现FPGA的“Hello world”→流水灯。本文主要目的是熟悉在Vivado上从零到程序运行起来的基本开发流程。

1 硬件电路介绍

本人购买的开发板接在PL端的只有2个LED灯,刚好达到流水灯的最低要求。

根据原理图可知

1 这两个PL端的LED分别接在FPGA的P15脚和U12脚,另外,要点亮LED灯,FPGA应该输出低电平。

2 我们以开发板上的一个按钮作为系统的复位按钮,端口P16,取名rst_n。(reset negative的缩写,即低电平复位的意思)

3 系统的输入时钟是50MHz,即时钟周期为1s/50_000_000 = 20ns。 系统时钟的引脚为:N18

2 时序设计

以前总听学FPGA的小伙伴说,学FPGA的时候,时序是最重要的,所以我一直着重关注时序。 本文及后续的CSDN博客我都将亲自用Wavedrom-Editor这个软件把时序图绘制一遍,加深理解。

Wavedrom-Editor的json代码如下:

{signal: [
  {name: 'clk',   	wave: 'p.......................'},
  {},
  {name: 'rst_n',	wave: '0.1.....................'},
  {},
  {name: 'cnt',		wave: '2..222222222222222222222', data: ['0', '1', '2', '3','...','MAX','0','1','2','3','...','MAX','0','1','2','3','...','MAX']},
  {},
  {name: 'led',		wave: '2.......2.....2.....2222', data: ['2b\'01','2b\'10','2b\'01']},
  {name: '', },
  {name: 'output',	wave: '2.......2.....2.....2222', data: ['2b\'10','2b\'01','2b\'10']},
  {name: '', }
]}

从时序图可知, 当系统处于复位状态时(rst_n为低电平), 计数器cnt清零,LED灯只点亮第一个当led = 2’b01时,就表示点亮第一个LED灯。由于要点亮LED灯是低电平点亮,因此在输出的时候,要给led取反,即output = ~led。 复位结束后,计数器cnt开始递增计数,当cnt计数到最大值MAX时,cnt清零,同时,对led进行移位操作,我们这里由于只有两个LED灯,所以从图中可能看不出来效果,如果是4个LED灯,那led的变化就是 4’b0001 → 4’b0010 → 4’b0100 → 4’b1000 → 4’b0001 → 4’b0010…

假设我们1s中切换一次,clk的时钟周期是20ns,那么MAX = 1s/20ns = 5000_0000;

3 从零运行VivadoFPGA项目操作流程

3.1 创建一个新的空白项目

截图警告!

3.2 添加源文件

截图警告!

 

 

 往led.v添加以下代码

`timescale 1ns / 1ps


module led(
        input   wire            clk,
        input   wire            rst_n,
        output  wire    [1:0]   led_n      
);


//==================================================================
//                        Parameter define
//==================================================================

parameter       MAX = 5000_0000 - 1;


//==================================================================
//                        Internal Signals
//==================================================================

reg     [1:0]   led;
reg     [25:0]  cnt;    // 2^26 = 6710_8864 > 5000_0000;

assign  led_n = ~led;

//----------------------------- cnt -----------------------------
always @(posedge clk or negedge rst_n) begin
        if (rst_n == 1'b0) begin
            cnt <= 'd0;        
        end
        else if (cnt==MAX)  begin
                cnt <= 'd0;        
        end
        else begin
                cnt <= cnt + 1'b1;
        end  
end

//----------------------------- led ------------------------
always @(posedge clk or negedge rst_n) begin
        if (rst_n == 1'b0) begin
            led <= 2'b01;
        end
        else if (cnt==MAX) begin
                led <= {led[0],led[1]}; 
        end
        else begin
                led <= led;    
        end   
        
end
endmodule

 3.3 添加约束文件

截图警告!

 往top_pin.xdc里面添加以下代码

create_clock	-period		20.000		[get_ports	clk]

set_property	PACKAGE_PIN	N18			[get_ports	clk]
set_property	PACKAGE_PIN	P16			[get_ports	rst_n]
set_property	PACKAGE_PIN	P15			[get_ports	{led_n[0]}]
set_property	PACKAGE_PIN	U12			[get_ports	{led_n[1]}]

set_property	IOSTANDARD	LVCMOS33	[get_ports	clk]
set_property	IOSTANDARD	LVCMOS33	[get_ports	rst_n]
set_property	IOSTANDARD	LVCMOS33	[get_ports	{led_n[*]}]

3.4 编译运行程序

截图警告!

 

3.5 运行结果

Lab1_FPGA_led_RUN

最后愿我们共同进步! 感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。

在后续更新的博客中将会详细讲解 Verliog基础语法及添加管脚约束。本文将不在对本文提供的源代码及管脚约束进行详细的讲解。

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

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

相关文章

今年这情况,大家多一手准备吧......

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;又得准备面试了&#xff0c;不知道从何下手&#xff01; 不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&a…

ASEMI代理MAX5048BAUT+T原装ADI车规级MAX5048BAUT+T

编辑&#xff1a;ll ASEMI代理MAX5048BAUTT原装ADI车规级MAX5048BAUTT 型号&#xff1a;MAX5048BAUTT 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;SOT-23-6 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;6 工作温度:-40C~125C 类型&a…

npx下载构建nuxt3开发模板失败的解决方案

在搭建nuxt3项目开发的时候&#xff0c;安装nuxt3开发模板的时候&#xff0c;使用命令&#xff1a; npx nuxi init my-app 会出出现一下错误&#xff1a; This is related to npm not being able to find a file. 发生上述错误是因为您有一个未正确安装的依赖项。 以下是解决…

大央企的“中央厨房”,泰裤辣

本文来源&#xff1a;特大号 作者&#xff1a;特大妹 最近两年&#xff0c;大央企大国企在数字化转型中&#xff0c;特热衷成立“中央厨房”。 有的中央厨房&#xff0c;单独挂牌为“数科公司”&#xff0c;有的中央厨房&#xff0c;升级为集团数字化转型的一级部门。 把之前各…

“警”彩集结|北峰通信亮相11届警博会,多场景助力警务智能化

2023年5月11日-14日&#xff0c;第十一届中国国际警用装备博览会(警博会)在北京首钢会展中心隆重召开。“警博会”作为中国乃至亚太地区最具影响力、最权威的警用装备盛会&#xff0c;代表了中国警用装备行业的最高水平。北峰通信作为服务公共安全实战30余年的企业&#xff0c;…

软考A计划-真题-分类精讲汇总-第十二章(法律法规与标准化)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Web渗透 不断更新

Web渗透 SQL注入一般注入步骤 文件上传漏洞过滤绕过空格绕过 针对Linux特定字符过滤绕过 针对Linux(例如&#xff1a;cat) 序列号unserialize SQL注入 一般注入步骤 注入点 --> 查询注入字段数 --> 查询注入回显位 --> 查询当前数据库信息 --> 查询数据库表 --&g…

MySQL基础(三十四)锁

1. 概述 在数据库中&#xff0c;除传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的 资源。为保证数据的一致性&#xff0c;需要对 并发操作进行控制&#xff0c;因此产生了 锁 。同时 锁机制 也为实现MySQL 的各…

HIT数据结构lab2-树型结构的建立与遍历

title: 数据结构lab2-树型结构的建立与遍历 date: 2023-05-16 11:42:26 tags: 数据结构与算法 哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称&#xff1a;数据结构与算法 课程类型&#xff1a;必修 实验项目&#xff1a;树型结构的建立与遍历 实验题目&#xff1…

【目标检测】模型信息解析/YOLOv5检测结果中文显示

前言 之前写过一篇博文【目标检测】YOLOv5&#xff1a;标签中文显示/自定义颜色&#xff0c;主要从显示端解决目标中文显示的问题。 本文着重从模型角度&#xff0c;从模型端解决目标中文显示问题。 模型信息解析 正常情况下&#xff0c;可以直接加载模型打印信息&#xff0…

GPT专业应用:英语作文修改与解释

正文共 868 字&#xff0c;阅读大约需要 3 分钟 英语学习者/老师必备技巧&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 快速修改英语作文 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda …

字节外包做了5年软件测试,12月无情被辞,想给划水的兄弟提个醒

前言 先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入字节&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成…

第45讲:Python集合对象生成式的概念以及应用案例

文章目录 1.什么是集合生成式3.使用集合生成式创建集合3.在集合生成式中使用if语句4.在集合生成式中使用嵌套for循环语句 集合的生成式和集合的非常类似&#xff0c;只是符号不同而已&#xff0c;集合的语法格式如下&#xff0c;可以看到只是和集合的符号不同&#xff1a; {集…

【Linux】Linux /proc/iomem与/proc/ioports

目录 1. 前言 2. /proc/iomem 2.1 简介 2.2 ioremap 2.3 mmap 3. struct resource 4. System RAM 4.1 System RAM 简介 4.2 page_is_ram 4.3 Kernel code、data、bss 5. /proc/ioports 6. /proc/iomem/与/proc/ioports/对比 6.1 API简介 6.3 源码解读 7.总结 8.…

再来跟我一起写 Makefile 沉痛悼念技术大牛左耳朵耗子(陈皓)

再来跟我一起写 Makefile 沉痛悼念技术大牛左耳朵耗子&#xff08;陈皓&#xff09; 左耳朵耗子redefence 左耳朵耗子 5 月 15 日早晨&#xff0c;一则意外消息打得我们猝不及防&#xff1a;MegaEase CEO、知名架构师、CSDN 资深博主&#xff08;https://blog.csdn.net/haoel&…

Java的继承与实现

一、Java的继承与实现 继承可以使用现有类的所有功能&#xff0c;并在无需重新编写原来的类的情况下对这些功能进行扩展。这种派生方式体现了传递性。 在Java中&#xff0c;除继承&#xff0c;还有一种体现传递性的方式叫实现。那么&#xff0c;这两者方式有何区别&#xff1f…

通信算法之153: 基于Matlab的OFDM通信系统关键基带算法设计

1. 发射机 TBD 2. 接收机 定时同步主要包括帧&#xff08;分组&#xff09;同步和符合同步两种&#xff0c;其中帧同步用于确定分组的起始位置。而符合同步在于正确地定出OFDM符号数据部分的开始位置&#xff0c;以进行正确的FFT操作。 载波频率同步先检测出频率偏移&#xf…

论文精读《Optical Measurement of Highly Reflective Surfaces from a Single Exposure》

摘要 高反射表面的三维结构光 (SL) 测量是工业计量面临的挑战。 高动态范围&#xff08;HDR&#xff09;技术通过融合多重曝光下的图像提供了解决方案&#xff1b; 然而&#xff0c;这个过程非常耗时。 本文报告了一种基于 SL 的新方法&#xff0c;仅通过一次曝光即可测量具有…

【Linux】配置系统默认启动内核版本方式

查看默认启动内核 这是一个在Linux系统中使用的命令行&#xff0c;用户通过该命令行查看并编辑GRUB2引导加载程序环境变量。具体含义如下&#xff1a; saved_entry6752e052c66d4923aeeb3f42f123175e-4.18.0-348.7.1.el8_5.x86_64&#xff1a;当前设置的默认启动项为ID为"…

网络安全这条路到底该怎么走?

我之前就写过一篇文章专门解答了这个问题。但是还是有很多小伙伴并不清楚这条路该怎么走下去&#xff01; 不同于Java、C/C等后端开发岗位有非常明晰的学习路线&#xff0c;网路安全更多是靠自己摸索&#xff0c;要学的东西又杂又多&#xff0c;难成体系。 网络安全虽然是计算…