taishan 发表于 2011-2-24 18:21:56

对夏宇闻老师 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状态的处理表示不理解,各位讨论下啊。

taishan 发表于 2011-2-24 18:28:35

状态机进入G状态说明必定前面收到了连续三个0,怎么会在再次收到0后去了B状态呢?莫名其妙啊。

taishan 发表于 2011-2-24 19:13:07

改了一下,把F、G两种状态都去掉,效果一样。

//------------ &Icirc;&Auml;&frac14;&thorn;&Atilde;&ucirc;&pound;&ordm;seqdet.v -------------------
/*********************************************************************
*** &Auml;&pound;&iquest;é&sup1;&brvbar;&Auml;&Uuml;&pound;&ordm;±&frac34;&Auml;&pound;&iquest;é&Auml;&Uuml;&para;&Ocirc;&acute;&reg;&ETH;&ETH;&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;&Aacute;÷&frac12;&oslash;&ETH;&ETH;&frac14;ì&sup2;&acirc;&pound;&not;&Ouml;&raquo;&Ograve;&ordf;·&cent;&Iuml;&Ouml;10010
***         &Acirc;&euml;&ETH;&Iacute;&raquo;á&Aacute;&cent;&frac14;&acute;&Ecirc;&auml;&sup3;&ouml;&Ograve;&raquo;&cedil;&ouml;&cedil;&szlig;&Icirc;&raquo;&micro;&Auml;&micro;&ccedil;&AElig;&frac12;&iexcl;&pound;
***   ±&frac34;&Auml;&pound;&iquest;é&Ecirc;&Ccedil;RTL&frac14;&para;&iquest;&Eacute;×&Ucirc;&ordm;&Iuml;&Auml;&pound;&iquest;é&pound;&not;&Ograve;&Ntilde;&Iacute;¨&sup1;&yacute;×&Ucirc;&ordm;&Iuml;&ordm;ó&Atilde;&Aring;&frac14;&para;·&Acirc;&Otilde;&aelig;
*********************************************************************/
module test04( x, z, clk, rst);
input x,clk, rst;
output z;

reg state;//×&acute;&Igrave;&not;&frac14;&Auml;&acute;&aelig;&AElig;÷
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; //×&acute;&Igrave;&not;&Icirc;&ordf;D&Ecirc;±&Oacute;&Ouml;&Ecirc;&Otilde;&micro;&frac12;&Aacute;&Euml;0&pound;&not;±í&Atilde;÷10010&Ecirc;&Otilde;&micro;&frac12;&Oacute;&brvbar;&Oacute;&ETH;&Ecirc;&auml;&sup3;&ouml;Z&Icirc;&ordf;&cedil;&szlig;
always @(posedge clk or negedge rst)
        if(!rst)
                begin
                  state<=IDLE;
                end
        else
                casex( state)
                        IDLE: if(x==1)
                                        state<=A;   //&Oacute;&Atilde;×&acute;&Igrave;&not;±&auml;&Aacute;&iquest;&frac14;&Ccedil;×&iexcl;&cedil;&szlig;&micro;&ccedil;&AElig;&frac12;&pound;¨x==1&pound;&copy;&Agrave;&acute;&sup1;&yacute;
                       else
                      state<= IDLE; //&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Ecirc;&Ccedil;&micro;&Iacute;&micro;&ccedil;&AElig;&frac12;&pound;&not;&sup2;&raquo;·&ucirc;&ordm;&Iuml;&Ograve;&ordf;&Ccedil;ó&pound;&not;&Euml;ù&Ograve;&Ocirc;×&acute;&Igrave;&not;±&pound;&Aacute;&ocirc;&sup2;&raquo;±&auml;
                        A:    if (x==0)
                                        state<=B;   //&Oacute;&Atilde;×&acute;&Igrave;&not;±&auml;&Aacute;&iquest;&frac14;&Ccedil;×&iexcl;&micro;&Uacute;&para;&thorn;&Icirc;&raquo;&Otilde;&yacute;&Egrave;·&micro;&Iacute;&micro;&ccedil;&AElig;&frac12;&pound;¨x==0&pound;&copy;&Agrave;&acute;&sup1;&yacute;
                  else
                  state<= A;    //&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Ecirc;&Ccedil;&cedil;&szlig;&micro;&ccedil;&AElig;&frac12;&pound;&not;&sup2;&raquo;·&ucirc;&ordm;&Iuml;&Ograve;&ordf;&Ccedil;ó&pound;&not;&Euml;ù&Ograve;&Ocirc;×&acute;&Igrave;&not;±&pound;&Aacute;&ocirc;&sup2;&raquo;±&auml;
                        B:          if (x==0)
                                        state<=C;   //&Oacute;&Atilde;×&acute;&Igrave;&not;±&auml;&Aacute;&iquest;&frac14;&Ccedil;×&iexcl;&micro;&Uacute;&Egrave;&yacute;&Icirc;&raquo;&Otilde;&yacute;&Egrave;·&micro;&Iacute;&micro;&ccedil;&AElig;&frac12;&pound;¨x==0&pound;&copy;&Agrave;&acute;&sup1;&yacute;
                                   else       
                                  state<=A;   //&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Ecirc;&Ccedil;&cedil;&szlig;&micro;&ccedil;&AElig;&frac12;&pound;&not;&sup2;&raquo;·&ucirc;&ordm;&Iuml;&Ograve;&ordf;&Ccedil;ó&pound;&not;&frac14;&Ccedil;×&iexcl;&Ouml;&raquo;&Oacute;&ETH;&Ograve;&raquo;&Icirc;&raquo;&Ocirc;&oslash;&frac34;&shy;&para;&Ocirc;&sup1;&yacute;
                        C:          if(x==1)
                                        state<=D;   //&Oacute;&Atilde;×&acute;&Igrave;&not;±&auml;&Aacute;&iquest;&frac14;&Ccedil;×&iexcl;&micro;&Uacute;&Euml;&Auml;&Icirc;&raquo;&Otilde;&yacute;&Egrave;·&cedil;&szlig;&micro;&ccedil;&AElig;&frac12;&pound;¨x==1&pound;&copy;&Agrave;&acute;&sup1;&yacute;
                                   else
                                  state<=IDLE;//&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Ecirc;&Ccedil;&micro;&Iacute;&micro;&ccedil;&AElig;&frac12;&pound;&not;&sup2;&raquo;·&ucirc;&ordm;&Iuml;&Ograve;&ordf;&Ccedil;ó&pound;&not;&frac14;&Ccedil;×&iexcl;&Atilde;&raquo;&Oacute;&ETH;&Ograve;&raquo;&Icirc;&raquo;&Ocirc;&oslash;&frac34;&shy;&para;&Ocirc;&sup1;&yacute;
                        D:          if(x==0)                                                       
                  state<=E;   //&Oacute;&Atilde;×&acute;&Igrave;&not;±&auml;&Aacute;&iquest;&frac14;&Ccedil;×&iexcl;&micro;&Uacute;&Icirc;&aring;&Icirc;&raquo;&Otilde;&yacute;&Egrave;·&micro;&Iacute;&micro;&ccedil;&AElig;&frac12;&pound;¨x==0&pound;&copy;&Agrave;&acute;&sup1;&yacute;
                                  else   
                                  state<=A;   //&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Ecirc;&Ccedil;&cedil;&szlig;&micro;&ccedil;&AElig;&frac12;&pound;&not;&sup2;&raquo;·&ucirc;&ordm;&Iuml;&Ograve;&ordf;&Ccedil;ó&pound;&not;&frac14;&Ccedil;×&iexcl;&Ouml;&raquo;1&Icirc;&raquo;&para;&Ocirc;&sup1;&yacute;
                                  //&raquo;&Oslash;&micro;&frac12;×&acute;&Igrave;&not;A
                               
                        E:          if(x==0)       
                  state<=C;   //&Oacute;&Atilde;×&acute;&Igrave;&not;±&auml;&Aacute;&iquest;&frac14;&Ccedil;×&iexcl;1 0 0&Ocirc;&oslash;&frac34;&shy;&Agrave;&acute;&sup1;&yacute;&pound;&not;&acute;&Euml;×&acute;&Igrave;&not;&Icirc;&ordf;C
                                  else       
                                  state<=A;   //&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Ecirc;&Ccedil;&cedil;&szlig;&micro;&ccedil;&AElig;&frac12;&pound;&not;&Ouml;&raquo;&Oacute;&ETH;1&Icirc;&raquo;&Otilde;&yacute;&Egrave;·&pound;&not;&cedil;&Atilde;×&acute;&Igrave;&not;&Ecirc;&Ccedil;A
