基于FPGA实现串口多字节发送

这篇具有很好参考价值的文章主要介绍了基于FPGA实现串口多字节发送。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

   在串口试验中,不管是野火还是正点原子的例程,都是单字节的回环测试,无法进行多字节的发送,在野火的串口程序基础上,进行了修改,实现串口多字节的发送。

1、波形图

波形图如下,pi_flag为串口接收完成后的使能信号。
将pi_flag打1拍,延时一个时钟周期后产生pi_flag_reg1,保证数据在发送前能给到待发送数据寄存器UART_data。
pi_flag_reg1再打1拍,延时一个时钟周期后产生pi_flag_reg2,用于产生发送控制使能信号work_en,保证使能开始前数据已给到UART_data。
baud_cnt为发送计数器,波特率为9600,baud_cnt每计数5208次后发送一次数据。
bit_flag为发送使能信号,baud_cnt计数到1时产生1个时钟周期的上升沿。
bit_flag_cnt为发送数据计数器,每发送1bit数据计数一次,直到1帧数据发送完后计数器清零。
byte_tx_done为字节信号发送完毕标志信号,拉高后UART_data右移8位。
byte_tx_done为byte_tx_done1拍的信号,保证UART_data已经完成右移,拉高后将UART_data的后8位数据发送给发送缓存寄存器buffer_data。
cnt_num为发送字节计数器,由需要发送数据的字节数决定。

fpga串口多字节发送,FPGA,fpga开发,嵌入式硬件

2、程序

module UART_tx
#(

parameter UART_BPS = 'd9600, //波特率9600
parameter CLK_FREQ = 'd50_000_000, //时钟频率50Mhz
parameter BYTES = 'd8, //需要发送数据的字节数

parameter S = 8'b0101_0011,
parameter U = 8'b0101_0101,
parameter C = 8'b0100_0011,
parameter E = 8'b0100_0101,
parameter EXCLAMATORY = 8'b0010_0001

)
(
input wire clk,
input wire rst_n,
input wire [(BYTES * 8 -1):0] pi_data,
input wire pi_flag,

output reg tx

);

localparam BAUD_CNT_MAX = CLK_FREQ/UART_BPS ;
//1S钟传输9600bit数据,时钟1S有5000000次,每传输1bi数据,共经过50000000/9600次时钟周期,
//故采样计数最大值50000000/9600=5208

reg work_en; //发送控制使能信号
reg [12:0] baud_cnt;//发送计数器,波特率9600,时钟频率50M,故计数5208次
reg bit_flag;//发送标志信号,baud_cnt为1时产生1个时钟周期的高电平

reg [(BYTES*8-1):0] UART_data; //需要发送的数据
reg [7:0] buffer_data; //发送数据缓存区,每次发送1字节
reg [12:0] cnt_num; //发送数据的字节数
reg byte_tx_done; //1字节数据发送完成标志信号
reg byte_tx_done_reg; //1字节数据发送完成标志信号打1拍,确保待发送数据给到发送数据缓存区
reg [4:0] bit_flag_cnt; //数据发送计数器,每发送1bit计数1次,发送完1字节后清零
reg pi_flag_reg1; //接收完成标志信号打一拍,将数据传递给buffer_data
reg pi_flag_reg2; //pi_flag_reg1打一拍,用于产生发送使能控制信号work_en

always @(posedge clk or negedge rst_n)
if (rst_n == 1’b0)
cnt_num <= 13’d0;
else if ((cnt_num == (BYTES-1)) && (byte_tx_done == 1’b1))
cnt_num <= 13’d0;
else if ((work_en == 1’b1) && (byte_tx_done == 1’b1))
cnt_num <= cnt_num + 1’d1;

always @(posedge clk or negedge rst_n)
if (rst_n == 1’b0)
bit_flag_cnt <= 5’b0;
else if (work_en == 1’b0)
bit_flag_cnt <= 5’b0;
else if( (bit_flag_cnt == 5’d9) && ( (bit_flag == 13’b1) && (work_en == 1’b1) ) )
bit_flag_cnt <= 5’d0;
else if((bit_flag == 1’b1) && (work_en == 1’b1))
bit_flag_cnt <= bit_flag_cnt + 1’b1;

