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

moduleHDLC(RXD,RXCLK,RXSET,TXCLK,TXD,TXDS);inputRXD;inputRXCLK;inputRXSET;output[7:0]... module HDLC(RXD,RXCLK,RXSET,TXCLK,TXD,TXDS);

input RXD;
input RXCLK;
input RXSET;
output[7:0]TXD;
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;
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D1<=1'b0;
else RXD_D1<=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;

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;
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;
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
l_cs<=s_hunt;
else l_cs<=l_ns;

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

reg SE_ind;
always @(l_cs or RXD)
if(l_cs==s6 && RXD==1'b0)
SE_ind=1'b1;
else SE_ind=1'b0;
展开
 我来答
angela_angela
2014-04-19 · TA获得超过495个赞
知道小有建树答主
回答量:130
采纳率:100%
帮助的人:184万
展开全部
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;
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式