xilinx FPGA 串口设计笔记

2024-06-24 07:32
文章标签 串口 xilinx fpga 笔记 设计

本文主要是介绍xilinx FPGA 串口设计笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

xilinx FPGA  串口设计笔记
在设计中,需要用 FPGA 读取 GPS 内部的信息,GPS 的通信方式为串口,所以在 FPGA
中移植了串口程序。
本次移植的程序源代码是特权的串口程序,本以为移植应该很快就能完成, 但其中还是
出了一写小问题,耽误了不少的时间,下面将问题进行一个总结!
以下是串口的时序:
在设计中,耽误时间最长的问题就是数据老是出错,为了找出问题的所在,用示波器观察了
一下串口发送的数据!
串口发送的软件如图所示:
通过定时发送 hex 数据:0x55,如图:
其中绿色的为电脑发送的串口数据波形,紫色为波特率发生器产生的读数据的触发脉冲,
也就是说在上升沿的时候读取串口信号的数据,从图可以看出,在每个数据的中间段, FPGA
对信号进行了读取,也就是说 FPGA 的波特率设置是没有问题的。
为了进一步的验证,又发了一次 0xaa,进行了一次对比。
通过定时发送 hex 数据:0xaa,如图:
通过上面的测试可知,程序设计的波特率以及读写数据的时序是没有问题的,但是在读数据
的时候依然出现错误。
在此过程中,发了两个数据进行验证。
通过定时发送 hex 数据:0xff,0xff 如图:
在通过发送两个数据后发现,串口发送的一个数据的位数为 10 位,
1bit 下降沿的起始位+8bit 的数据位+1bit 的停止位。
也就是说串口发送的数据长度不是固定的,在没有校验位的情况下,其长度为 10bit,
而特权的程序的,他的串口设置的读取长度为 12bit,这样也就造成了数据的错位,最终导
致数据的整体出错!!
在对程序进行了修改过发现,程序运行正常。
module wi125_time(
input      clk,            // 48MHz 主时钟
input      rst_n,          //低电平复位信号
input      wi125_uart_rx,      // RS232 接收数据信号
output    wi125_data_ok,
output[7:0] wi125_rx_data,
output      ww
);
//----------------------------------串口波特率设置---------------------------------//
//功能:将串口的波特率设置为 38400bps
//----------------------------------------------------------reg[12:0] cnt;                      //分频计数
reg clk_bps;                      //波特率时钟寄存器
reg bps_start;
always @ (posedge clk or negedge rst_n)
if(!rst_n) cnt <= 13'd0;
else if((cnt == 1250) || !bps_start) 
cnt <= 13'd0;                  //波特率计数清零
else 
cnt <= cnt+1'b1;                //波特率时钟计数启动
always @ (posedge clk or negedge rst_n)
if(!rst_n) clk_bps <= 1'b0;
else if(cnt == 625) 
clk_bps <= 1'b1;                //  clk_bps_r 高电平为接收
数据位的中间采样点,同时也作为发送数据的数据改变点
else 
clk_bps <= 1'b0;
assign ww=clk_bps;
//----------------------------------串口波特率设置---------------------------------//
//功能:将串口的波特率设置为 38400bps
//----------------------------------------------------------reg rs232_rx0,rs232_rx1,rs232_rx2,rs232_rx3;  //接收数据寄存器,滤波用
wire neg_rs232_rx;                 //表示数据线接收到下降沿
reg rx_int1,rx_int2;
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) 
begin
rs232_rx0 <= 1'b0;
rs232_rx1 <= 1'b0;
rs232_rx2 <= 1'b0;
rs232_rx3 <= 1'b0;
rx_int1    <= 1'b0;
rx_int2    <= 1'b0; 
end
else 
begin
rs232_rx0 <= wi125_uart_rx;
rs232_rx1 <= rs232_rx0;
rs232_rx2 <= rs232_rx1;
rs232_rx3 <= rs232_rx2;
rx_int1    <= rx_int;
rx_int2    <= rx_int1;
end
end
//下面的下降沿检测可以滤掉<20ns-40ns 的毛刺(包括高脉冲和低脉冲毛刺),
//这里就是用资源换稳定(前提是我们对时间要求不是那么苛刻,因为输入信号打
了好几拍)
//(当然我们的有效低脉冲信号肯定是远远大于 40ns 的)
assign neg_rs232_rx = rs232_rx3 & rs232_rx2 & ~rs232_rx1 & ~rs232_rx0;  // 接收到下降沿
后 neg_rs232_rx 置高一个时钟周期
assign wi125_data_ok = rx_int2&~rx_int1;
//----------------------------------------------------------------reg[3:0] num;                      //移位次数
reg rx_int;                        // 接收数据中断信号,
接收到数据期间始终为高电平
always @ (posedge clk or negedge rst_n)
if(!rst_n) 
begin
bps_start <= 1'bz;
rx_int <= 1'b0;
end
else if(neg_rs232_rx)                //接收到串口接收线 rs232_rx 的
下降沿标志信号
begin   
bps_start <= 1'b1;            //启动串口准备数据接收
rx_int <= 1'b1;              //接收数据中断信号使能
end
else if(num==4'd10)                  //接收完有用数据信息
begin     
bps_start <= 1'b0;            //数据接收完毕,释放波特率启
动信号
rx_int      <= 1'b0;                //接收数据中断信号关闭
end
//---------------------------------------------------------------- 
reg[7:0] rx_data_r;                  //串口接收数据寄存器,保存直
至下一个数据来到
//----------------------------------------------------------------reg[7:0] rx_temp_data;                //当前接收数据寄存器
always @ (posedge clk or negedge rst_n)
if(!rst_n) 
begin
rx_temp_data    <= 8'd0;
num          <= 4'd0;
rx_data_r      <= 8'd0;
end
else if(rx_int) 
begin                          //接收数据处理
if(clk_bps) 
begin                        // 读取并保 存数
据,接收数据为一个起始位,8bit 数据,1 或 2 个结束位
num <= num+1'b1;
case (num)
4'd1: rx_temp_data[0] <= wi125_uart_rx;  //锁存第 0bit
4'd2: rx_temp_data[1] <= wi125_uart_rx;  //锁存第 1bit
4'd3: rx_temp_data[2] <= wi125_uart_rx;  //锁存第 2bit
4'd4: rx_temp_data[3] <= wi125_uart_rx;  //锁存第 3bit
4'd5: rx_temp_data[4] <= wi125_uart_rx;  //锁存第 4bit
4'd6: rx_temp_data[5] <= wi125_uart_rx;  //锁存第 5bit
4'd7: rx_temp_data[6] <= wi125_uart_rx;  //锁存第 6bit
4'd8: rx_temp_data[7] <= wi125_uart_rx;  //锁存第 7bit
default: ;
endcase
end
else if(num == 4'd10)
begin    //我们的标准接收模式下只有 1+8+1(2)=10bit 的有效数据
num <= 4'd0;        //接收到 STOP 位后结束,num 清零
rx_data_r <= rx_temp_data;  //把数据锁存到数据寄存器 rx_data 中
end 
end
assign wi125_rx_data = rx_data_r; 
endmodule

这篇关于xilinx FPGA 串口设计笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089528

相关文章

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

在线装修管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,装修队管理,用户管理,装修管理,基础数据管理,论坛管理 前台账户功能包括:系统首页,个人中心,公告信息,论坛,装修,装修队 开发系统:Windows 架构模式:B/S JDK版本:Java JDK1.8 开发工具:IDEA(推荐) 数据库版本: mysql5.7 数据库可视化工具: navicat 服务器:SpringBoot自带 ap

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

操作系统实训复习笔记(1)

目录 Linux vi/vim编辑器(简单) (1)vi/vim基本用法。 (2)vi/vim基础操作。 进程基础操作(简单) (1)fork()函数。 写文件系统函数(中等) ​编辑 (1)C语言读取文件。 (2)C语言写入文件。 1、write()函数。  读文件系统函数(简单) (1)read()函数。 作者本人的操作系统实训复习笔记 Linux

比较学习难度:Adobe Illustrator、Photoshop和新兴在线设计平台

从入门设计开始,几乎没有人不知道 Adobe 公司两大设计软件:Adobe Illustrator和 Photoshop。虽然AI和PS很有名,有一定设计经验的设计师可以在早期探索和使用后大致了解AI和PS的区别,但似乎很少有人会系统地比较AI和PS。目前,设计软件功能多样,轻量级和网页设计软件已成为许多设计师的需求。对于初学者来说,一篇有针对性的AI和PS比较总结文章具有非常重要的指导意义。毕竟

LVGL快速入门笔记

目录 一、基础知识 1. 基础对象(lv_obj) 2. 基础对象的大小(size) 3. 基础对象的位置(position) 3.1 直接设置方式 3.2 参照父对象对齐 3.3 获取位置 4. 基础对象的盒子模型(border-box) 5. 基础对象的样式(styles) 5.1 样式的状态和部分 5.1.1 对象可以处于以下状态States的组合: 5.1.2 对象

DDS信号的发生器(验证篇)——FPGA学习笔记8

前言:第一部分详细讲解DDS核心框图,还请读者深入阅读第一部分,以便理解DDS核心思想 三刷小梅哥视频总结! 小梅哥https://www.corecourse.com/lander 一、DDS简介         DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有低成本、低功耗、高分辨率、频率转换时间短、相位连续性好等优点,对数字信