DelayTrigger说明文档

阅读DelayTrigger代码时做的理解笔记

注:本文省略的一些不重要的部分,集中在描述FIFO和串口的使用

IP核调用

时钟分频和FIFO都是直接调用IP核

时钟分频使用clk wizard,可以自定义输入时钟信号和输出时钟信号

FIFO也是自定义输入输出的位宽和深度

Recv模块

串口接收信息

输出:

7位数据recv_data

1位信号rdata_valid,成功接收1位数据时为1,初始状态和正在接收数据时为0

ToFIFO模块

输入输出

输入:

7位数据recv_data

1位信号rdata_valid

波特率时钟,复位信号

输出:

output FIFOWrEn FIFO写使能,为1时表示正在向FIFO写入数据

output OneCMDEnd 1时表示一条命令到达了结尾

output newCMDTYPE 7位,表示正在写入FIFO的命令的类型

output StartWriteFIFO 1时表示正在将命令写入FIFO

output WriteFIFOData 8位,写入FIFO的一个字节数据

代码解读

在项目文件中,大量出现通过两个寄存器来检测上升沿/下降沿的代码

always@(posedge baud16x or negedge rstn) begin 
    if(!rstn) begin
       rdata_valid_0 <= 1'b0;
       rdata_valid_1 <= 1'b0;
    end 
    else begin 
        rdata_valid_0 <= rdata_valid;
        rdata_valid_1 <= rdata_valid_0;
    end  
end 
// rdata_valid go up means come a new byte
assign newbyte = rdata_valid_0 && (!rdata_valid_1);

这里newbyte检测的就是rdata_valid的一个上升沿

通常,一个信号的上升沿可以表示某个操作的开始,下降沿标识某个操作的结束

要读懂一个模块,就要理清里面一个个变量的含义和逻辑关系

弄清从输入变量到中间变量到输出变量的一条逻辑线条

输入 rdata_valid 成功接收一位数据 ->

newbyte 检测到rdata_valid的上升沿 ->

validCMD 检测到一个新字节且是表示命令类型的字节就为1,直到读到结尾才为0(表示正在读取命令中的有效字节) ->

validCMDposedge 检测到validCMD的上升沿(表示读取命令的第一个字节,即命令类型) ->

CMDTYPE 命令类型 / RecCMDByteNum 一条命令读取到的字节数 ->

OneCMDEnd 一条命令读到了最后一个字节

根据这些就可以向寄存器变量GETCMDSETCMD中正确存储命令了

这里的串口协议使用简单的加法校验和,命令前n-2个字节全部加起来,检验其值是否等于最后两位

校验成功后设置StartWriteFIFO为1,表示开始将命令写入FIFO,整条命令写入后将StartWriteFIFO设为0

因此StartWriteFIFO为1表示的是串口接收到数据后,成功读完一条命令并经过校验,正在将这条命令写入FIFO

当StartWriteFIFO为1时,每过一个波特率周期WriteFIFOCnt+1

当StartWriteFIFO为1时,FIFOWrEn为1,当WriteFIFOCnt等于命令长度时,FIFOWrEn为0

当StartWriteFIFO为1时,WriteFIFOData <= 命令[WriteFIFOCnt]

ToFIFO输出的数据,一部分直接流到Delay模块,命令部分先进入FIFO缓存,再流到Delay模块

Delay模块

输入输出

输入:

input StartWriteFIFO

input [7:0]NewCMDTYPE

input [7:0] CMDByte

输出:

output FIFORdEn FIFO读使能

output Transdata 要通过串口发送的字节

output transWren 串口发送写使能

代码解读

StartWriteFIFODnEdg为1表示检测到StartWriteFIFO的下降沿,含义为一条命令已经完全写入FIFO了

StartWriteFIFODnEdg为1时,CMDTYPE读入输入的NewCMDTYPE

StartWriteFIFODnEdg为1时,设置startRdFIFO为1,当FIFORdCnt大于命令长度时,设置startRdFIFO为0,这表示写入一条命令后开始从FIFO读取这条命令,并且读完一条命令后结束读操作

startRdFIFO为1时,每个读时钟周期,FIFORdCnt+1,读完重置为0

StartWriteFIFODnEdg为1时,FIFORdEn也设置为1,读完设置为0

读就是将FIFO输出的那个字节放入对应命令的寄存器

startRdFIFOneg为1时表示检测到startRdFIFO的下降沿,表示已经读完了一条命令

读完后,如果要向UART_TX写入数据(对应GET命令),执行以下操作

当startRdFIFOneg为1时,startcntdelaybeforetrans为1,表示开始发送前的计数

startcntdelaybeforetrans为1时,每个时钟周期DelayBeforeTransCnt+1,当DelayBeforeTransCnt等于100000时(此时延时1ms), startTrans为1,表示开始通过串口发送

当startTrans为1时,Transdata为要发送的字节,然后输出


本文章使用limfx的vscode插件快速发布