您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > HDL设计数字UART(中英文翻译)
译文基于FPGA的串行控制器设计ThomasOelsnerQuickLogicEurope应用注释:QAN20简介目前设计开发和验证FPGA系统时,硬件描述语言HDL的使用变得越来越主流。采用行为级描述不仅提高了产品的设计效率,而且在设计验证中显示出其独特的优势。目前最流行的HDL语言是Verilog和VHDL语言。本文介绍了采用verilog语言对数字异步串行收发器进行设计和验证。UART通用异步串行收发器(UART)由二个独立的HDL模块组成。一个模块实现发射功能,而另一个模块则实现接收功能。发射和接收功能模块在顶层设计时组合到一起,这种接收和发射的组合是通信所必需的。数据写入发射器,从接收器读出,所有的数据是以二进制8字节的形式通过一个双向CPU接口。由地址映射的发射机和接收机通道可以很容易地建立接口。两个模块共用一个主控时钟,该时钟为mclkx16,在每个模块里,主控时钟mclkx16被分频成独立的波特率时钟。图1通用异步串行收发器通用异步串行收发器的特点是否具有全双工操作标准UART数据帧格式偶校验或奇校验模式奇偶错误校验帧错误校验溢出错误校验数据接收准备中断数据发送准备中断是是是是是是是是表UART功能概述UART的功能概况UART的基本功能概况见下图。左边为“发送寄存器”、“发送移位寄存器”以及“发送控制逻辑模块”,这些模块包含在发送模块”txmix”中。右边为“接收移位寄存器”、“接收寄存器”和“接收控制逻辑模块”,这些模块包含在发送模块”rxmix”中。这两个模块有单独的输入和输出的控制线路,只有双向的数据总线、主时钟和复位线是共享的。图2UART框图顶层UART系统的I/O功能描述符号类型描述mclkx16输入用于主控时钟波特率的生产。reset输入主复位输入信号。parityerr输出表明被检测的数据帧有无奇偶校验错误。校验编码可以基于偶数或奇数模式。framingerr输出表明从rx输入的数据串是否符合如图2所示的UART数据帧格式。overrun输出表明接收模块准备接收新数据是,模块中仍然有数据未读取。rxrdy输出表明接收模块已经接收新数据,并准备读取。txrdy输出表明数据已准备好加载到发送模块。read输入低电平有效的读选通信号,用于从接收模块中读取数据。write输入低电平有效的写选通信号,用于将数据写入发送模块。data[7:0]输入双向数据总线。数据通过该总线进行发送或接收。tx输出发送模块串行输出。复位或闲置时为高电平。rx输入接收模块串行输入。复位或闲置时为高电平。表2UART的I\O接口UART的标准数据格式图3UART数据帧格式图3为UART的串行数据格式,在串行数据帧中包含8位数据位以及编码比特的信息。在连续传输线路之间,传输线路处于高电平。传输从低位的起始比特开始,接下来的是8比特的数据信息,低位对于后边高位有重要的作用。然后是1比特的奇偶校验位,对之前的8比特的数据位进行奇偶校验。奇偶校验位由奇校验或偶校验的形式进行编码。奇偶校验位之后是高位停止比特,标志数据帧的结束。UART时序图下面显示了数据是如何写入“发送寄存器”并如何加载给“发送移位寄存器”,及在波特率时钟上升沿时如何传输到tx端进行输出的。图4发送时序图下图显示了数据如何从rx端输入写入“接收移位寄存器”并加载到“接收寄存器”。最后接收模块发出rxrdty标志位。图5接收时序图发送模块主控时钟称为mclkx16,被分频成等于mclkx16/16的称为txclk的时钟频率。数据以并行的形式写入模块,而按照波特率时钟的频率以串行的形式从tx端输出。从tx端输出的数据按照图3所示的UART数据帧格式发送。图6发送模块符号类型描述mclkx16输入用于生成主控时钟波特率。reset输入主复位输入信号write输入低电平有效的写选通信号,将数据写入发送模块。data[7:0]输入数据传输是通过数据总线写入发送模块。在写选通脉冲的上升沿,数据总线的内容锁定在一个内部的“发送寄存器”。tx输出串行数据输出。串行数据帧通过这个端口发送,当复位或闲置时,tx保持高电平。txrdy输出表明数据锁存到“发送寄存器”,同时加载到“发送移位寄存器”,“发送寄存器”准备好接收新数据。表2发送模块I\O接口功能符号类型内部标志或信号的描述thrreg[7:0]8位“发送寄存器”,用于锁存发送模块接收到的数据。tsrreg[7:0]8位“发送移位寄存器”,发送模块的数据通过此输出。paritymodewire奇偶校验模式位表明了发送模块进行奇偶校验的模式。值为“1”时,为奇校验,为“0”时,偶校验。txparityreg输出tx奇偶校验的结果。tag1,tag2reg此标志位表明发送模块的状态。txclkreg波特率时钟,根据时钟频率将数据通过tx输出。txdonewire表明一个数据串发送完成。txdatardyreg表明“发送寄存器”已锁存新数据,准备好进行发送。paritycyclewire表明tx输出端接收到txparity的值时,发送模块的状态。cntreg[3:0]暂存器,用于将clkx16时钟分频为txclk时钟。表3发送模块的内部信号发送模块的行为描述发送模块等待新的数据来写入模块,新的数据在发送模块初始化后发送。以并行形式写入模块的数据转换成串行的形式并由tx端输出。当没有传输序列的时候,tx端输出高电平。图7发送的流程发送模块的实现用Verilog语言声明模块端口,这里定义的信号,是来自于模块并在这里输出的。在这里并没有详细地说明方向。moduletxmit(mclkx16,write,reset,tx,txrdy,data);图8发送模块的声明端口定义之后是端口的方向,方向为输入、输出或输入(双向),这在表1中已说明。描述端口方向之后是声明内部信号,内部信号在Verilog语言中内部信号声明为“wire”或“reg”数据类型,wire类型用于连续的赋值,也叫做组合声明。reg类型在Verilog语言中用于“always”块,常常用于时序逻辑的赋值,但有时并不是这样,进一步解释见Verilog参考书。模块内部信号的数据类型说明见表3。我们现在已经进行所有必要的声明,并作好准备看看实际的执行情况。硬件描述语言使我们可以用更多的行为模式来描述发送模块的功能,而不是把重点放在门一级的实际实现上。软件编程语言,函数和过程将庞杂的程序变得更具可读性和易于维护。Verilog语言提供类似的函数和任务结构类似于软件编程语言的函数和过程。一个Verilog语言的函数和任务相当于几行Verilog代码,这些代码使得输入信号影响输出信号或变量。函数和任务通常用在多行代码都是重复出现的地方,从而使得设计易于阅读和维护。一个Verilog的函数可以有多个输入,但始终只有一个输出,而Verilog的任务在某些情况下可以同时有多个输入和多个输出。下图显示了Verilog的任务格式,保留了所有必要的语句,用来描述发送模块的传输模式。图9发送传输模式我们可以看到在移位寄存器有2个标志位tag1和tag2,创建类似的任务来描述发送模块的“闲置”和“负载”模式。使用Verilog语言,现在我们可以创建一个“容易阅读”的行为模型的空穴传输过程。如在波特率时钟的上升沿,tsr中的内容传输到tx端输出。在tsr传输的同时,奇偶校验位也产生了,如图10所示。重要的一点,就是在传输过程中tsr会进行补零。不同的后置标志位tag和tsr补零位的组合表示不同的传输模式。如果奇偶校验循环周期的第二个周期是高电平,这意味着以标志位tg2的值对tsr[1]赋值。当传输结束时,Txdone置高电平,这意味着以标志位tg2的置对tx赋值。基于所述传输序列中的不同状态,“数据位”,“奇偶校验位”或“停止位”被多路复用到tx输出。图10发送传输过程传输序列模拟在写操作信号上升沿时数据总线被锁存,在txclk的下一个上升沿,thr的内容加载到tsr,tx端输出低电平的起始位,同时txrdy标志位表明,该thr再次准备好要写入新的数据。在txclk的每个上升沿,tsr的内容被转移到totx。在数据传输的同时,奇偶校验位也随之产生。在第一个奇偶校验周期,tx持续为高电平,在第二个周期,tx端获得奇偶校验的结果。传输结束时内部的txdone信号为高电平,tx端也持续高电平。图11波特率为2Mhz时的发送时序图接收模块主控时钟mclkx16分频到合适的波特率时钟频率,即rxclk时钟,它等于mclkx16/16。串行数据在rx端接收输入模块,其中串行数据以如图3所示的UART数据帧格式传输,收到的数据通过8位数据总线以并行的形式输出。图13接收模块符号类型I\O接口描述mclkx16输入用于输入主控时钟波特率的生成。reset输入主复位输入信号。read输入低电平有效的读选通信号,用于从接收模块中读取数据。data[7:0]输出数据总线,数据以并行的形式从总线中读取。在读选通信号的下降沿,数据加载到数据总线。rx输入接收信号,处于闲置状态时,保持为高电平。rxrdy输出表明已接收新数据,并准备将其读取。parityerr输出表明无论是否发生奇偶校验错误,都可以进行奇偶校验编码。framingerr输出表明发送到rx的串行信号的数据格式是否符合如图3所示的UART数据帧格式。overrun输出表明新数据准备传输到接收模块时,接收模块仍然有数据未读取。表4接收模块I\O接口信号符号类型内部标志或信号的描述rhrreg[7:0]8位“接收寄存器”,用于锁存接收模块接收到的数据。rsrreg[7:0]8位“接收移位寄存器”,接收模块的数据通过此输入。paritymodewire奇偶校验模式位表明了发送模块进行奇偶校验的模式。值为“1”时,为奇校验,为“0”时,偶校验。rxparityreg输出rsr奇偶校验的结果。paritygenreg表明数据帧奇偶校验后,发生错误。rxclkreg波特率时钟,根据时钟频率进行数据传输。rxstopwire获取从rx接收到的数据帧的结束位。idlereg接收模块的状态位。huntreg接收模块的状态位。rxdatardyreg表明新数据以接收,并准备读取。rxcntreg[3:0]暂存器,用于将clkx16时钟分频为rxclk时钟。表5接收模块的内部信号接收模块行为描述在连续发送时,传输线保持高电平,根据异步串行UART标准,接收模块在等待“闲置”模式的rx端变为低电平。在rx的下降沿时,接收模块进入“捕获”模式,因为现在正在寻找一个新的数据帧的有效起始位。当有效的开始位被检测到时,接收器进入“数据传输”模式。如果检测到无效的起始位,接收模块则进入“闲置”模式。当接收到一个数据帧时,各种校验和检查同时进行。接收模块接收到一个完整的数据帧时,接收端返回待机模式,接收模块基本运作如下所示。图13接收的流程接收频率为mclkx16,和第一上升沿的rxclk常常发生在中心点开始位,如下图显示,对于中心点的起始位及后边的数据字节,波特率时钟是同步。图14同步时钟rxclk起始位的中心点接收器模块的实现为了创建一个易读易操作的接收模块,用两个Verilog任务来描述不同的接收方式,当接收在空闲状态时,其中一个Verilog称为“空闲复位”,下图中有用来描述该接收机复位条件的必要的语句。图15复位条件和闲置模式下的接收模块当接收模块不在复位状态,也不在空闲状态下,接收模块在rx输入端采样数据,传输到移位寄存器中,同时根据输入的数据产生奇偶校验位。这个Verilog任务称为“数据传输”,下图包括所有以描述上述行为的必要语句。图16接收模块数据的传输利用两个Verilog任务实现上述功能,现我们可以在接收模块的复位状态、空闲状态或者数据传输状态对接收模块进行行为级的描述,所有上述行为是和一个叫做rxclk的波特率时钟同步的,它们的实现如下所示。图17接收模块进程当低电平起始位到达rsr[0]时,一个完整的数据帧将会被接收,在下一个接收时钟上升沿到来时,接收模块又回到空闲状
本文标题:HDL设计数字UART(中英文翻译)
链接地址:https://www.777doc.com/doc-24209 .html