求verilogHDL语言大神,解释一下程序意思,最好能每行注释一下,感激不尽。

2024-12-05 15:17:33
推荐回答(1个)
回答1:

module HDLC(RXD,RXCLK,RXSET,TXCLK,TXD,TXDS); //module 头,verilog 95风格

input RXD; //输入信号
input RXCLK; //输入时钟
input RXSET; //输入的复位信号
output[7:0]TXD; //输出的数据,8bit
reg [7:0]TXD; //输出寄存器
output[2:0]TXDS; //输出信号
reg [2:0]TXDS; //输出寄存
output TXCLK; //输出的时钟
reg TXCLK; //输出时钟寄存

reg RXD_D1; //输入的数据寄存器。单比特
reg RXD_D2;
reg RXD_D3;
reg RXD_D4;
reg RXD_D5;
reg RXD_D6;
reg RXD_D7;
reg RXD_D8; //输入的祥祥数据寄存器。单比特

//在接收rxclk下,每个时候域接收rxd数据,寄存一级
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D1<=1'b0;
else RXD_D1<=RXD;

//在接收rxclk下,每个时候域接收rxd数据,寄存二级,即打两拍
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D2<=1'b0;
else RXD_D2<=RXD_D1;

//寄存三级,即打三拍
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D3<=1'b0;
else RXD_D3<=RXD_D2;

always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D4<=1'b0;
else RXD_D4<=RXD_D3;

always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D5<=1'b0;
else RXD_D5<=RXD_D4;

always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D6<=1'b0;
else RXD_D6<=RXD_D5;

always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D7<=1'b0;
else RXD_D7<=RXD_D6;

//寄存8级,即打8拍,
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D8<=1'b0;
else RXD_D8<=RXD_D7;

///////////////////////////////////////////////////////////////////
////////////////////search for 01111110 indacation/////////////////
/谨镇搏//////////////////////////////////////////旅纯////////////////////////
reg [2:0]l_cs,l_ns; //定义2个3bit的状态信号,当前态l_cs,下一个状态l_ns
//3bit的原因在于需要选择的数据为0~7,只需3bit
parameter s_hunt=3'd0,s0=3'd1,s1=3'd2,s2=3'd3,s3=3'd4,s4=3'd5,s5=3'd6,s6=3'd7;
//定义初始态s_hunt=0’
//否则选择将下一个状态l_ns赋给当前态l_cs
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
l_cs<=s_hunt;
else l_cs<=l_ns;

//下面的状态机用于寻找序列"0111111"
//如果找到当前的要寻找的输入数,则跳入到下一个状态,否则跳到s0态,开始新一轮的寻找,
//通过这种方法寻找到所需要的序列“01111110”
always @(l_cs or RXD)
case(l_cs)
s_hunt:begin
if(RXD==1'b0)
l_ns=s0;
else l_ns=s_idle;
end
s0:begin
if(RXD==1'b1)
l_ns=s1;
else l_ns=s0;
end
s1:begin
if(RXD==1'b1)
l_ns=s2;
else l_ns=s0;
end
s2:begin
if(RXD==1'b1)
l_ns=s3;
else l_ns=s0;
end
s3:begin
if(RXD==1'b1)
l_ns=s4;
else l_ns=s0;
end
s4:begin
if(RXD==1'b1)
l_ns=s5;
else l_ns=s0;
end
s5:begin
if(RXD==1'b1)
l_ns=s6;
else l_ns=s0;
end
s6:l_ns=s_idle;
endcase

//定义了寄存器SE_ind,
//该部分逻辑为组合逻辑,当找到所需要找的序列“01111110”时,输出SE_ind为1,否则为0;
//该信号相当于一个指示信号。是否找到所需的序列
reg SE_ind;
always @(l_cs or RXD)
if(l_cs==s6 && RXD==1'b0)
SE_ind=1'b1;
else SE_ind=1'b0;