对夏宇闻老师 verilog HDL教程15章习题的疑问。
//------------ 文件名:seqdet.v -------------------/*********************************************************************
*** 模块功能:本模块能对串行输入的数据流进行检测,只要发现10010
*** 码型会立即输出一个高位的电平。
*** 本模块是RTL级可综合模块,已通过综合后门级仿真
*********************************************************************/
module seqdet( x, z, clk, rst);
input x,clk, rst;
output z;
reg 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;
assignz =(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)来过
elsestate<= IDLE; //输入的是低电平,不符合要求,所以状态保留不变
A: if (x==0)
state<=B; //用状态变量记住第二位正确低电平(x==0)来过
elsestate<= A; //输入的是高电平,不符合要求,所以状态保留不变
B: if (x==0)
state<=C; //用状态变量记住第三位正确低电平(x==0)来过
else state<=F; //输入的是高电平,不符合要求,记住只有一位曾经对过
C: if(x==1)
state<=D; //用状态变量记住第四位正确高电平(x==1)来过
elsestate<=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状态的处理表示不理解,各位讨论下啊。 状态机进入G状态说明必定前面收到了连续三个0,怎么会在再次收到0后去了B状态呢?莫名其妙啊。 改了一下,把F、G两种状态都去掉,效果一样。
//------------ ÎļþÃû£ºseqdet.v -------------------
/*********************************************************************
*** Ä£¿é¹¦ÄÜ£º±¾Ä£¿éÄܶԴ®ÐÐÊäÈëµÄÊý¾ÝÁ÷½øÐмì²â£¬Ö»Òª·¢ÏÖ10010
*** ÂëÐÍ»áÁ¢¼´Êä³öÒ»¸ö¸ßλµÄµçƽ¡£
*** ±¾Ä£¿éÊÇRTL¼¶¿É×ÛºÏÄ£¿é£¬ÒÑͨ¹ý×ۺϺóÃż¶·ÂÕæ
*********************************************************************/
module test04( x, z, clk, rst);
input x,clk, rst;
output z;
reg 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;
assignz =(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<=A; //ÊäÈëµÄÊǸߵçƽ£¬²»·ûºÏÒªÇ󣬼ÇסֻÓÐһλÔø¾­¶Ô¹ý
C: if(x==1)
state<=D; //ÓÃ״̬±äÁ¿¼ÇסµÚËÄλÕýÈ·¸ßµçƽ£¨x==1£©À´¹ý
else
state<=IDLE;//ÊäÈëµÄÊǵ͵çƽ£¬²»·ûºÏÒªÇ󣬼ÇסûÓÐһλÔø¾­¶Ô¹ý
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 ÎļþµÄ½áÊø------------------------------------ 哎,quartus II 的汉子问题真让人头疼。 是么,我试试先? 看了看没有看明白,汗……
页:
[1]