树莓派点亮FPGA小灯

news2024/11/24 6:35:42

树莓派点亮FPGA小灯

引言:

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

希望你在本次学习过后,能够有一定的收获!!!

推荐歌曲—雨爱-杨丞琳

​ 冲啊!!!! ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶

文章目录

  • 树莓派点亮FPGA小灯
    • 一、任务介绍
    • 二、树莓派介绍
      • 一、树莓派
      • 二、树莓派图片
    • 三、实验流程
      • 1、树莓派设置
      • 2、FPGA相关
    • 四、实验效果
    • 五、实验总结

一、任务介绍

  1. 了解树莓派的相关内容
  2. 实现树莓派与FPGA开发板之间的通信
  3. 使用树莓派点亮FPGA开发板上面的小灯

二、树莓派介绍

一、树莓派

a.简介:树莓派(Raspbreey Pi,RPi),慈善组织“Raspberry Pi 基金会”开发,为学生计算机编程教育而设计,基于Linux系统的单片机系统。随Windows 10 IoT的发布,有可以用运行Windows的树莓派。只有信用卡大小,却有视频、音频等功能。

c. 硬件:是一款基于ARM的微型电脑主板

内存硬盘:SD/MicroSD卡

四类接口:有1/2/4个USB接口;

一个10/100 以太网接口(A型没有网口);

视频模拟信号的电视输出接口;

和HDMI高清视频输出接口。

可连接键盘、鼠标和网线.,具备所有PC的基本功能只需接通电视机和键盘,就能执行如电子表格、文字处理、玩游戏、播放高清视频等诸多功能。Raspberry Pi B款只提供电脑板,无内存、电源、键盘、机箱或连线。

d.语言:树莓派基金会提供了基于ARM的Debian和Arch Linux的发行版供大众下载。还计划提供支持Python作为主要编程语言,支持Java、BBC BASIC (通过 RISC OS 映像或者Linux的"Brandy Basic"克隆)、C 和Perl等编程语言。

e. 发展以及应用(亚博官网摘)

img

二、树莓派图片

a.板子图片(亚博官网摘)

img

b.树莓派3b与树莓派3b+参数对比:

img

b.树莓派3b+引脚图:

img

三、实验流程

1、树莓派设置

  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
这里要先获取权限,否则后面代码会报错

接着进入python3中,输入如下代码,这里一定一定要注意,不要安装serial库!!!因为这个是安装好的,再安装会提示serial中无Serial!

树莓派发送数据代码

import serial
import time
ser = serial.Serial('/dev/ttyAMA0',115200)

while ser.isOpen() :
	ser.write(b"A") # 点亮第一个小灯
	time.sleep(1)
	ser.write(b"B") # 点亮第二个小灯
	time.sleep(1)

