GPS的FPGA实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用ram (quartus 自带IP) 开始因为RxD_ready 信号的问题,导致数据存储不正 确(如:RxD_ready 不是一个时钟周期导致同一字符被存了好多次),放弃了 使用。 定义一个memory类型的数据, 如 : reg[7:0] Time_ram[15:0] , 这由16个单元,每个单元由8个寄存器组成。存储 和读取很方便,类似于C语言中的一维数组。
GPS数据的解析与显示 (Verilog HDL)
Time_ram
LCD1602
gps_data[7..0] GPS_TXD
UART接收 Latitude_ram
data_ready
Longitude_ram
解析GPRMC并将所需信息放到memory中
解析GPRMC信息并显示
FPGA 实现数据解析并在LCD1602上显示框图
1、NiosII 软硬协同
1、NIOS II 编程方法 2、项目系统结构 3、项目程序
1、 NIOS II 编程方法
(1)最底层的寄存器操作,我们 可以自己按照altera的文档定义寄 存器结构体。然后写函数直接对 结构体进行操作。然后自己写函 数操作寄存器,要对这些寄存器 ,就要根据system.h里面的各个 设备的基地址来操作结构体。
GPS模块简介:
我们所关心的是GPRMC这条信息,因为其中包括当前格林 威治时间、经度、纬度、日期等。
设计结构图
Top Module
UART Module
Gps_Data_Process Module
LCD Module
实现方式: 1、NiosII 软硬协同 2、纯硬件语言 (Verilog HDL和VHDL)
基于FPGA的GPS采集器设计与实现
项目骨干: 组长:余江 组员:木荣、洪光 仁飞、文斌 超
GPS模块简介:
GPS (Global Position System), 即全球定位系统,它是一个由覆 盖全球的24颗卫星组成的卫星系 统。 GPS系统包括3个基本组成部分: (1)太空部分,即空中的GPS 卫星 (2)控制部分,即地面的GPS卫星 (3)监控系统用户部分,即GPS的移 动用户端
系统RTL原理图
UART接收模块
第n个字节数据流
开 始 位
LSB
MSB
停 止 位
这个模块的好坏直接影响后续模块能否正确解析数据并显示。
通过示波器可以观察到,从GPS_TXD输出的信号是一串脉冲信号。输出的串行 数据遵从RS232标准,特征如下:
没有数据发送时,输出一直是高电平; 数据是一个bit 一个bit 的输出,低位在前,高位在后; 发送一个字符需要10bit, 即 1个开始位(低电平)、8个数据位、1个停止位 每个字符的8bit数据由ASII 码表示(如:‘$’的ASII码是0x24);
GPS模块简介:
Samsung 公司的GPD14B02
GPS模块简介:
数据流:
GPS模块简介:
模块输出信息主要包括4个部分:
(1)位置测定系统定位资料GPGGA $GPGGA,063740.998,2234.2551,N,11408.0339,E,1,08,00.9,000 53.A,M,-2.1,M,,*7B (2)偏差信息和卫星状态GPGSA $GPGSA,A,3,06,16,14,22,25,01,30,20,,,,,01.6,00.9,01.3*0D (3)导航系统卫星相关资料GPGSV $GPGSV,2,1,08,06,26,075,44,16,50,227,47,14,57,097,44,22,17,1 69,41*70 $GPGSV,2,2,08,25,49,352,45,01,64,006,45,30,13,039,39,20,15,3 12,34*7A (4)最起码的GNSS信息GPRMC $GPRMC,012724.000,A,2234.3157,N,11408.0921,E,0.00,,29010 8,,,A*71
RxD =’N
RxD !=’N
S7
RxD =’V’ RxD =’A’
S0
RxD !=’R’ RxD !=’M’
S3 S3 S3 S3
RxD =’R’
RxD !=’C’
S6
S5
RxD =’C’ RxD =’M’
S4
基于FPGA的GPS数据采集 (VHDL)
• 串并转换
• 序列检测 • 高速数据与低速数据
波特率产生器通过对系统时钟(50M)分频得到9600Hz的时钟。
数据处理显示模块
我们所关心的是以“$GPRMC”开头的这条信息,所以首先需检测到 “$GPRMC”这六个字符, 用一个状态机就可以实现(这个就是我们在数字电路 中所学的序列检测器),然后将后续的时间、经纬度信息存储起来。
这个过程中遇到的主要问题是不知道信息如何存储并读出。其中采用了以下方案: 用移位寄存器(如: reg [60:0] gps_data),这里犯了一个严重错误:移位寄 存器是一位一位的存储,而我们的数据是一个字符一个字符的存储(8 位)
1、 NIOS II 编程方法
可以用以下的代码直接从设备中读 出数据 FILE* fd; fd = fopen ("/dev/uart","r+"); if (fd == 0) { perror("Open uart error\n"); exit(1); }
2、项目系统结构
UART 波特率为9600,连接DE2的GPIO,接收GPS串 行数据,lcd显示数据 。
3、项目程序
一般有两种方式:
• 1、用altera软件接口
• • • • • • • • • • • • • • • • • • • • • int set_baudrate(alt_u32 brate) { IOWR_ALTERA_AVALON_UART_DIVISOR(UART_BASE,(unsigned int)(CPU_FRE/brate+0.5)); return 0; } //串口接收中断服务程序 void uart_ISR(void* context,alt_u32 id) { temp=IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE); raw_buf[receive_count++]=temp; } int uart_init(void) { //设置波特率为9600 set_baudrate(baudrate); IOWR_ALTERA_AVALON_UART_CONTROL(UART_BASE, 0x80);//接收中断使能 IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0x00);//清状态标志 IOWR_ALTERA_AVALON_UART_RXDATA(UART_BASE, 0x00);//清接收寄存器 alt_irq_register(UART_IRQ,NULL,uart_ISR); return 0; }
1、 NIOS II 编程方法
(3)HAL提供了硬件寄存器操作 和c语言编程的接口,相当于系统 调用Linux中的系统调用。相当于 实现了设备驱动,我们可以调用 其中的一些函数编程序。在 SOPC Builder生成硬件系统以后 ,NIOS II IDE 能够自动生成对应 的HAL系统库。
目前Nios II 的大部分开发都是在 HAL(hardwareabstraction layer) 的基础上进行的。HAL系统库是 一个轻量级的运行环境,提供了 简单的和硬件通讯的设备驱动程 序。HAL API集成了ANSI C标准 库,这些API允许你用标准C函数 (例如:printf,fopen,fwrite等等) 去存取设备。
大概问题
1、IDE的使用问题,包括标准输入输出,调试级别,优化 级别,标准库的包含问题(要根据系统的ram资源大小 折中选择)等。 2、一开始对可以直接用C语言编程不是很理解,C语言和 硬件系统是如何联系的。后来通过分析HAL和寄存器等 有所了解。 3、LCD方面,NIOS里面用户不需要设置LCD_ON.在 quartus里面,不用的管脚一定要设置三态,因为默认接 地,LCD_ON低电平,不会工作。
图2 HAL体系结构
应为有了这样的接口,所以我们不用考虑底层,直接用C语言编程。
1、 NIOS II 编程方法
(4) HAL API集成了ANSI C标准 库,可以直接调用标准的C函数 编程。 在IDE里面编译以后,system.h文 件中有这样的定义:
#define UART_NAME "/dev/uart" #define UART_TYPE "altera_avalon_uart" #define UART_BASE 0x00041000 #define UART_SPAN 32 #define UART_IRQ 0
UART接收模块
gps_data[7..0]
波特率产生器
RxD
data_ready
数据接收状态机
data_ready 信号产生状态机
这个模块做两件事: 将串行的输入数据转换为并行的数据(8bit)输出; 每接收完一个字符就产生一个单时钟周期脉冲信号。
此UART接收模块主要包括两个功能组成部分:波特率产生器和串 行数据接收状态机。
数据处理显示模块
注:复位时在S0状态,信息有效时,S6状态存储 时间信息,S7状态存储纬度信息,S8状态存储经 度信息。每个状态在RxD_ready 信号有效时读取 RxD.
“$GPRMC”检测、时间、经纬度信息存储状态机
RxD !=’E RxD =’G’
S1
S8
S2
RxD =’$’ RxD !=’G’ RxD =’P’ RxD !=’$’ RxD =’E RxD !=’P’
• 测试方法
• 疑问解决
串并转换
• 协议(说好了的事,不能变卦)
第n个字节数据流
开 始 位
LSB
MSB
停 止 位
• Datareday信号产生(并转串也用到)
process (rst,clk16x,no_bits_rcvd) begin if rst = '1' then reday <= '0' ; elsif clk16x'event and clk16x = '1' then
S4
注:复位时在 S0 状态,信息有效时,S6 状态存储时间信息,S7 状态存储 纬度信息,S8 状态存储经度信息。每个状态在 RxD_ready 信号有效时读 取 RxD.
if std_logic_vector(no_bits_rcvd) = "1010" then reday <= '1' ; else reday<='0' ; end if;
end if ; end process ;
序列检测
• 连续序列
• 非连续序列
• 连续?非连续?
RxD !=’E RxD =’G’
1、 NIOS II 编程方法
(2)altera提供的软件接口和函数, 他封装好了函数,屏蔽了寄存器的 操作。
IORD_ALTERA_AVALON_PIO_DATA(base)
IORD_ALTERA_AVALON_PIO_DIRECTION(b ase) IORD_ALTERA_AVALON_PIO_IRQ_MASK(b ase) IORD_ALTERA_AVALON_PIO_EDGE_CAP(b ase)
S1 S8
RxD RxD =’N =’$’ RxD !=’$’ RxD =’E RxD !=’N RxD !=’P’ RxD !=’G’ RxD =’P’
S2
S7
RxD =’V’ RxD =’A’
S0
RxD !=’R’
S3
RxD =’R’
RxD !=’M’ RxD !=’C’
源自文库S6 S5
RxD !=’A’ or ‘V’ RxD =’C’ RxD =’M’
3、项目程序
2、用标准C函数 本项目用的是第二种方法。 主要函数: void gps_pro(char *)//处理数据 void lcd_display(FILE *lcd)//显示信息 结构体用来存储信息 struct gps_info{ • int time; char status;char latitude_value[BUF_SIZE]; • char longtitude_value[BUF_SIZE];char date[BUF_SIZE]; • }rmc_info;