树莓派点亮FPGA小灯

树莓派点亮FPGA小灯

引言:

​ 本次实验的目的是通过树莓派和FPGA之间的串口通信,控制FPGA开发板上的小灯。实验将展示如何使用树莓派发送特定的字符信号,通过串口传输至FPGA,并在FPGA上实现逻辑解析,以点亮指定的小灯。这不仅验证了树莓派与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的基本知识,还掌握了它们之间的通信方法。实验过程中遇到的问题和挑战提高了我们解决实际问题的能力。此外,实验也加深了我们对数字逻辑设计和微控制器编程的理解。

最后感谢大佬友情链接:

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LX很爱吃葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值