树莓派发送指令控制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.hqwc.cn/news/700690.html

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

相关文章

《无畏契约》游戏画面出现“撕裂感“,你清楚背后的原理吗?

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

基于Springboot的校园疫情防控信息管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园疫情防控信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

RK3566(泰山派):3.1寸屏幕D310T9362V1SPEC触摸驱动(竖屏)

RK3566&#xff08;泰山派&#xff09;&#xff1a;3.1寸屏幕D310T9362V1SPEC触摸驱动&#xff08;竖屏&#xff09; 文章目录 RK3566&#xff08;泰山派&#xff09;&#xff1a;3.1寸屏幕D310T9362V1SPEC触摸驱动&#xff08;竖屏&#xff09;电路配置i2c1设备树创建驱动编写…

(深度估计学习)Win11复现DepthFM

目录 1. 系统配置2. 拉取代码&#xff0c;配置环境3.开始深度预测4.运行结果 论文链接&#xff1a;https://depthfm.github.io/ 讲解链接&#xff1a;https://www.php.cn/faq/734404.html 1. 系统配置 本人系统&#xff1a;Win11 CUDA12.2 python3.11.5 这里附上几个CUDA安装链…

文字转成活码的3步操作,手机扫码即可查看文本信息

现在经常会通过二维码的方式来传递通知的文字信息&#xff0c;只需要分享文字生成二维码的图片到微信群或者印刷出来&#xff0c;其他人就可以通过扫码来查看文字内容&#xff0c;有利于其他人更快速的获取信息。 目前文本静态码无法通过微信来扫码展示&#xff0c;那么想要解…

力扣例题(循环队列)

链接 . - 力扣&#xff08;LeetCode&#xff09; 描述 思路 我们使用数组来创建循环队列 数组的大小我们就额外对开辟一块空间 MyCircularQueue(k) 开辟一个结构体&#xff0c;存放队列的相关数据 分别为size,数组指针_a,起始位置head,结束位置tail 注意&#xff1a;我们…

(四)Spring教程——控制反转或依赖注入与Java的反射技术

IoC的底层实现技术是反射技术&#xff0c;目前Java、C#、PHP 等语言均支持反射技术。 在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够获取到这个类的所有属性和方法&#xff1b;对任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff08;包括私有的方法…

手撸XXL-JOB(四)——远程调用定时任务

Java Socket网络编程 网络编程是Java编程中的重要组成部分&#xff0c;包括服务端和客户端两部分内容。Socket是Java网络编程的基本组件之一&#xff0c;用于在应用程序之间提供双向通信&#xff0c;Socket提供了一种标准的接口&#xff0c;允许应用程序通过网络发送和接收数据…

项目实施方案:多点异地机动车典型系统试验状态可视监控系统

目录 一、需求分析 1.1项目背景 1.2项目概述 二、系统优势 2.1兼容性能力强 2.2接入协议多样 2.3并发能力强 2.3.1 单平台参数 2.3.2 多平台性能参数 2.4 系统稳定性 三、建设目标 3.1安全性 3.2可扩展性 3.3易用性 3.4兼容性 3.5 响应能力 四、系统整体解决方…

Nodejs笔记2

模块化 模块化初体验 模块暴露数据 导入模块 fs 写绝对路径 require写相对路径不会受到影响 ./../不能省略 js 和json文件后缀可以省略 如果存在 命名相同的js和json文件&#xff0c;优先导入js文件 导入文件夹时的情况 require导入模块的基本流程 commonJS模块…

上位机图像处理和嵌入式模块部署(树莓派4b和电源供给)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面&#xff0c;我们说过pc电脑和嵌入式设备&#xff0c;两者都可以实现相同的软件功能。但是和pc相比较&#xff0c;嵌入式设备不仅价格更便宜&a…

24深圳杯C题18页高质量论文+可执行代码+图表

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的&#xff0c;大家可以参考我往期的资料&#xff0c;所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意&#xff1a;&#xff08;建议先下单占坑&#xff0c;因为随着后续我们更新资料数…