搜索
bottom↓
回复: 5

对夏宇闻老师 verilog HDL教程15章习题的疑问。

[复制链接]

出0入0汤圆

发表于 2011-2-24 18:21:56 | 显示全部楼层 |阅读模式
//------------ 文件名: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, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-2-24 18:28:35 | 显示全部楼层
状态机进入G状态说明必定前面收到了连续三个0,怎么会在再次收到0后去了B状态呢?莫名其妙啊。

出0入0汤圆

 楼主| 发表于 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 [2:0] 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;

assign  z =(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;------------------------------------

出0入0汤圆

 楼主| 发表于 2011-2-24 19:14:00 | 显示全部楼层
哎,quartus II 的汉子问题真让人头疼。

出0入0汤圆

发表于 2011-2-24 19:19:39 | 显示全部楼层
是么,我试试先?

出0入0汤圆

发表于 2011-2-24 19:45:29 | 显示全部楼层
看了看没有看明白,汗……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 15:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表