2、FPGA相关

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) begin
        if(!rst_n) begin
            led <= 8'b0;
        end
        else if (dout_vld) begin
            if (dout == 8'h41) begin
                led <= 8'b0000_0001;
            end
            else if (dout == 8'h42) begin
                led <= 8'b0000_0010;
            end
            else if (dout == 8'h43) begin
                led <= 8'b0000_0100;
            end
            else if (dout == 8'h44) begin
                led <= 8'b0000_1000;
            end
            else if (dout == 8'h45) begin
                led <= 8'b0001_0000;
            end
            else if (dout == 8'h46) begin
                led <= 8'b0010_0000;
            end
            else if (dout == 8'h47) begin
                led <= 8'b0100_0000;
            end
            else begin
                led <= led;
            end
        end
    end    


    
endmodule

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 = 5207;  // 使用波特率 115200 发送1 bit 需要的时钟周期


    reg din_r0; // 同步到时钟上升沿 
    reg din_r1; // 打拍 延时一个时钟周期 
    wire nedge; // 下降沿
    reg flag;  // 计数器计数标志 下降沿到来之后开始计数 传输数据完成停止计数
    reg [8:0] data; // 寄存 数据



    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin din_r0<= 1; din_r1<=1;    end
        else begin din_r0<= din; din_r1<= din_r0;   end
    end

    assign nedge = din_r1 && !din_r0; // 下降沿





//  计数一个bit发送需要的时钟周期
    reg [20:0] cnt_bsp; 
    wire add_cnt_bsp; 
    wire end_cnt_bsp; 

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)     cnt_bsp <= 0;
        else if (add_cnt_bsp)
            if (end_cnt_bsp)    cnt_bsp <= 0;
            else                cnt_bsp <= cnt_bsp + 1; 
        else cnt_bsp <= cnt_bsp;
    end
    assign add_cnt_bsp = flag;
    assign end_cnt_bsp = add_cnt_bsp && (cnt_bsp == BAUD - 1);




// 计数当前到了哪一 bit
    reg [3:0] cnt_bit;          
    wire add_cnt_bit;
    wire end_cnt_bit;

    always @(posedge clk or negedge rst_n)begin

        if (!rst_n)     cnt_bit <= 0;
        else if (add_cnt_bit)
            if (end_cnt_bit)    cnt_bit <= 0;
            else                cnt_bit <= cnt_bit + 1;
        else cnt_bit <= cnt_bit;
    end
    assign add_cnt_bit = end_cnt_bsp;
    assign end_cnt_bit = add_cnt_bit && (cnt_bit == 8); // 起始位 1bit 数据位 8bit 


    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) flag <= 0;
        else if(nedge) flag <= 1;
        else if(end_cnt_bit) flag <= 0;
        else flag <= flag;
    end

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n) data <=0;
        else if(cnt_bsp == BAUD>>1 && flag) data[cnt_bit] <= din; // 串并转换 LSB
        else data <= data; 
    end

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            dout <= 8'b0;
            dout_vld <= 0;
        end
        else if(end_cnt_bit)
        begin
            dout <= data[8:1]; // 第0位起始位 被舍去 
            dout_vld <= 1;
        end
        else begin
            dout <= dout;
            dout_vld <= 0;
        end
    end


endmodule

FPGA引脚图

在这里插入图片描述

四、实验效果

在这里插入图片描述

五、实验总结

实验成果

本次实验成功实现了通过树莓派与FPGA之间的串口通信控制FPGA开发板上的小灯。实验中,树莓派作为上位机,通过发送特定的字符信号,点亮了FPGA板上的LED灯。这验证了树莓派与FPGA之间的通信能力,并且展示了数字逻辑设计在实际应用中的实用性和灵活性。

技术要点

  • 串口通信:实验中使用了树莓派的串口功能来与FPGA进行数据交换,这是实现控制的关键技术点。
  • 信号解析:FPGA端的逻辑设计能够正确解析树莓派发送的信号,这是实现特定功能的基础。
  • 硬件连接:确保树莓派与FPGA之间的物理连接正确无误,包括串口线和电源连接。

遇到的问题及解决方案

  • 串口通信不稳定:在实验过程中,遇到了串口通信不稳定的问题,通过调整波特率和检查串口线路解决了这一问题。
  • FPGA逻辑设计错误:在FPGA逻辑设计中出现了解析信号错误的问题,通过反复检查和调试逻辑电路得到了解决。

实验心得

通过本次实验,我们不仅学习了树莓派和FPGA的基本知识,还掌握了它们之间的通信方法。实验过程中遇到的问题和挑战提高了我们解决实际问题的能力。此外,实验也加深了我们对数字逻辑设计和微控制器编程的理解。

最后感谢大佬友情链接:

  • 树莓派3B+串口通信(超详细简单版)_树莓派3b串口通信-CSDN博客
  • 树莓派3B+ 引脚图说明_树莓派3b+引脚图-CSDN博客
  • 树莓派介绍&树莓派3代B+型开发板_树莓派开发板-CSDN博客

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

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

相关文章

如何在Mac 电脑上安装 Homebrew

1、打开终端应用程序 在终端中输入以下命令并回车: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 这个命令会自动下载并运行 Homebrew 的安装脚本。 系统可能会提示您输入管理员密码,请输入您的 Mac 登录…

java异常,日志,线程堆栈与Jvm调优

一.知识目录&#xff1a; 二.什么是java异常&#xff1a; 2.1 Throwable类中的重要方法: (1)四个构造方法&#xff08;用来构造throwable对象&#xff0c;不同构造方法可以传递不同的参数值&#xff09;&#xff1a; /** 构造一个将 null 作为其详细消息的新 throwable */ Thr…

BGP学习一:关于对等体建立和状态组改变

目录 一.BGP基本概念 &#xff08;1&#xff09;.BGP即是协议也是分类 1.早期EGP 2.BGP满足不同需求 3.BGP区域间传输的优势 &#xff08;1&#xff09;安全性——只传递路由信息 &#xff08;2&#xff09;跨网段建立邻居 4.BGP总结 5.BGP的应用 &#xff08;1&#…

MySQL-索引篇

文章目录 什么是索引&#xff1f;索引的优缺点索引底层数据结构选型Hash表二叉查找树AVL树红黑树B树&B树 索引类型总结主键索引二级索引聚集索引与非聚集索引聚集索引非聚集索引 覆盖索引与关联索引覆盖索引联合查询最左前缀匹配原则 索引下推如何正确使用索引选择合适的字…

Linux基础命令(续)

17&#xff0c;wc命令 作用&#xff1a;统计行数、单词数、字符个数 格式&#xff1a; wc 选项 文件 wc passwd 26 36 1159 passwd26&#xff1a;行数 36&#xff1a;单词数 1159&#xff1a;字符数 passwd&#xff1a;文件名wc autofs.conf 426 2604 15137 autofs.conf426…

CentOS7 安装 Kamailio

https://www.kamailio.org/wiki/packages/rpms 官方文档说 yum -y install yum-utils yum-config-manager --add-repo https://rpm.kamailio.org/centos/kamailio.repo 但目前这样其实行不通 需要这样做&#xff1a; yum install --disablerepokamailio --enablerepokamai…

在Linux操作系统中LVM逻辑券管理指令

1.PV物理券相关指令 1.查看机器中的PV pvscan 命令 这个叫做/dev/sda2 的PV&#xff0c;被加入到了名叫centos的卷组中&#xff0c;并且这个券组的大小是小于19.51GB 2.创建物理券 pvcreate 磁盘/分区名称 pvcreate /dev/sdc 3.删除物理券 pvremove 磁盘/分区名称 2.…

微信授权登录02-移动端

目录 ## 前言 1.准备工作 1.1 网站域名 1.2 微信公众号 2.授权登录开发 2.1 前端开发 2.1.1 调起微信授权页面 ## 调起微信授权页面效果图 2.1.2 用户允许授权后回调处理 2.2 后端开发 2.2.1 根据code查询用户信息 2.2.2 自动注册登录 ## 后记 ## 前言 上一篇写…

力扣HOT100 - 295. 数据流的中位数

解题思路&#xff1a; 小顶堆 大顶堆 class MedianFinder {Queue<Integer> A, B;public MedianFinder() {A new PriorityQueue<>();B new PriorityQueue<>((x, y) -> (y - x));}public void addNum(int num) {if (A.size() ! B.size()) {A.add(num);B…

HCIP的学习(14)

过滤策略—filter-policy ​ 思科中&#xff1a;分发列表 ​ 过滤策略是只能够针对于路由信息进行筛选&#xff08;过滤&#xff09;的工具&#xff0c;而无法针对于LSA进行过滤。 在R4的出方向上配置过滤策略&#xff0c;使得R1不能学习到23.0.0.0/24路由信息1、抓取流量 […

【谷粒商城】03创建商品模块

1.创建模块 2.创建项目微服务 商品服务、仓储服务、订单服务、优惠券服务、用户服务 共同&#xff1a; 1&#xff09;、web、openfeign 2&#xff09;、每一个服务&#xff0c;包名 com.atguigu.gulimall.xxx(product/order/ware/coupon/member) 3&#xff09;、模块名&#x…

ABAP ZCL_EXCEL 实际用的案例 对账单

ABAP ZCL_EXCEL 实际用的案例 FORM GETITEMSANDOUTPUT USING PGS_HEAD TYPE GSHEAD.DATA:FILENAME TYPE STRING.DATA:LKUNNR TYPE KNA1-KUNNR.DATA:PROW TYPE I.DATA:LSDATE TYPE STRING.DATA:SUMXSJE TYPE DMBTR,ZYMYE TYPE DMBTR, "月末余额SUMBYXSYE TYPE DMBT…

java项目之英语知识应用网站源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的英语知识应用网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 英语知识应用网站的主要…

文心一言 VS 讯飞星火 VS chatgpt (257)-- 算法导论19.2 1题

一、给出图19-4(m)中的斐波那契堆调用 FIB-HEAP-EXTRACT-MIN 后得到的斐波那契堆。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 由于我不能直接画出图19-4(m)中的斐波那契堆&#xff0c;我将基于斐波那契堆的基本结构和操作FIB-HEAP-EXTRACT-MIN的一般行为来…

3D 生成重建009-DreamGaussian使用gaussian splatting在两分钟内生成3d

3D 生成重建009-DreamGaussian使用gaussian splatting在两分钟内生成3d 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 DreamGaussian是第一个使用gaussian splatting方法进行3d生成的工作。论文最先使用gaussian splatting替代原来用nerf表示3d。整体架构依然保留了原来的…

探索数据结构:树与二叉树

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 树 1.1. 树的定义 树是一种非线性的数据结构&#xff0c;它是由n&a…

nodejs复习笔记

最近在复习nodejs&#xff0c;整理了一些笔记来记录和分享。 非常惭愧&#xff0c;我之前关于nodejs学习的一篇文章《nodejs全栈开发学习笔记》已经是2019年6月份的时候了&#xff0c;大概浏览了一下&#xff0c;发现当时很多不明白的地方&#xff0c;现在通过复习&#xff0c…

【MySQL数据库开发设计规范】之表设计规范

欢迎点开这篇文章&#xff0c;自我介绍一下哈&#xff0c;本人姑苏老陈 &#xff0c;是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中&#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章&#xff0c;定期更新&#xff0c;欢迎关注&…

Java反射(含静态代理模式、动态代理模式、类加载器以及JavaBean相关内容)

目录 1、什么是反射 2、Class类 3、通过Class类取得类信息/调用属性或方法 4、静态代理和动态代理 5.类加载器原理分析 6、JavaBean 1、什么是反射 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得…