树莓派发送指令控制FPGA板子上的流水灯程序

文章目录

  • 前言
  • 一、树莓派简介
  • 二、整体实现步骤
  • 三、树莓派设置
  • 四、树莓派串口代码
  • 五、Verilog代码
    • 5.1 串口接收模块
    • 5.2 流水灯模块
  • 六、quartus引脚绑定
  • 七、 运行效果
  • 总结
  • 参考


前言

​ 本次实验的目的是通过树莓派和FPGA之间的串口通信,控制FPGA开发板上的小灯。实验将展示如何使用树莓派发送特定的字符信号,通过串口传输至FPGA,并在FPGA上实现逻辑解析,以点亮指定的小灯。这不仅验证了树莓派与FPGA之间的通信能力,也展示了数字逻辑设计在实际应用中的灵活性。

实验器材:
DE2-115开发板
树莓派


一、树莓派简介

树莓派是什么?
树莓派(Raspberry Pi)是尺寸仅有信用卡大小的一个小型电脑,您可以将树莓派连接电视、显示器、键盘鼠标等设备使用。
树莓派能替代日常桌面计算机的多种用途,包括文字处理、电子表格、媒体中心甚至是游戏。并且树莓派还可以播放高至 4K 的高清视频。
我们希望将树莓派推广给全世界的青少年电脑爱好者,用于培养计算机程序设计的兴趣和能力。

树莓派各版本发布时间和差异对照:
在这里插入图片描述

二、整体实现步骤

  • 1.使用一个FPGA开发板和一个串口通信模块(如UART)来进行通信。确保开发板上有足够的GPIO引脚可用于连接流水灯。

  • 2.在FPGA开发环境中创建一个新项目,并为其添加一个顶层模块。这个顶层模块将负责接收串口数据,并控制流水灯的状态。

  • 3.在顶层模块中添加一个串口接收器模块,用于接收来自串口通信模块的数据。您可以使用FPGA开发环境提供的现成模块,或者自己编写一个。

  • 4.在顶层模块中添加一个计数器,用于控制流水灯的状态。每当接收到串口数据时,计数器会更新,并根据其值来控制流水灯的亮灭。

  • 5.添加一个输出模块,将计数器的值连接到流水灯所需的GPIO引脚上。确保配置正确的约束文件,以确保引脚映射正确。

  • 6.编译和烧录FPGA,并将串口通信模块连接到计算机上。您可以使用串口终端程序来发送数据给FPGA。

  • 7.当串口接收器接收到数据时,计数器将更新,并相应地控制流水灯的状态。

三、树莓派设置