//                        F:          if(x==1)                                                       
//                  state<=A;   //&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Ecirc;&Ccedil;&cedil;&szlig;&micro;&ccedil;&AElig;&frac12;&pound;&not;&Ouml;&raquo;&Oacute;&ETH;1&Icirc;&raquo;&Otilde;&yacute;&Egrave;·&pound;&not;&cedil;&Atilde;×&acute;&Igrave;&not;&Ecirc;&Ccedil;A
//                                  else
//                                        state<=B;   //&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Ecirc;&Ccedil;&micro;&Iacute;&micro;&ccedil;&AElig;&frac12;&pound;&not;&Ograve;&Ntilde;&Oacute;&ETH;2&Icirc;&raquo;&Otilde;&yacute;&Egrave;·&pound;&not;&cedil;&Atilde;×&acute;&Igrave;&not;&Ecirc;&Ccedil;B
//                        G:    if(x==1)
//                                        state<=F;   //&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Oacute;&Ouml;&Ecirc;&Ccedil;&cedil;&szlig;&micro;&ccedil;&AElig;&frac12;&pound;&not;&Ouml;&raquo;&Oacute;&ETH;1&Icirc;&raquo;&Otilde;&yacute;&Egrave;·&pound;&not;&frac14;&Ccedil;&cedil;&Atilde;×&acute;&Igrave;&not;F
//                  else
//                  state <=B;    //&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&Ecirc;&Ccedil;&micro;&Iacute;&micro;&ccedil;&AElig;&frac12;&pound;&not;&Ograve;&Ntilde;&Oacute;&ETH;2&Icirc;&raquo;&Otilde;&yacute;&Egrave;·&pound;&not;&cedil;&Atilde;×&acute;&Igrave;&not;&Ecirc;&Ccedil;B
                        default:         state<=IDLE;
                        endcase
endmodule
//------ seqdet.v &Icirc;&Auml;&frac14;&thorn;&micro;&Auml;&frac12;á&Ecirc;&oslash;------------------------------------

taishan 发表于 2011-2-24 19:14:00

哎,quartus II 的汉子问题真让人头疼。

fenzy 发表于 2011-2-24 19:19:39

是么,我试试先?

fenzy 发表于 2011-2-24 19:45:29

看了看没有看明白,汗……
页: [1]
查看完整版本: 对夏宇闻老师 verilog HDL教程15章习题的疑问。