5—基于FPGA(ZYNQ-Z2)的多功能小车—软件设计—蓝牙串口

这篇具有很好参考价值的文章主要介绍了5—基于FPGA(ZYNQ-Z2)的多功能小车—软件设计—蓝牙串口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.蓝牙模块介绍

2.UART介绍

3.Verilog代码:

3.1Uart_RX模块:

3.2 分频模块:

3.3 Uart驱动模块

3.4 Uart控制模块

4. 总览


1.蓝牙模块介绍

  我使用的是JDY-31蓝牙模块,在连线中,要注意RX-TX,TX-RX。

  即FPGA约束的TX对应蓝牙模块的RX,约束的RX对应蓝牙模块的TX。

zynq蓝牙,基于FPGA(ZYNQ-Z2)的多功能小车,fpga开发


2.UART介绍

蓝牙模块使用UART串口通信协议,具体介绍如下:

UART(通用异步收发器)是一种常见的串口通信协议。

UART协议的主要特点如下:

  1. 异步通信:UART使用异步通信方式,不需要时钟同步信号。数据的传输以字符为单位,每个字符由起始位、数据位、校验位(可选)和停止位组成。

  2. 数据格式:UART可以支持不同的数据格式。常见的数据位数包括5位、6位、7位和8位,常见的停止位数为1位或2位,常见的校验位有奇校验、偶校验和无校验。

  3. 波特率:波特率是指每秒钟传输的比特数。UART支持不同的波特率,常见的波特率有9600、115200等。发送和接收的设备必须以相同的波特率进行通信。

  4. 帧同步:UART通过起始位和停止位来确定数据帧的边界。起始位用于标识数据传输的开始,停止位用于标识数据传输的结束。

  5. 单工或半双工通信:UART通信可以是单向的(只有发送或只有接收)或半双工的(同时具有发送和接收功能)。

zynq蓝牙,基于FPGA(ZYNQ-Z2)的多功能小车,fpga开发

232通信时序图如下:

zynq蓝牙,基于FPGA(ZYNQ-Z2)的多功能小车,fpga开发


3.Verilog代码:

具体Verilog的实现代码如下:

3.1顶层模块:

module rs232(
    input wire clk,
    input wire rst_n,
    input wire rx,
    output wire tx
    );

wire rx_flag;
wire [7:0] rx_data;
wire [7:0] tx_data;

Uart_TX uart_tx(
    .clk(clk),
    .rst_n(rst_n),
    .data(rx_data),
    .start_flag(rx_flag),
    .tx(tx)
    );

Uart_RX uart_rx(
    .clk(clk),
    .rst_n(rst_n),
    .rx(rx),
    .rx_data(rx_data),
    .rx_flag(rx_flag)
    );
    
endmodule

这段代码是RS232顶层模块。

其中包含一个发送器(Uart_TX)和一个接收器(Uart_RX)。实现了上位机发送信息后,FPGA将上位机的信息的返回。


3.2 Uart_TX模块:

`timescale 1ns / 1ps

module Uart_TX(
    input wire clk,
    input wire rst_n,
    input wire [7:0] data,
    input wire start_flag,
    output wire tx
    );
    
/******************内部变量**********************/
parameter N=13021; //N=系统时钟频率/波特率;f=125Mhz,baud=9600。表示N个系统时钟一个数据位
reg work_en;//工作使能
reg [31:0] baud_cnt;//波特计数器
reg bit_flag;//比特标志
reg [3:0] bit_cnt;//数据位计数,0-8
reg tx_reg;
assign tx=tx_reg;
/******************工作使能**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            work_en<=0;
        else if(start_flag==1)//开始迟滞一个clk,工作使能
            work_en<=1;
        else if((bit_cnt==4'd9)&&(bit_flag==1))
            work_en<=0;
        else
            work_en<=work_en;
    end
/*******************波特计数器**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            baud_cnt<=0;
        else if((baud_cnt==N-1)||(work_en==0))
            baud_cnt<=0;
        else if(work_en==1)
            baud_cnt<=baud_cnt+1;
    end

/*******************比特标志**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            bit_flag<=0;
        else if(baud_cnt==1)
            bit_flag<=1;
        else
            bit_flag<=0;
    end

/*******************数据位计数**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            bit_cnt<=0;
        else if((bit_cnt==4'd9)&&(bit_flag==1))
            bit_cnt<=0;
        else if(bit_flag==1)
            bit_cnt<=bit_cnt+1;
    end

/*******************数据输出**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            tx_reg<=1;
        else if(bit_flag==1) 
            case(bit_cnt)
                0:tx_reg<=0;
                1:tx_reg<=data[0];
                2:tx_reg<=data[1];
                3:tx_reg<=data[2];
                4:tx_reg<=data[3];
                5:tx_reg<=data[4];
                6:tx_reg<=data[5];
                7:tx_reg<=data[6];
                8:tx_reg<=data[7];
                9:tx_reg<=1;
                default:tx_reg<=1;
            endcase
    end
endmodule

首先根据系统时钟和波特率计算出N(我的FPGA是125Mhz,需要波特率9600)。

之后根据RS232的时序图写出各个模块,即可实现串口发送。


3.3 Uart_RX模块  

`timescale 1ns / 1ps

