阅读DelayTrigger代码时做的理解笔记
注:本文省略的一些不重要的部分,集中在描述FIFO和串口的使用
时钟分频和FIFO都是直接调用IP核
时钟分频使用clk wizard,可以自定义输入时钟信号和输出时钟信号
FIFO也是自定义输入输出的位宽和深度
串口接收信息
输出:
7位数据recv_data
1位信号rdata_valid,成功接收1位数据时为1,初始状态和正在接收数据时为0
输入:
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 一条命令读到了最后一个字节
根据这些就可以向寄存器变量GETCMD
和SETCMD
中正确存储命令了
这里的串口协议使用简单的加法校验和,命令前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模块
输入:
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插件快速发布