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

news2025/1/15 11:21:52

文章目录

  • 前言
  • 一、树莓派简介
  • 二、整体实现步骤
  • 三、树莓派设置
  • 四、树莓派串口代码
  • 五、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)begin
        if(!rst_n)begin
            cnt_bsp <= 9'b0;
        end
        else if(add_cnt_bsp)begin
            if(end_cnt_bsp)begin
                cnt_bsp <= 9'b0;
            end
            else begin
                cnt_bsp <= cnt_bsp + 1'b1;
            end
        end
        else begin
            cnt_bsp <= cnt_bsp;
        end
    end

    assign add_cnt_bsp = flag;
    assign end_cnt_bsp = add_cnt_bsp && cnt_bsp == BAUD - 1;

    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_bit <= 4'b0;
        end
        else if(add_cnt_bit)begin
            if(end_cnt_bit)begin
                cnt_bit <= 4'b0;
            end
            else begin
                cnt_bit <= cnt_bit + 1'b1;
            end
        end
        else begin
            cnt_bit <= cnt_bit;
        end
    end

    assign add_cnt_bit = end_cnt_bsp;
    assign end_cnt_bit = add_cnt_bit && cnt_bit == 8; //起始位加上8bit数据位

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

    assign nedge = ~din_r0 & din_r1; 

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

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

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

endmodule

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) begin
        if(!rst_n) begin
            led <= 8'b0;
        end
		  else begin
			case (dout)
				8'h41 : led <= 8'b0000_0001;
				8'h42 : led <= 8'b0000_0010;
				default: led <= led;
			endcase
			end
    end    
endmodule

六、quartus引脚绑定

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

七、 运行效果

在这里插入图片描述


总结

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

技术实现

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

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

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

参考

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

树莓派点亮FPGA小灯

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

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

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

相关文章

OpenAI 发布新款大型语言模型 GPT-4o,带大家了解最新ChatGPT动态。

OpenAI 发布新款大型语言模型 GPT-4o 昨日OpenAI 举办了一场线上活动&#xff0c;正式发布了其最新研发的 AI 模型 GPT-4o&#xff0c;并详细介绍了该模型的强大功能和未来发展规划。此次发布标志着 AI 技术的重大突破&#xff0c;为用户提供了更加便捷、高效的 AI 工具&#…

css多种布局方式

css多种布局方式 简介标准流布局&#xff08;主要依赖margin\padding&#xff09;浮动布局&#xff08;float&#xff09;定位布局&#xff08;position&#xff09;弹性布局&#xff08;flex&#xff09;网格布局&#xff08;grid&#xff09;多列布局&#xff08;column&…

【论文阅读】<YOLOP: You Only Look Once for PanopticDriving Perception>

Abstract 全视驾驶感知系统是自动驾驶的重要组成部分。一个高精度的实时感知系统可以帮助车辆在驾驶时做出合理的决策。我们提出了一个全视驾驶感知网络&#xff08;您只需寻找一次全视驾驶感知网络&#xff08;YOLOP&#xff09;&#xff09;&#xff0c;以同时执行交通目标检…

7.STL中string的一些超常用函数 (附习题)

目录 1.find 2.atoi 3.to_string 4.getline 【leetcode 习题】 387.字符串中的第一个唯一字符 125. 验证回文串 1.find 1.查找第一次出现的目标字符串&#xff1a;说明&#xff1a;如果查找成功则输出查找到的第一个位置&#xff0c;否则返回-1&#xff1b; s1.find(s2…

嗨动PDF编辑器怎么删除pdf空白页?教程来啦!

嗨动PDF编辑器怎么删除pdf空白页&#xff1f;在日常的工作和学习中&#xff0c;PDF文件因其跨平台兼容性和稳定性而备受青睐。然而&#xff0c;在编辑PDF文件时&#xff0c;我们往往会遇到一些令人头疼的问题&#xff0c;其中最常见的就是空白页。空白页不仅浪费了宝贵的存储空…

ESP32-S3+86盒线控器方案,含开发时问题技术解答

随着智能家居产品越来越多&#xff0c;线控器应用也加大&#xff0c;86盒线控器跟智能吹风机联动&#xff0c;跟中央空调联动&#xff0c;下面讲下ESP32-S386盒线控器方案在开发中遇到的问题。 一、ESP32-S386盒线控器方案&#xff1a; 1、无需网关&#xff0c;可以直接连家里…

零基础10 天入门 Web3之第3天

10 天入门 Web3之第3天 什么是以太坊&#xff0c;以太坊能做什么&#xff1f;Web3 是互联网的下一代&#xff0c;它将使人们拥有自己的数据并控制自己的在线体验。Web3 基于区块链技术&#xff0c;该技术为安全、透明和可信的交易提供支持。我准备做一个 10 天的学习计划&…

Linux系统运行级别

Linux系统运行级别&#xff1a;linux系统共有7个运行级别&#xff0c;不同的级别运行的程序和功能都是不一样的而linux系统默认是运行在一个标准级别上&#xff0c;系统运行级别文件/etc/inittab 运行级别0&#xff1a;所有进程被终止&#xff0c;机器将有序的停止&#xff0c;…

