本实验采用 UARTUniversal Asynchronous Receiver Transmitter) 接口。 UART为低速接口,双工通信,在收发方向上采用相同的通信方式。
计算机综合实验之GPS导航系统的ipcore部分
如图  所示, 空闲时, 信号处于高电平状态。当进行数据传输时,首先是 位起始位(低电平),然后是 位数据位,最后是 位终止位(高电平)。由于接口是串口,因此要进行“串行改并行”的操作。具体来说, rx 信号作为输入信号,每次只能传输一个二进制位,而接口控制器在进行操作时,根据状态寄存器来判断是否已经接收完了一个 位的数据,只在 位输入结束后将 位数据一起取走。从而完成了“串行改并行”。
根据实验要求,信号波特率为 
9600, AXI 总线的时钟频率为 100MHz, 需要对时钟信号进行分频。这一部分逻辑在 gps_v1_0_S00_AXI.v(见附录) 中实现。定义变量 CLOCK_DIVIDER,其计算方式为:
CLOCK_DIVIDER = clock rate / (baud rate * bit width)
针对读数据过程,定义变量 tx_clk_divider,每个时钟周期减 1,当该变量为 时,进入状态转移和操作的逻辑,并将该变量置为 CLOCK_DIVIDER 并重新开始计数。为了保证在波形的中间读数,设置变量 rx_countdown。每一个 bit 的位宽度为 4,在进行状态转移和操作的时候,可以同时对该变量进行赋值。 由此可以控制两次操作之间的时间间隔, 当 rx_countdown 倒数到 时进行操作。

内部结构图如图 所示。 gps_v1_0_0 是 gps 模块。
其中 
rx 是从 GPS 定位系统中接收到的相应信息,内容包含类型、版本、经纬度以及海拔等。
另有 
tx 由程序向 GPS 定位系统发送请求,包括定位系统的切换请求等等,但是由于时间和能力的限制,这一部分我们尚未调试通过。 

计算机综合实验之GPS导航系统的ipcore部分
本实验实现的接口控制器以轮询方式工作。在每一个周期内,查询控制器当前所处的状态,更新状态寄存器的值,并根据当前状态进行相应的操作。
根据当前读取情况的不同,控制器的状态可以分为七种,各个状态之间会因为条件的触发而相互转化。
RX_IDLE: 空闲状态。无数据传输时为高电平,出现低电平表示数据的开始,状态跳转到 RX_CHECK_START 
RX_CHECK_START: 检验起始位。如果为低电平,说明脉冲还在,起始位正常,状
态跳转到 
RX_READ_BITS;否则,说明脉冲的时长短于一个位长度的一半,这不是
一个合法的传输,状态跳转到 
RX_ERROR
RX_READ_BITS: 正在读状态。将新的一位数据存入 rx_data 寄存器,更新剩余要读的位数,如果没有剩余位要读,状态跳转到 RX_CHECK_STOP;否则,继续读下一位,状态仍为 RX_READ_BITS
RX_CHECK_STOP: 检验结束位。如果结束位为低电平,状态跳转到 RX_RECEIVED;否则,接受出错,状态跳转到 RX_ERROR
RX_RECEIVED: 已成功接收一个 byte。 RX_RECEIVED 状态持续时间达到一个时钟周期后,状态跳转到 RX_IDLE
RX_ERROR: 接收数据时出错。 RX_ERROR 状态持续时间达到一个时钟周期后,等待两个位长度后重新开始下一个传输,状态跳转到 RX_DELAY_RESTART
RX_DELAY_RESTART: 延迟状态。如果等待时间已经到达两个位宽度,状态跳转到RX_IDLE;否则,继续等待,状态仍为 RX_DELAY_RESTART
TX 的状态与 RX 类似,但是这一部分我们尚未实现。) 

计算机综合实验之GPS导航系统的ipcore部分


寄存器设置
实验要求设计满足 AXI 总线的 UART 接口控制器,包含最基本的寄存器(控制寄存器、状态寄存器、发送数据寄存器、接收数据寄存器、波特率设置寄存器等)。为了实现接口控制器在各个状态之间的转移,并根据其当前状态决定下一步的操作,需要设置状态寄存器标
记其状态。

使用 AXI 总线自带的四个寄存器 slv_reg0、 slv_reg1、 slv_reg2、 slv_reg3。四个寄存器长度均为 32 位。在 slv_reg0 的最后 位中存放读取到的数据。 slv_reg2 的最后三位作为状态寄存器,分别为 recv_error,is_receiving,received

recv_error: 接收出错。当接口控制器处于 RX_ERROR 状态时,该位置为 1

is_receiving: 正在接收数据。当接口控制器处于 RX_READ_BITS 状态时,该位置为 1

reveived: 已经接受完数据。当接口控制器处于 RX_RECEIVED 状态时,该位置为1。由于状态转移逻辑中, RX_RECEIVED 状态只持续一个时钟信号,时间很短,该寄存器中的值有可能读取不到,因此在 uart.v 文件中定义了变量 temp, 将其与reveived相连。当读取完一个 8位的数据时,将 temp置为1,从而解决了 reveived的高电平持续时间太短,有可能读取不到的问题。

对程序进行仿真, rx 输入的信号为“0110110111”,仿真结果如下图所示: 

计算机综合实验之GPS导航系统的ipcore部分

clk 为时钟信号, rst 重置位, rx 为输入信号, received 为状态寄存器,当接收完一个 位的数据时, received 为 1, rx_byte 为接收数据寄存器,存放读取到的数据, is_reveiving 为状态寄存器,当接口控制器正在读取数据时,该位为 1
在本次仿真中, 
rx 输入的信号为“0110110111”,第一位的 为起始位,最后一位的为结束位,中间的“11011011”为要读取的数据。可以从图 中看到,当 rx 出现低电平时,表示起始位到来,开始传输数据,is_reveiving 变为 1,开始接受数据。在此之后, 位数据依次存入八位寄存器中。数据读取结束后,结束位到来, is_reveiving 变为 0, reveived 变为 1,表示已经接受完一个 位的数据。
在此基础上修改仿真文件,使 
rx 传送 20 位的数据,进行进一步测试。 在此不再赘述。


相关文章: