|
//------------ 文件名:seqdet.v -------------------
/*********************************************************************
*** 模块功能:本模块能对串行输入的数据流进行检测,只要发现10010
*** 码型会立即输出一个高位的电平。
*** 本模块是RTL级可综合模块,已通过综合后门级仿真
*********************************************************************/
module seqdet( x, z, clk, rst);
input x,clk, rst;
output z;
reg [2:0] state;//状态寄存器
wire z;
parameter IDLE = 3 'd0,
A = 3 'd1,
B = 3 'd2,
C = 3 'd3,
D = 3 'd4,
E = 3 'd5,
F = 3 'd6,
G = 3 'd7;
assign z =(state==D && x==0) ? 1 :0;
//状态为D时又收到了0,表明10010收到应有输出Z为高
always @(posedge clk or negedge rst)
if(!rst)
begin
state<=IDLE;
end
else
casex( state)
IDLE: if(x==1)
state<=A; //用状态变量记住高电平(x==1)来过
else state<= IDLE; //输入的是低电平,不符合要求,所以状态保留不变
A: if (x==0)
state<=B; //用状态变量记住第二位正确低电平(x==0)来过
else state<= A; //输入的是高电平,不符合要求,所以状态保留不变
B: if (x==0)
state<=C; //用状态变量记住第三位正确低电平(x==0)来过
else state<=F; //输入的是高电平,不符合要求,记住只有一位曾经对过
C: if(x==1)
state<=D; //用状态变量记住第四位正确高电平(x==1)来过
else state<=G; //输入的是低电平,不符合要求,记住没有一位曾经对过
D: if(x==0)
state<=E; //用状态变量记住第五位正确低电平(x==0)来过
else state<=A; //输入的是高电平,不符合要求,记住只1位对过
//回到状态A
E: if(x==0)
state<=C; //用状态变量记住1 0 0曾经来过,此状态为C
else state<=A; //输入的是高电平,只有1位正确,该状态是A
F: if(x==1)
state<=A; //输入的是高电平,只有1位正确,该状态是A
else
state<=B; //输入的是低电平,已有2位正确,该状态是B
G: if(x==1)
state<=F; //输入的又是高电平,只有1位正确,记该状态F
else state <=B; //输入的是低电平,已有2位正确,该状态是B
default: state<=IDLE;
endcase
endmodule
//------ seqdet.v 文件的结束------------------------------------
以上是标准答案,我对其中G状态的处理表示不理解,各位讨论下啊。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|