module Uart_RX(
    input wire clk,
    input wire rst_n,
    input wire rx,
    output reg [7:0] rx_data,
    output reg rx_flag
    );

/******************内部变量**********************/
parameter N=13021; //N=系统时钟频率/波特率;f=125Mhz,baud=9600。表示N个系统时钟一个数据位
reg rx_reg1;//打排数据
reg rx_reg2;//打排数据
reg rx_reg3;//打排数据
reg start_flag;//起始标志
reg work_en;//工作使能
reg [31:0] baud_cnt;//波特计数器
reg bit_flag;//比特标志
reg [3:0] bit_cnt;//数据位计数,0-8
reg [7:0] rx_data_reg;//数据寄存器
reg rx_flag_reg;//数据标识符寄存器

/*******************数据打拍**********************/
//数据打拍,避免亚稳态
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            rx_reg1<=1;
        else
            rx_reg1<=rx;
    end

always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            rx_reg2<=1;
        else
            rx_reg2<=rx_reg1;
    end

always@(posedge clk or negedge rst_n)
    begin
        if(rst_n==0)
            rx_reg3<=1;
        else
            rx_reg3<=rx_reg2;
    end

/*******************起始标志**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            start_flag<=0;
        else if((rx_reg3==1)&&(rx_reg2==0)&&(work_en==0))//迟滞reg3一个clk
            start_flag<=1;
        else 
            start_flag<=0;
    end

/*******************工作使能**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            work_en<=0;
        else if(start_flag==1)//开始迟滞一个clk,工作使能
            work_en<=1;
        else if((bit_cnt==8)&&(bit_flag==1))
            work_en<=0;
        else
            work_en<=work_en;
    end

/*******************波特计数器**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            baud_cnt<=0;
        else if((baud_cnt==N-1)||(work_en==0))
            baud_cnt<=0;
        else
            baud_cnt<=baud_cnt+1;
    end

/*******************比特标志**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            bit_flag<=0;
        else if(baud_cnt==(N/2-1))
            bit_flag<=1;
        else
            bit_flag<=0;
    end

/*******************数据位计数**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            bit_cnt<=0;
        else if((bit_cnt==8)&&(bit_flag==1))
            bit_cnt<=0;
        else if(bit_flag==1)
            bit_cnt<=bit_cnt+1;
    end
        
/*******************数据寄存器**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            rx_data_reg<=0;
        else if((bit_cnt>=1)&&(bit_cnt<=8)&&(bit_flag==1))
            rx_data_reg<={rx_reg3,rx_data_reg[7:1]};
    end
    
/*******************数据标识符寄存器**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            rx_flag_reg<=0;
        else if((bit_cnt==8)&&(bit_flag==1))
            rx_flag_reg<=1;
        else 
            rx_flag_reg<=0;
    end

/*******************数据输出**********************/
always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            rx_data<=0;
        else if(rx_flag_reg==1)
            rx_data<=rx_data_reg;
    end

always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            rx_flag<=0;
        else
            rx_flag<=rx_flag_reg;
    end
    
endmodule

依然是首先计算N,之后根据时序图实现。


4. 总览

效果如下:

zynq蓝牙,基于FPGA(ZYNQ-Z2)的多功能小车,fpga开发

具体结构如下:

zynq蓝牙,基于FPGA(ZYNQ-Z2)的多功能小车,fpga开发文章来源地址https://www.toymoban.com/news/detail-752733.html