1、首先确认波特率设置正确,是否为115200。(当然,其他波特率也可以的,不过代码得改一下
2、向microSD卡中烧录树莓派官方的镜像后,先不要急着把它插入树莓派中。
3、在电脑上打开microSD卡,按如下方式修改config.txt和cmdline.txt这两个文件,在config.txt文件中附加

dtoverlay=pi3-miniuart-bt

在电脑里直接打开比在树莓派里打开要好操作,不用获取权限
然后把cmdline.txt中的内容换成

dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

修改完成之后,我们打开树莓派

进入到树莓派的命令行当中进行如下操作
在命令行中输入如下命令

sudo chmod 777 /dev/ttyAMA0
这里要先获取权限,否则后面代码会报错

四、树莓派串口代码

fpgaUart.c

#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>int main()
{int fd =serialOpen("/dev/ttyAMA0",115200); //打开串口if(fd == -1){	//如果打开串口失败则退出程序printf("serialOpen failed!\n");return 0;}printf("serialOpen success!\n");while(1){serialPrintf(fd,"A");delay(2000);serialPrintf(fd,"B");delay(2000);}return 0;
}

编译命令
gcc -o fpgaUart fpgaUart.c -lwiringPi

五、Verilog代码

5.1 串口接收模块

uart_rx.v

module uart_rx (input               clk     ,input               rst_n   ,input               din     ,   //pc端发送给FPGA的数据output  reg [7:0]   dout    ,   //发送给tx 让他串行的传出去output  reg         dout_vld    //当这一次8bit接收完成 再传给tx
);parameter BAUD = 434 ;  //使用波特率115200 发送1bit所需要的时钟周期reg     [8:0]       cnt_bsp     ;wire                add_cnt_bsp ;wire                end_cnt_bsp ;reg     [3:0]       cnt_bit     ;   //计数当前到了哪一bit了 计数9bit 起始位加上数据wire                add_cnt_bit ;wire                end_cnt_bit ;reg                 din_r0      ;   //同步到时钟上升沿reg                 din_r1      ;   //打拍 延时一个时钟周期wire                nedge       ;   //下降沿reg                 flag        ;   //计数器计数的标志 下降沿到来之后开始计数 传输数据完成了就停止计数reg     [8:0]       data        ;   //寄存数据always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_bsp <= 9'b0;endelse if(add_cnt_bsp)beginif(end_cnt_bsp)begincnt_bsp <= 9'b0;endelse begincnt_bsp <= cnt_bsp + 1'b1;endendelse begincnt_bsp <= cnt_bsp;endendassign add_cnt_bsp = flag;assign end_cnt_bsp = add_cnt_bsp && cnt_bsp == BAUD - 1;always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_bit <= 4'b0;endelse if(add_cnt_bit)beginif(end_cnt_bit)begincnt_bit <= 4'b0;endelse begincnt_bit <= cnt_bit + 1'b1;endendelse begincnt_bit <= cnt_bit;endendassign add_cnt_bit = end_cnt_bsp;assign end_cnt_bit = add_cnt_bit && cnt_bit == 8; //起始位加上8bit数据位always @(posedge clk or negedge rst_n)beginif(!rst_n)begindin_r0 <= 1'b1;din_r1 <= 1'b1;endelse begindin_r0 <= din;din_r1 <= din_r0;endendassign nedge = ~din_r0 & din_r1; always @(posedge clk or negedge rst_n)beginif(!rst_n)beginflag <= 1'b0;endelse if(nedge)beginflag <= 1'b1;endelse if(end_cnt_bit)beginflag <= 1'b0;endelse beginflag <= flag;endendalways @(posedge clk or negedge rst_n)beginif(!rst_n)begindata <= 9'b0;endelse if(cnt_bsp == (BAUD >> 1) && flag)begindata[cnt_bit] <= din;   //串并转换  LSBendelse begindata <= data;endendalways @(posedge clk or negedge rst_n)beginif(!rst_n)begindout <= 8'b0;dout_vld <= 1'b0;endelse if(end_cnt_bit)begindout <= data[8:1];  //第0位是起始位 舍弃掉dout_vld <= 1'b1;endelse begindout <= dout;dout_vld <= 1'b0;endendendmodule

5.2 流水灯模块

led.v

module led (input  clk,input  rst_n,input  tx,output reg[7:0] led
);wire [7:0] dout;wire dout_vld;uart_rx uart_rx_inst (.clk (clk),.rst_n (rst_n),.din    (tx),.dout(dout),.dout_vld    (dout_vld));always @(posedge clk or negedge rst_n) beginif(!rst_n) beginled <= 8'b0;endelse begincase (dout)8'h41 : led <= 8'b0000_0001;8'h42 : led <= 8'b0000_0010;default: led <= led;endcaseendend    
endmodule

六、quartus引脚绑定

可以选择其它灯,看数据手册
在这里插入图片描述

七、 运行效果

在这里插入图片描述


总结

实验概述
在本次实验中,我们成功地通过树莓派与FPGA之间的串行通讯,实现了对FPGA开发板上LED灯的控制。该实验展示了树莓派作为控制端与FPGA结合的潜力,以及数字逻辑设计在工程实践中的应用价值。

技术实现

  • 串口通讯:实验利用树莓派的串行通讯接口与FPGA进行数据传输,这是实现远程控制的核心环节。
  • 信号解码:FPGA上的逻辑电路能够准确地解析来自树莓派的信号,确保了控制指令的准确执行。
  • 硬件配置:实验中对树莓派与FPGA之间的物理连接进行了严格的检查,确保了串口线路和电源供应的稳定性。
    问题与解决策略
  • 通讯稳定性问题:面对串口通讯过程中出现的不稳定现象,我们通过调整通讯波特率和仔细检查串口线路来确保通讯的可靠性。
    逻辑设计缺陷:在FPGA的逻辑设计阶段,我们遇到了信号解析的误差,通过细致的复查和调试,最终修正了逻辑电路。

实验反思
本次实验不仅加深了我们对树莓派和FPGA硬件特性的理解,还提升了我们在通信技术和数字逻辑设计方面的实践技能。在解决实验中遇到的挑战时,我们的问题分析与解决能力得到了显著提升,同时对微控制器编程和系统集成有了更深入的认识。

通过这次学习经历,我们认识到了理论与实践相结合的重要性,并体会到了在解决复杂工程问题时,耐心和细致的必要性。

参考

树莓派对FPGA板子上的流水灯程序的控制

树莓派点亮FPGA小灯

【树莓派初始化】教你从0开始搭建树莓派的使用环境

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

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

相关文章

Excel常用操作

计算支付成功率 使用公式 ROUND(B2/C2,4)*100&"%" 字符串拼接 将A1-A10的数字用英文逗号拼接 TEXTJOIN(",",TRUE,A1:A10) 将A1-A10中大于5的数字用英文逗号拼接 ARRAYFORMULA(TEXTJOIN(",",TRUE,IF(A1:A10>5,A1:A10,"")…

未来想从事营销策划类的工作,需要怎么学习?

从事营销策划类的工作&#xff0c;提升和学习主要从以下三个方面&#xff1a; 一、营销底层逻辑的搭建 二、营销系统知识的构建 三、大量营销案例的积累 营销入门&#xff0c;其实大多数人一直都在入门的道路上&#xff0c;每个人都是终身学习者。虽然从事营销工作十年多了…

2024年5月中,AITOP100平台活动专区迎来六场AI大赛盛事!

AITOP100平台的活动专区在2024年5月中旬更新的6场AI大赛来了&#xff01; 随着人工智能技术的飞速发展&#xff0c;AI设计已经成为了创新与创意的新领域。2024年5月中旬&#xff0c;由腾讯研究院、剪映、站酷等互联网大厂主办的6场AI设计大赛震撼来袭&#xff0c;为广大AI设计…

【数据分析面试】43.寻找给小费最多的客人(Python:字典用法)

题目&#xff1a; 寻找给小费最多的客人 &#xff08;Python) 给定两个非空列表user_ids和tips&#xff0c;编写一个名为most_tips的函数&#xff0c;用于找到给小费最多的客户。 示例&#xff1a; 输入&#xff1a; user_ids [103, 105, 105, 107, 106, 103, 102, 108, 1…

Top10+java类

OWASPTOP10 文章目录 OWASPTOP10sql注入(面了几家问了几家)xss是什么SSRF文件上传文件包含漏洞命令执行漏洞代码执行漏洞常见的逻辑漏洞越权漏洞java类问题Java 内存马java反序列化的原理:讲一讲weblogic讲一讲shiro反序列化原理讲一讲fastjson反序列化原理:讲一讲log4j RC…

Springboot 文件传输优化

Spring Boot通过MultipartFile接口简化了文件上传的处理。在Spring MVC中&#xff0c;你可以使用RequestParam注解与MultipartFile一起工作来接收上传的文件。Spring Boot默认配置了文件上传的大小限制&#xff0c;但是你可以通过application.properties进行自定义配置。 # 单个…

短剧看剧系统,当前互联网热门项目工具系统模板。

目录 揭秘爆款神器&#xff1a;短剧看剧系统&#xff0c;让你的内容火遍全网&#xff01; 一、短剧看剧系统&#xff1a;一站式解决方案 二、灵活定价&#xff0c;实现收益最大化 三、高效管理&#xff0c;团队协作更轻松 四、数据驱动&#xff0c;精准把握市场动态 五、智…

设置linux终端用户输入空闲一段时间后就自动断开(linux终端超时自动断开)

在 /etc/profile 中加入TMOUT变量即可。 在文件的最后追加以下两行 export TMOUT600 # 600秒内无操作就断开。 readonly TMOUT # 将变量设置为只读&#xff0c;防止用户更改如图

企业计算机服务器中了rmallox勒索病毒怎么解密,rmallox勒索病毒解密工具流程

在当今数字化时代&#xff0c;越来越多的企业依赖计算机服务器进行办公开展业务&#xff0c;计算机服务器犹如企业的心脏&#xff0c;能够为企业存储许多重要的核心信息&#xff0c;帮助企业有效的开展各项工作业务&#xff0c;提高企业的生产效果&#xff0c;但网络是一把双刃…

springMVC基础使用(示例)

maven依赖&#xff08;javax.servlet-api版本与spring-webmvc班恩要匹配不然会报java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRespons&#xff09;&#xff1a; <dependencies><dependency><groupId>javax.servlet</groupId><arti…

CAN模块开发问题概述

问题一 问题描述 工作环境&#xff1a;ECU外接canoe 操作&#xff1a;使用CANoe模拟发送NM报文&#xff0c;然后停发或者断开CANoe 现象&#xff1a;程序跑死&#xff0c;调用call stack查看压栈情况如下图所示 定位代码如下图所示。可见是由于CAN模块在设置Controller状态时…

计算机毕业设计 | vue+springboot调查问卷管理系统(附源码)

1&#xff0c;研究目的 在进入21世纪以后&#xff0c;互联网得到了蓬勃的发展&#xff0c;电子问卷调查也开始逐渐流行起来。传统纸质问卷和电子问卷相比较后&#xff0c;传统问卷还存在很多弊端&#xff1a; 问卷分发起来比较困难&#xff0c;并且分发试卷耗费大量的金钱和时…

vue3 中vite.config.js相关常用配置详解

base&#xff08;默认为/&#xff09;开发或生产环境服务的公共基础路径。合法的值包括以下几种&#xff1a; 绝对 URL 路径名&#xff0c;例如 /foo/ 部署在根目录下的foo文件下页面路径为&#xff1a; https://foo.com/foo/ 完整的 URL&#xff0c;例如 https://foo.com/&am…

网络安全法中关于网络信息的保护和监管,有哪些规定?

网络安全法作为我们数字时代的重要法律保障&#xff0c;对于网络信息的保护和监管有着明确且详细的规定。这些规定不仅体现了国家对于网络安全的重视&#xff0c;也为我们每个人在数字世界中提供了坚实的法律屏障。 首先&#xff0c;我们来看一个关于网络运营者主体责任的案例。…

np.seterr(divide=‘ignore‘, invalid=‘ignore‘)

这行代码用于设置 NumPy 中的错误处理方式。具体来说&#xff0c;它将在发生除零错误和无效操作错误时忽略这些错误&#xff0c;而不会引发异常。 解释一下参数的含义&#xff1a; divideignore&#xff1a;表示在除零错误发生时忽略该错误。invalidignore&#xff1a;表示在…

vue3组件ref属性用法,动态绑定ref

常见用法 <template><CustomWin ref"sectionRef" class"ref-section"></CustomWin ><button click"xx">点击</button> </template><script setup lang"ts"> import {ref} from vue impor…

uniapp开发安卓app使用文字转语音技术

在 UniApp 开发安卓应用时&#xff0c;要实现文字转语音&#xff08;Text-to-Speech, TTS&#xff09;技术&#xff0c;你可以利用 UniApp 的跨平台能力结合原生模块或第三方服务来实现。以下是一些建议的步骤和方法&#xff1a; 1. 使用 UniApp 原生模块&#xff08;如果支持…

【架构-17】通信系统架构设计理论

通信系统网络架构 1. 局域网网络架构 拓扑结构&#xff1a;星型、总线型、环型、树型。 网络架构&#xff1a;单核心架构&#xff08;结构简单&#xff0c;地理范围受限&#xff09;、双核心架构&#xff08;网络拓扑结构可靠&#xff0c;投资较单核高&#xff09;、环型架构…

更高效的数据交互实现丨 DolphinDB Arrow 插件使用教程

Apache Arrow 是一种跨语言的内存数据交换格式&#xff0c;旨在为用户提供高效的数据结构&#xff0c;以实现在不同的数据处理系统之间共享数据而无需进行复制。它由 Apache 软件基金会开发和维护&#xff0c;目前已经成为许多大型数据处理和分析框架的核心组件之一。在分布式框…

fastapi+vue实现导出功能

1.前端 1.1 tableHTML <el-table :data"userList" style"width: 100%; margin-top: 20px" border selection-change"selectionChange"><el-table-column type"selection" width"50px"/><el-table-column la…