1、 基于 FPGA的串口控制器设计 简介 使用硬件描述语言 (HDL) 设计和开发验证 FPGA成为当前的主流因素。使用行为级描述不仅增加了产品的设计效率,也在设计中有独特的验证方式。目前最流行的 HDL语言为 Verilog 和 VHDL。这篇文章将会举例说明用 Verilog语言设计和验证数字异步串行收发器 UART。 UART介绍 通用异步串行收发器 UART 包含两个独立的 VHDL 模块。一个模块实现发射功能 , 另一个实现接收功能,发射和接收功能模块在顶端设计时组合 到一起使用 ,接收和发射的组合是通信通道所必需的。数据写入发射器,从接收器读出,所有的数据以二进制 8 字节的信号通过
2、 CPU 接口。地址映射的发射机和接收机通道可以很容易的在设计顶层的接口构建 。 两者共用一个称为 mclkx 16 的主控时钟,在每个模块中 mclkx 16 被分成独立的波特率时钟。 UART 的功能概况 UART 的基本功能概况见下表。在左边显示传输保持记录,移位记录,传输控制时钟,全部集中在发射机的 txmit 端。在右边显示接收移位寄存器,接收记录和控制逻辑时钟,所有都包含在接收模块的 rxcver 端 ,这两个模块有单独的输入和输出的控制线路,只有双向的数据总线,主时钟和复位线由两个模块共享。 顶层 UART 系统的 I/O 功能描述 UART 时序图 下面显示的是写入传输寄存器的
3、数据是如何被加载到移位寄存器,并在波特率时钟的上升沿,转向 txd 输出端。 发送器 主控时钟 mclkx16 被分频到合适的波特率时钟称为 rxclk,它等于mclkx16/16。数据以平行的形式锁存模块,而转向以串行格式在波特率时钟频率下向 tx 端输出。数据转到 tx 输出遵循 UART 数据格式如图 6 所示。 发送器行为 描述 发送器等待新的数据写入模块,当新的数据写入发送序列模块时数据初始化。被写入的数据以并行方式传送到发送模块然后被转化成串行数据帧从 tx 输出。当没有传输序列的地方, tx 输出是高电平。 发送器实现 Verilog 的内部信号被称为 wire 和 reg 两种
4、数据类型, WIRE 类型的信号用于连续的作业,也称为组合语句, REG 类型的信号用在分配 Verilog 里的 always时钟 ,常常使用逻辑顺序的分配 ,但不是一定的,进一步解释见 Verilog 参考书,模块内部信号的数据类型如表 3 所示。 我们现在已经通过了所有 必要的声明,并已作好准备,看看实际执行,用硬件描述语言使我们以更加行为化的方式描述发送器的功能,而不是把重点放在它在门级的实际执行情况。 在软件编程语言中,函数和程序将大项目分解成更具可读性,管理性,当然也可维护的部件, Verilog 的函数和任务被用来当作多行的 Verilog 代码 ,其中某些输入或信号影响某些输出
5、或变量。函数和任务的使用 ,通常发生在多行代码需要重复使用的设计中,从而使得设计易于阅读和维护肯定, Verilog 函数 ,可以有多种输入,但始终只有一个输出,然而 Verilog 任务可以兼得多投入,多产出, 下面显示了 Verilog 任务,即拥有所有必要的顺序语句,用来描述发送器的转移模式。 我们可以看到在移位寄存器里有 2个标志位叫作 tag1和 tag2,在描述空闲和置位模块时产生相同的作用。 使用这些 Verilog 工作, 我们现在可以产生一个非常容易阅读的行为模型的空穴传输过程。 如果 txdone 和 txdatardy都是正确的,发送器进入负载 模式。在负载模式下,进入发
6、送模式转变,在上升沿的波特率时钟, tsr的内容转移到 tx输出端。 奇偶校验过程产生于 tsr变化中,如下所示 。 模拟发送序列 在写入上升沿时数 据总线容量被锁存,在 txclk 下一个上升沿, thr 的容量载入 tsr,低电平开始位进入 tx,发送标志位显示, thr 再次等待新的数据的写入。在每个发送时钟上升沿, tsr 的容量被送入 tx,在数据传输过程中产生奇偶校验,周期循环时奇偶校验为高电平, tx 产生奇偶校验结果。 接收模块 主控时钟 mclkx16 被分频到合适的波率时钟称为 rxclk,它等于mclkx16/16 。 串行数据为收到的 rx 输入模块,必须按照 UART
7、 的数据格式,串行格式接收到的数据通过 8 位数据总线以并行格式的形式读出。 接收模块行为 描述 根据标准异步串行 UART 行为标准,在连续发送时,发送保持高电平,接收器在等待闲置模式的 rx 端输入为低电平,在 rx 下降沿接收进入保持模式,现在寻求一种有效的开始位等待新的数据帧的到来,如果一个有效的开始位被检测到时,接收器进入转变数据模式,在接收一个数据帧的过程中 ,各种校验和检查错误被执行,当一个完整的数据帧被接收,接收端返回待机模式,接收器基本运作如下所示。 接收器模块的实现 为了产生一个易读易操作的接收器模块,用两种 Verilog 任务 来描述不同的接收方式,当接收在空闲状态时,
8、其中一个 Verilog 任务称为空闲复位,而它需要所有必要的顺序语句来描述接收机复位条件。 当接收器不在复位状态,也不在空闲状态下,在 rx 输入端接收的采样数据,传输到移位寄存器中,在进入的数据中产生奇偶校验位,另外一个 Verilog 任务称为数据移位,需要所有必要的顺序语句来描述上述行为。 利用两个 Verilog 任务实现上述功能,现在在复位状态,空闲状态或者数据传输状态,我们可以产生行为级描述的接收器,所有上述行为是和称为 rxclk的波特率时钟同步的,它 们的实现如下所示。 当低电平开始位到达 rsr0时,一个完整的数据帧将会被接收到,在下一个接收时钟上升沿到来时又回到空闲状态,
9、当返回空闲状态时,接收器显示数据接收准备,然后接收的新数据以并行方式读出,错误的标识被更新,并返回空闲状态,在数据读出后清除。在读下降沿时, rhr 的容量锁存在数据总线,表 8 所示接收器各种错误检查。 接收序列的模拟 连续传输之间的传输线保持高通。在 RX 输入的下降沿,内部 RXCNT 开始计数,同步 mclkx16。如果 RX 输入保持低位 8 个周期 mclkx16,内部状态位空闲复位,那里 能够产生 RXCLK。 RXCLK 现同步到低起始位的中心点。在 RXCLK 的上升沿,数据被从 RX 输入移位到 RSR,当低开始位到达 rsr0时,在下一个接收时钟上升沿又被置空闲位,此时失
10、效。在返回空闲状态时, rsr 的内容被载入到 rhr,状态标志更新,接收位产生 ,rhr 内容能够被读出,在读下降沿时, rhr 内容被应用到数据总线。 硬件描述语言仿真 我们现正研究 HDL如何用于行为级设计来实现数字 UART。而 HDL使设计执行更容易阅读,并且希望能被理解,它还提供能够方便的描述各种程序之间的依存度,通常是发生在这样一 个复杂的事件驱动系统中,例如 UART。我们将很快看到这种描述各种程序之间依存度的能力对于实现仿真是很需要的。 Verilog语言中的模拟仿真叫做测试工具,测试工具是拥有各线路的 HDL代码要生成仿真激励的Verilog模块,而在同一时间端口映射,这些
11、产生的信号将会被模拟。端口映射是通过 异步通用收发传输器的顶层模块的分层模块实例化进入测试工具完成的,如下所示。 这使得仿真激励适用于输入端的设计,同时检测输出的设计,输入激励,可以有条件地对输出响应等,图 19显示说明如何测试工具端口映射到 UART的顶层。 在 测试工具中输出的传输模块又循环到接收器的输入模块,这使得发送器模块用来作为测试信号发生器接收器模块,数据可以并行的方式写入发送器,同时以串行的方式回送到接收器模块的输入端,并且数据最终从接收器以并行格式读出,为了尽可能实现 UART 的自动化测试,三个独立的 Verilog 任务如下,发送写入任务需要一切必要的声明来产生一个并行的数
12、据写入到发送器,数据写入发送器来完成写入接收任务,锁存内部测试工具供以后的分析。接收读出任务需要一切必要的声明来产生一个并行的数据从接收模块读出,数据读出接收器来完成读出接收任务,锁存内 部测试工具供以后的分析。数据比较任务需要一切必要的声明来使先前写入发送器的数据同相应的从接收模块读出的大多数最近接收的数据比较,如果发生任何差异,则“ compare_data”任务通过写出被写入发送模块的数据值来标记为一个错误,以及相应的从接收模块接收并且读出的数据值。 综合 HDL作为设计方法比传统的 FPGA设计输入方式如原理图方式有若干优势,它同时规定了极大的灵活性以及高性能的目标装置的综合流程, UART综合流程已被针对为两个来自 QuickLogic的灵活和高性能的可编程逻辑器件 FPGA系列,如pASIC-1和 pASIC。 综合以后,设计 布局 使用来自 QuickLogic的可编程逻辑工具,在 布局之后 ,UART使用有标注的 Verilog布局时序模块 , 叫作来自于 Simucad的SilosIII的快速 Verilog仿真被用于布局后的仿真, 所有使用过的工具都可以从来自于 QuickLogic的 QuickWorks工具套件中获得。