图2 接收模块的仿真波形
2.2.3 发送器模块设计
发送器模块将8位并行数据串行发出,用wr写信号装载并行进来的8位数据到9位移位寄存器(shift_reg)的低8位,最高位置为0,表示数据的起始位,数据发送完后发送1。
数据发送前先发送1表示等待数据的到来。等待16个clk16x之后,先发送一个1,再过16个clk16x之后,发送起始位0;以后每过16个clk16x,发送一位数据,直到数据发送完。16个clk16x用计数器设计,数据发送用状态机实现。为了避免时序问题以及保证可测试性,采用单时钟沿同步触发,在15个clk16x到来时,将clk1x置1,在下一个clk16x时钟的上升沿到来后发送一位数据,由于clk1x为高电平持续时间为一个clk16时钟周期,也就是在clk1x的下降沿把一位数据发送出去。即
always@(posedge clk16x)
…………
if(clk1x==1)
…………
图3给出发送模块的仿真波形。由波形可以看出,当输入的并行数据是70H,串行输出正确,其中state、reset、clk1 x、flag和dout分别是状态机、 复位信号、使异步的时钟同步、数据发送出去的标志和串行数据输出,而div8和ask分别是4位计数器和中断请求信号。
图3 发送模块的仿真波形
3 UART 核的仿真、验证与综合、优化
3.1 UART 核的仿真和验证
UART的功能仿真与验证通过测试平台(testbench)使用SYNOPSYS软件的VCS工具,其流程如图4所示[5]。接收和发送数据的正确性已通过图2和3所示仿真波形验证了。
图4 基于testbench 的仿真流程
3.2 UART 核的综合、优化
3.2.1 综合存在的问题
一般在UART设计中,采用多时钟,电平触发,并且判断数据的起始和停止采用额外的存储器或计数器,这必然给验证和综合优化带来时序上的问题,同时会产生毛刺和亚稳态,使得电路设计不够完善。
3.2.2 毛刺的解决
在通常的UART设计中存在组合逻辑,当输入的信号由高电平变低电平而其它某个信号由低电平变高电平时,由于在信号变化的瞬间,组合逻辑的输出并非同时变化,而是有先后之分,将导致输出出现尖脉冲,即产生毛刺。本文采用时钟沿(上升沿)触发,即将组合逻辑输出端通过加到寄存器后输出,从而避免毛刺的产生。