模块划分(RTL级划分)
一. 结构组成分析
结合设计需求,该设计可划分成4个一级模块:config_registers, clken_gen, frame_deal,和 RS232模块,如下图所示。
config_registers模块用于存放配置寄存器组; clken_gen模块用于产生时钟使能,由于系统时钟频率为40Mhz,为了避免使用分频时钟,我们采用时钟使能的方法,这种方法可以让设计变的简单和可靠; frame_deal模块用于完成数据帧的处理,它包括tx_frame和rx_frame两个子模块,分别对应发送帧和接收帧的处理;RS232模块用于完成与RS232接口相关的功能,它包括了txmit和rxvr子模块,分别对应于UART的发送和接收功能。
二. 各个模块
1.tx_frame模块
本模块主要完成发送帧的功能。系统在收到主机传过来的读命令后,启动状态机,按“同步字–>帧头–>数据–>校验和”的顺序往下一级RS232模块发送数据。代码如下图所示:
输入输出简化图:
2.rx_frame模块
rx_frame模块完成的功能有:判断数据帧是否完整和有效;判断数据帧是否超时(例如某一个字节丢失引起的数据帧不完整的现象);根据有效数据帧的信息给其他模块提供处理信息。代码如下:
输入输出简化图:
3.frame_deal模块
这个模块主要完成对 rx_frame和 tx_frame模块的封装。
代码如下:
输入输出简化图:
4.txmit模块
txmit模块实现了UART的发送功能。在uart_txdata_en信号有效后,启动电路。send_cnt信号是设计中的关键信号,它控制着UART的起始位,停止位以及数据的发送。在uart_txdata_en有效后,send_cnt开始计数,当send_cnt为0时,发起始位;当send_cnt为9时,发停止位;当send_cnt介于1和8时,发送数据。代码如下:
输入输出简化图:
5.rxvr模块
rxvr模块实现了UART的接收。它通过一个高速时钟使能(16x)信号对输入数据 rs232_din进行下降沿检测,在检测到起始位之后启动电路,开始接收数据。需要注意的是,本模块的rs232_1clk_en信号并非像 txmit 模块那样由 clk_en_gen模块产生,而是由 rs232_16clk_en 信号分频得到。这样做的原因是接收的数据和本地的时钟并没有固定的相位关系,我们不能由同频率的时钟使能信号对异步数据进行采样,否则将会因两地频差产生滑码;在检测到 UART 帧的起始位后再由高速时钟使能产生低速(同频率)时钟使能信号的方法可以有效的避开这个问题。
输入输出简化图:
6.rs232模块
rs232模块的主要功能是对UART发送模块 txmit 以及接收模块 rxvr 进行封装。具体代码如下:
7.config_registers模块
config_registers模块主要用于存放配置寄存器,并实现对寄存器的写入和读出的功能。对于配置寄存器电路的设计一般都可以采用这种方式:把这部分电路独立到一个一级模块,除时钟复位等信号外,设置写命令、配置寄存器地址、读写数据通道。在写命令到来时,根据地址将配置数据写入相应寄存器。
可以看出本模块没有设置读命令,如何实现读操作呢?事实上这里不需要读命令,我们只需要通过地址信号选择输出即可,而由其他模块控制数据采样,并将数据传送到芯片外。尽可能地不对数据通道加控制信号;只在数据采样点处加控制信号以保证数据的正确传输。
输入输出简化图:
8. clken_gen模块
这模块的作用是产生时钟使能信号。代码如下:
输入输出简化图:
9. top_module模块
模块作用:用于最顶层封装。代码如下:
输入输出简化图: