(1)数据加载过程。数据的接收过程可以定义3个状态:空闲“idle”状态、接收“receive”和接收完成 “receive_over”。UART内核模块在复位后进入空闲状态。如果信号检测器检测到数据传输,即new_data一‘1’,UART内核检测到此信号就会进入接收状态。在UART进入由空闲状态转为接收状态过程中,需要进行一系列的接收预备操作,包括将子模块复位、选择移位寄存器串行输人数据以及选择移位寄存器的输入时钟等。进入接收状态后,波特率发生器开始工作,其输出波特率时钟驱动移位寄存器同步的存储RS 232接收端口上的数据,并且其提示信号“indicator”驱动计数器进行计数。当所有数据接收完成,计数器也达到了其计数的上阈,此时 overflow=‘1’,通知UART内核进入接收状态。UART内核进入接收完成状态的同时,会检查奇偶校验的结果,同时使得子模块使能信号无效,以停止各个子模块。
UART内核的接收完成状态仅保持1个时钟周期,设置这个状态的作用是借用一个时钟周期复位信号检测器,准备接收下次数据传输。
(2)数据加载和发送过程。数据加载和发送的过程都是为发送数据而设定的,所以将它们放在一起进行介绍,可以用4个状态来实现上述的过程,即空闲、加载、发送和发送完成。其中的空闲状态是UART内核复位后的空闲状态,与上面介绍的数据接收过程的空闲状态一致。数据加载过程在数据发送过程之前进行。UART内核复位后进入空闲状态,当探测到发送控制信号有效时,即send=‘1’,便会进入加载状态开始数据加载。在进入加载状态的同时,UART内核会将移位寄存器、计数器复位,并且通过选择信号使得移位寄存器的输入为发送数据缓冲器模块产生的串行数据序列,使得移位寄存器和计数器的工作时钟为系统时钟。进入加载状态后,在UART内核控制下,发送数据缓冲器模块会将完整的待发送序列加载到移位寄存器的数据输入端,发送的序列是和系统时钟同步的,移位寄存器在系统时钟的驱动下不断读人输入端数据并保存在内部寄存器内。在移位寄存器加载数据的同时,计数器也在时钟的驱动下进行计数,由于都是工作在系统时钟下,所以当所有数据被加载时,计数器也达到了计数的上阈(即串行数据的总量),此时overflow=‘1’,通知UART内核进入发送状态。UART内核进入发送状态的同时会改变几个选择信号,比如将移位寄存器的时钟设为波特率时钟,将计数器时钟设为波特率的提示信号,最重要的是将输出信号送到RS 232的发送端口TxD上。发送的过程和接收类似,移位寄存器在波特率时钟的驱动下内部寄存器的数据串行的发送出去,同时计数器在波特率发生器的提示信号驱动下进行计数。UART内核在计数器到达计数上阈后便进入发送完成模式,并且输出发送完成信号。
3 UART顶层模块的仿真测试
将上述各个模块的VHDL代码生成原理图符号,并在原理图编辑工具中将各个模块连接起组成1个完整的UART模块。为了验证 UART模块的正确性,对UART的发送过程和接收过程分别进行了波形仿真。为便于观察波形,波特率产生器设置为4个系统时钟产生一个完整的波特率时钟。图9是UART模块接收过程的仿真波形图。
由仿真波形图可以看出,接收端RxD上的数据序列为0101010101,起始位‘O’后为数据位“10101010”,最后一位为停止位 ‘1’。在10个波特率时钟之后,UART发出1个接收完成信号recv一‘1’,并在数据输出端“new_data”将接收的数据输出给后续数据处理模块。由于发送数据时首先发送数据的最低位,因此接收的数据应为“01010101”,将光条放置数据输出端“new_data”的数据输出波形上,可以从数据栏看到此时数据输出端new_data=“01010101”,UART数据接收功能完全正确。
图10为UART发送过程仿真波形。由图可以看出,send=‘1’后待发送数据为“01010101”,将待发送数据加上起始位和停止位,并从最低位开始发送,则发送端txd上的数据序列为“0101010101”,发送停止位后,发送结束信号send_over=‘1’。图10 证明UART数据发送功能完全正确。
4 结 语
介绍了UART在可编程逻辑器件FPGA上的实现,并通过实际电路验证了设计的功能,使用FPGA不仅可以方便地用串口协议与PC 机进行串行通信,而且扩展了板级系统的接口功能。应用在可编程器件FP—GA内部,可以很大程度地减少电路板的使用面积,并提高系统的稳定性和可编程性。