always @(posedge clk or negedge rst_n)
if (rst_n == 1’b0)
byte_tx_done <= 1’b0;
else if ( (bit_flag_cnt == 5’d9) && ( (bit_flag == 13’b1) && (work_en == 1’b1) ) )
byte_tx_done <= 1’b1;
else
byte_tx_done <= 1’b0;

always @(posedge clk or negedge rst_n)
if (rst_n == 1’b0)
byte_tx_done_reg <= 1’b0;
else
byte_tx_done_reg <= byte_tx_done;

always @(posedge clk or negedge rst_n)
if (rst_n == 1’b0)
UART_data <= 'b0;
else if ((pi_flag == 1’b1)&&(cnt_num == 13’d0))
UART_data <= pi_data;
else if (byte_tx_done == 1’b1)
UART_data <= UART_data >> 8;

always @(posedge clk or negedge rst_n)
if( rst_n == 1’b0 )
pi_flag_reg1 <= 1’b0;
else if ((pi_flag == 1’b1) && (cnt_num == 13’d0) )
pi_flag_reg1 <= 1’b1;
else
pi_flag_reg1 <= 1’b0;

always @(posedge clk or negedge rst_n)
if( rst_n == 1’b0 )
pi_flag_reg2 <= 1’b0;
else if ((pi_flag_reg1 == 1’b1) && (cnt_num == 13’d0) )
pi_flag_reg2 <= 1’b1;
else
pi_flag_reg2 <= 1’b0;

always @(posedge clk or negedge rst_n)
if (rst_n == 1’b0)
buffer_data <= 8’b0;
else if ((pi_flag_reg1 == 1’b1)&&(cnt_num == 13’d0))
buffer_data <= UART_data[7:0];
else if ((bit_flag_cnt == 5’d0) && (byte_tx_done_reg == 1’b1))
buffer_data <= UART_data[7:0];

always @(posedge clk or negedge rst_n)
if(rst_n == 1’b0)
work_en <= 1’b0;
else if ((pi_flag_reg2 == 1’b1))
work_en <= 1’b1;
else if ((cnt_num == (BYTES-1)) && ((bit_flag_cnt == 5’d9) && (bit_flag == 1’b1)))
work_en <= 1’b0;

always @(posedge clk or negedge rst_n)
if(rst_n == 1’b0)
baud_cnt <= 13’b0;
else if ((work_en == 1’b0) || (baud_cnt == BAUD_CNT_MAX-1 ))
baud_cnt <= 13’b0;
else if(work_en == 1’b1)
baud_cnt <= baud_cnt +1’b1;

always @(posedge clk or negedge rst_n)
if(rst_n == 1’b0)
bit_flag <= 1’b0;
else if (baud_cnt == 13’b1)
bit_flag <= 1’b1;
else
bit_flag <= 1’b0;

always @(posedge clk or negedge rst_n)
if (rst_n == 1’b0)
tx <= 1’b1;
else if(bit_flag)
case (bit_flag_cnt)
0 : tx <= 1’b0;
1 : tx <= buffer_data[0];
2 : tx <= buffer_data[1];
3 : tx <= buffer_data[2];
4 : tx <= buffer_data[3];
5 : tx <= buffer_data[4];
6 : tx <= buffer_data[5];
7 : tx <= buffer_data[6];
8 : tx <= buffer_data[7];
9 : tx <= 1’b1;
default: tx <= 1’b1;
endcase

endmodule

3、仿真结果

fpga串口多字节发送,FPGA,fpga开发,嵌入式硬件

4、上板实测

上位机成功接收到“SUCCESS!”

fpga串口多字节发送,FPGA,fpga开发,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-559754.html

到了这里,关于基于FPGA实现串口多字节发送的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • FPGA实现串口的任意字节数接收

    目录 1、概述 2、串口接收驱动 3、任意字节接收的实现方法 4、仿真

    2024年02月09日
    浏览(37)
  • FPGA入门学习笔记(十)Vivado设计状态机实现UART多字节数据发送

    使用串口发送5个字节数据到电脑 1、ADC采样的结果为12位,如何使用串口发送 2、16位数据,如何通过串口发送 3、多个字节的数据,如何通过串口发送 UART规定,发送的数据位只能有6、7、8位,若直接修改发送位数,接收模块将不适配。 两种情况: 1、没有开始发送(上一次的

    2024年02月12日
    浏览(50)
  • FPGA 按键控制串口发送

    消抖时间一般为10ms,我使用的板子是ACX720,晶振为50MHZ,20ns为一周期。 状态机 模块设计 设计文件 仿真验证 **注意:**电平信号的传输线中有一个参考电平线(一般是GND),然后信号线上的信号值是由信号线电平和参考电平线的电压差决定。 所以我们一定要养成模块之间共地的

    2024年04月11日
    浏览(38)
  • 【嵌入式系统应用开发】FPGA——基于HC-SR04超声波测距

    硬件 DE2-115 HC-SR04超声波传感器 软件 Quartus 18.1 使用DE2-115开发板驱动HC-SR04模块,并将所测得数据显示到开发板上的数码管。 HC-SR04 超声波测距模块可提供 2cm-400cm的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。图1为 HC-SR04 外观,

    2024年02月08日
    浏览(62)
  • 孩子都能学会的FPGA:第九课——多字节数据的发送和接收

    (原创声明:该文是 作者的原创 ,面向对象是 FPGA入门者 ,后续会有进阶的高级教程。宗旨是 让每个想做FPGA的人轻松入门 , 作者不光让大家知其然,还要让大家知其所以然 !每个工程作者都搭建了全自动化的仿真环境,只需要双击 top_tb.bat 文件就可以完成整个的仿真(前

    2024年02月04日
    浏览(62)
  • STM32标准库开发——串口发送/单字节接收

    串口发送信息 启动串口一的时钟 初始化对应串口一的时钟,引脚,将TX引脚设置为复用推挽输出。 配置串口一配置寄存器,设置波特率为9600,关闭硬件流控,不使用校验位,数据长度为八字节 封装串口发送字节函数 封装串口发送字符串函数 封装串口发送数组函数 封装串口

    2024年01月23日
    浏览(50)
  • 【FPGA零基础学习之旅#14】串口发送字符串

    🎉欢迎来到FPGA专栏~串口发送字符串 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 发送Hello: 🥝 发送数字字符并自

    2024年02月08日
    浏览(44)
  • FPGA学习笔记(三)——串口通信之发送数据(调试过程)

    本学习笔记主要参考小梅哥B站教学视频,网址如下: https://www.bilibili.com/video/BV1va411c7Dz?p=1 使用的编译器为Vivado,HDL语言为verilog 一、串口通信之发送数据 原理 设计代码 测试代码 仿真结果 发现Send_en拉高之前,uart_tx就置为0了,不符合常理。 转到第二个发送信号处,发现Send

    2023年04月09日
    浏览(43)
  • 基于FPGA的SDI发送接口调试,FPGA+GV7700实现1080p和720p的显示

    # 基于FPGA的SDI发送接口调试,FPGA+GV7700实现1080p和720p的显示 上一篇文章已经调试了bt11200接口,本章将基于bt1120接口完善代码,实现1080p60Hz和720p60Hz的显示兼容。 720p60Hz的数据格式 1080p60Hz的数据格式 上板测试,显示彩条 顶层文件 GBR to YUV422顶层 RGB to YUV444 YUV444 to YUV422 YUV422 t

    2024年02月13日
    浏览(49)
  • 【FPGA零基础学习之旅#13】串口发送模块设计与验证

    🎉欢迎来到FPGA专栏~串口发送模块 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 发送测试: 🥝 issp调试测试: 数据

    2024年02月09日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包