《电子技术应用》
您所在的位置:首页 > EDA与制造 > 设计应用 > Simulink环境下的UART串口行为建模及其HDL代码自动生成
Simulink环境下的UART串口行为建模及其HDL代码自动生成
来源:微型机与应用2010年第17期
尹 俊
(上海师范大学 通信与信息系统系,上海 200063)
摘要: 通用非同步收发传输器UART是一种通用串行数据总线,双向通信,可以实现全双工传输和接收,用于异步通信。在Simulink环境下,用STATEFLOW对其进行建模,可以将其原理直接转化成模型,摆脱了传统方式下直接手写代码的弊端,而且可以自动生成HDL代码,为FPGA的设计、开发开辟了新的途径。
Abstract:
Key words :

摘  要: 通用非同步收发传输器UART是一种通用串行数据总线,双向通信,可以实现全双工传输和接收,用于异步通信。在Simulink环境下,用STATEFLOW对其进行建模,可以将其原理直接转化成模型,摆脱了传统方式下直接手写代码的弊端,而且可以自动生成HDL代码,为FPGA的设计、开发开辟了新的途径。
关键词: 代码自动生成;STATEFLOW;HDL;FPGA

1 传统设计方法与基于模型设计的比较[1]
1.1 传统设计方法的缺陷

    (1)信息的交流依赖文档
    传统的开发方法中,在不同阶段彼此之间传递的信息需要依赖文档。由于工程师对系统的认识与理解有一定的局限性以及对文档理解的二义性,会在系统开发的过程中引入一些缺陷甚至错误,而这些缺陷或者错误会一步一步地传递到下一个设计阶段。
    (2)早期设计阶段引入的错误要在开发后期才能发现
    由于设计的嵌入式软件算法需要专门的硬件生产出来之后进行集成的测试,因此在设计阶段早期,引入的一些设计错误要在软、硬件产品都具备之后进行集成与测试时,在开发后期才能够发现早期的错误,此时修正起来不是那么简单,极有可能需要重新编写软件,甚至重新开发硬件。
    (3)手写代码与手写文档
    传统的设计方法中,产品实现过程只能够利用手写代码来完成。这对于FPGA、HDL的初学者和工程师都是一件麻烦事。文档的错误,再加上手写HDL代码的错误,最终的产品就可能有很多问题,以致于无法完成最后的子系统、分系统和全系统的集成工作。
1.2 基于模型的设计优势
    (1)在基于模型的系统设计过程中,所有过程遵循统一环境下的统一的模型。由于可以把测试手段从系统设计的初期引入到整个设计流程中,作为规范的模型能够通过执行仿真来验证自己的正确性,从而保证了规范的正确性。
    (2)连续不断的测试与验证。在模型设计的每个环节都引入了测试仿真手段。利用充分的仿真,可以考察系统不同组件对整个系统的影响。
    (3)自动代码生成。传统的FPGA设计方法往往是一开始就手写HDL代码,这对于初学者是件困难的。而基于模型的设计优点是只要知道设计原理,就可以用模型直观地设计,省去了手写代码的麻烦,提高了开发的效率,缩短了开发周期。而且模型做成子系统后可以自动生成HDL代码,如果有错,只要修改模型,再重新生成HDL代码即可,为后续的开发提供了便利。
2 UART串口通信原理
    在空闲时,TXD为高电平。发送时,先发送起始位(低电平),再发送数据位,最后发送停止位(高电平),发送过程为并入串出。对于接收,空闲时RXD为高电平,低电平来到时,在该位的当中进行采样,如果为0,则为起始位,说明可以采集后面的数据位,直至最后的停止位,接收过程为串入并出。
    数据时序图如图1所示。

3 用Simulink、STATEFLOW实现对UART串口行为建模
    (1)UART发送模块的STATEFLOW建模如图2所示,TxDS与CnTS为并行状态。

    TxDS:从IDLE状态开始,在此状态中,将位计数(BitCnt)设置为0、Ready设置为1(告诉前级模块此时为空闲可以将数据并行传入),将空闲时为高电平(TxD)设置为1;当并行数据有效(Valid=1),将BitCnt设置为10,将要发送的数据(TxDdata)放入临时变量(Tmp),Ready设置为0(告诉前级模块正在发送数据,不要再将新的数据传入)从而进入起始位的发送;进入START状态,发送起始位(TxD=0),当波特率发生器(RateCnt)从15降到0时即控制每一位发送的时间,进入RSHIFT状态(发送数据位);在RSHIFT中,BitCnt减1(即1位发送完毕),将存放在Tmp中待发送数据的最低位取出(发送时先发送最低位),然后Tmp右移1位(准备下一次次低位的发送),当BitCnt减到2时,进入STOP状态;在STOP状态中,发送停止位高电平(TxD=1)。
    CnTS:波特率发生器。
    (2)UART接收模块的STATEFLOW建模如图3所示。RxDS、CnTS、RTS并行工作。

    RxDS:在IDLE状态中,将BitCnt置0,判起始位是否到来,如果为0,进入START中,BitCnt加1变为1。当RateCnt从7减到0时,即在该位的中间时进行判断,如果此时还为0,则确定其为起始位,进入DATA;当RateCnt从15减到0,即在每个数据位的中间对数据位进行判断,将接收到的最低位存放在临时变量Tmp的最高位。通过不断的移位就会将接收到的最低位移到Tmp的最低位,在这个过程中BitCnt不断加1,当BitCnt加到9时回到IDLE。
    CnTS:波特率发生器。
    RTS:负责后续模块之间的握手。
    (3)为了生成HDL代码,必须将UART发送模块和接收模块的STATEFLOW建模部分做成子系统,分别如图4、图5所示。

    (4)将发送模块与接收模块连接成整个Simulink模型,如图6所示。

    (5)UART模型的仿真运行结果如图7所示。

    (6)将发送与接收的代码在Quartus II下做成Symbol,并组成顶层图形文件,如图8所示。

    (7)在Quartus II下仿真。
    ①发送模块在Quartus II下的仿真如图9所示。
    ②接收模块在Quartus II下的仿真如图10所示。
    ③顶层图形文件在Quartus II下的仿真如图11所示。

    本文在Simulink环境下,用STATEFLOW对UART进行建模。事实表明,用STATEFLOW建模克服了手写代码易出错、效率低等弊端,在了解UART原理的基础上,可用直观的模型将原理生动地表达出来,为FPGA设计人员提供了很大的便利,也为FPGA的设计提供了新的方式。
参考文献
[1] 张威.STATEFLOW逻辑系统建模[M].西安:西安电子科技大学出版社,2007.

此内容为AET网站原创,未经授权禁止转载。