SpringBootWeb 篇-深入了解请求响应(服务端接收不同类型的请求参数的方式)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 请求响应概述 1.1 简单参数 1.2 实体参数 2.3 数组集合参数 2.4 日期参数 2.5 json 参数 2.6 路径参数 3.0 完整代码 1.0 请求响应概述 当客户端发送不同的请求参…

【专利】一种日志快速分析方法、设备、存储介质

公开号CN116560938A申请号CN202310311478.5申请日2023.03.28 是我在超音速人工智能科技股份有限公司(833753) 职务作品&#xff0c;第一发明人是董事长夫妇&#xff0c;第二发明人是我。 ** 注意** &#xff1a; 内容比较多&#xff0c;还有流程图、界面等。请到 专利指定页面…

30-10y国债利差反转的必要条件

国君宏观表示&#xff0c;30-10y期限利差定价本质上是私人部门主动加杠杆的预期&#xff0c;央行购债与资本市场的正向反馈是可以期待的一种场景&#xff0c;而企业部门的被动加杠杆须以可持续的需求动能与盈利预期作为前提。 要点&#xff1a; 期限利差的本质&#xff1a;对长…

如何压缩图片大小?7个实用软件教你快速压缩图片大小

如何压缩图片大小&#xff1f;7个实用软件教你快速压缩图片大小 以下是七个实用的软件&#xff0c;可以帮助您快速压缩图片大小&#xff1a; 图片编辑助手&#xff1a;这是一款功能强大的图像处理软件&#xff0c;其中包含了图像压缩功能。您可以打开需要压缩的图片&#xf…

手撕C语言题典——环形链表的约瑟夫问题

目录 前言 一.故事背景 二.题目 ​编辑三.思路 1&#xff09;数组 ​编辑2&#xff09; 循环链表 四.代码实现 搭配食用更佳哦~~ 数据结构之单单单——链表-CSDN博客 数据结构之单链表的基本操作-CSDN博客 前面学了单链表的相关知识&#xff0c;我们来尝试做一下关于…

关于nvm管理node版本的一些问题

背景&#xff1a; 基于开发项目的迭代不能做到全部更新&#xff0c;有的项目是vue2.0 有的项目是vue3.0&#xff0c; 那么我们开发的时候就需要对node 进行更新&#xff0c;进而产生因为版本不同导致的错误&#xff1a;由此我们需要一款管理 切换node版本的东西&#xff0c;那就…

全面解析OpenAI的新作——GPT-4o

5月14日凌晨1点、太平洋时间的上午 10 点&#xff0c;OpenAI的GPT-4o的横空出世&#xff0c;再次巩固了其作为行业颠覆者的地位。GPT-4o的发布不仅仅是一个产品的揭晓&#xff0c;它更像是向世界宣告AI技术已迈入了一个全新的纪元&#xff0c;连OpenAI的领航者萨姆奥特曼也不禁…

OpenAI深夜震撼发布最新模型GPT-4o,送上最快速便捷教程

北京时间5月14日凌晨&#xff0c;有人说OpenAI一夜改变了历史。 在我们的深夜、太平洋时间的上午 10 点&#xff0c;OpenAI 召开春季发布会&#xff0c;公布了最新的GPT-4o模型&#xff0c;o代表Omnimodel&#xff08;全能模型&#xff09;。20多分钟的演示直播&#xff0c;展…

HTML常见标签-换行标签-水平线标签

换行标签 单纯实现换行的标签是br,如果想添加分隔线,可以使用hr标签 代码 工信部统计显示&#xff0c;截至去年底&#xff0c;我国算力总规模达到180百亿亿次浮点运算/秒&#xff0c;存力总规模超过1000EB&#xff08;1万亿GB&#xff09;。<br>国家枢纽节点间的网络单向…

警惕!红火蚁危机升级:已入侵我国12省份,扩散速度惊人

近年来&#xff0c;红火蚁这一外来入侵物种在我国呈现出了令人担忧的扩张态势&#xff0c;其危害性和扩散速度之迅猛&#xff0c;已引起了社会各界的广泛关注和政府部门的高度警惕。红火蚁作为一种极具破坏力的生物&#xff0c;不仅会对当地的生态环境造成巨大影响&#xff0c;…

AVL树、红黑树

数据结构、算法总述&#xff1a;数据结构/算法 C/C-CSDN博客 AVL树 定义 空二叉树是一个 AVL 树如果 T 是一棵 AVL 树&#xff0c;那么其左右子树也是 AVL 树&#xff0c;并且 &#xff0c;h 是其左右子树的高度树高为 平衡因子&#xff1a;右子树高度 - 左子树高度 创建节点…

棒材直线度测量仪 专为圆形产品研发设计 在线无损检测

棒材直线度测量仪采用了先进的技术&#xff0c;能够实现在线无损检测&#xff0c;为生产过程提供了极大的便利。专为圆形产品设计&#xff0c;它能够精确测量棒材的米直线度及外径、椭圆度尺寸&#xff0c;为质量控制提供可靠的数据支持。 在线直线度测量仪不仅具有出色的性能…