到了这里,关于5—基于FPGA(ZYNQ-Z2)的多功能小车—软件设计—蓝牙串口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于FPGA的多功能数字时钟设计报告

    作品基于intel Cyclone IV E EP4CE10F17C8 FPGA板卡,主要开发环境为Quartus Ⅱ,编程并实现了多功能温湿度电子钟。本作品在实现显示实时时间的基础上,设计并完成了设置闹钟、改变闹钟铃声、显示实时温度和实时湿度、基于以太网通信协议的实时视频传输等功能。在未设置闹钟时

    2024年02月05日
    浏览(51)
  • 基于FPGA的多功能数字钟的设计

    摘要 数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,是人们日常 生活中不可少的必需品。本文介绍了应用FPGA芯片设计多功能数字钟的•种方 案,并讨讨论了有关使用FPGA芯片和VHDL语言实现数字钟设计的技术问题。 数字钟、分频器、译码器、计数器、校

    2024年02月07日
    浏览(52)
  • 基于高云FPGA开发板的多功能数字时钟

    目录 一、数字时钟作品的功能 二、数字时钟作品的主体设计原理和功能说明 三、数字时钟的各设计模块说明及模块程序代码 1) 时钟分频模块time_div、freq_div 2)按键消抖模块key_db 3)控制模块control 4)时间正常计数模块time_count 5)时间设置模块time_set 6)时间动态扫描位选模块time_d

    2024年01月22日
    浏览(63)
  • FPGA多功能数字时钟 基于Quartus实现设计与仿真 华南师范大学数电综设

    专业: 通信工程 学号:__ 姓名: 龚易乾___指导老师: 电子与信息工程学院 2023年2月 有任何疑问可以联系邮箱:codealan@qq.com 项目仓库地址:https://github.com/CodeAlanqian/e-clock github仓库地址 熟练掌握Quartus等EDA设计与仿真工具,掌握多路选择器、N进制计数器、显示译码电路、开关

    2024年02月12日
    浏览(51)
  • STM32超级蓝牙小车——基于STM32F103C8T6的多功能蓝牙小车(PID循迹、跟踪、有源蜂鸣器播放音乐、蓝牙遥控、AD采集+DMA转运等超多元素小车)

    一、项目时间:2023.7.24~11.26 二、实现效果:通过蓝牙控制小车运动与模式转换                         模式一:循迹模式                         模式二:跟踪模式                         模式三:音乐模式                         模式四:控制运动模式 三、使

    2024年02月04日
    浏览(56)
  • 【FPGA】多功能ALU

    目录 一、实验要求 二、源代码 1. 顶层模块 2. 数据输入模块 3. ALU运算模块 4. 结果处理模块 5. 扫描数码管模块 5.1 扫描数码管顶层 5.2 分频器 5.3 数码管显示 三、仿真代码 四、结构层图 五、管脚配置 实验板卡:xc7a100tlc sg324-2L,共20个开关 通过高低位控制,实现32位数据A、

    2024年02月02日
    浏览(60)
  • fpga课设-多功能信号发生器

    1绪论 1.1 背景 信号发生器作为一种历史悠久的测量仪器,早在20年代电子设备刚出现时就产生了。随着通信和雷达技术的发展,40年代出现了主要用于测试各种接收机的标准信号发生器,使得信号发生器从定性分析的测试仪器发展成定量分析的测量仪器。同时还出现了可用来

    2024年02月05日
    浏览(48)
  • FPGA实现10M多功能信号发生器

    方案一:采用模拟锁相环实现。模拟锁相环技术是一项比较成熟的技术。应用模拟锁相环,可将基准频率倍频,或分频得到所需的频率,且调节精度可以做到相当高、稳定性也比较好。但模拟锁相环模拟电路复杂,不易调节,成本较高,并且频率调节不便且调节范围小,输出

    2023年04月09日
    浏览(45)
  • 数字系统设计(FPGA)课程设计: 多功能数字钟

    一、目的: 实现多功能数字钟,具备下列功能: 1、数字钟:能计时,实现小时、分钟、秒的显示; 2、数字跑表:精度至0.01秒 比如显示12.97秒; 3、闹钟: 可以设定闹钟,用试验箱上的蜂鸣器作为闹铃; 4、调时:可以对时间进行设定; 5、日期设定:能设定日期并显示当前

    2023年04月18日
    浏览(47)
  • MsrayPlus多功能搜索引擎采集软件

    摘要: 本文介绍了一款多功能搜索引擎软件-MsrayPlus,该软件能够根据从搜索引擎中检索相关数据,并提供搜索引擎任务、爬虫引擎任务和联系信息采集三大功能。我们将分析该软件在不同领域的应用,并探讨其如何提高工作效率以及与传统方式的优缺点对比。 在当今

    2024年02月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包