在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5703|回复: 20

[求助] 一个序列检测器的问题

[复制链接]
发表于 2013-7-18 13:48:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
大大们下午好,小弟新学verilog遇到了一个很头疼的问题,盼你们能帮助一下我。
我写了一个10010序列检测器,每检测有一串10010就输输出一个1。我写出了代码,仿真不对,希望大大们帮我分析一下

代码如下
`timescale 1ns / 1ps
module test8_fsm(x,z,clk,rst,
  state_out  );
  input x,clk,rst;
  output z;
  output [2:0]state_out;
  wire z;
  reg[2:0] state,nextstate;
  parameter idle=3'b000,
     s1=3'b001,
     s10=3'b010,
     s100=3'b011,
     s1001=3'b100,
     s10010=3'b101;
  
  assign state_out=state;
  
  always@(posedge clk)
     if(rst)
     state<=idle;
     else
     state<=nst;
   
   
  always@( posedge clk )
  
        case(state)
   idle: if(x) nextstate=s1;//小弟编了6个装备,空闲0,按10010输入的顺序,S1,S10,S100,S1001,S10010
         else   nextstate=idle;
     
   s1:  if(!x)   nextstate=s10;
         else nextstate=s1;
   s10:                     
        if(!x )  nextstate=s100;
    else nextstate=s1;
   
   s100:if(x) nextstate=s1001;
         else   nextstate=idle;
     
   s1001:if(!x) nextstate=s10010;
                else   nextstate=s1;
      
   s10010:if(x) nextstate=s1;
    else nextstate=s100;
   
   default:nextstate=3'bxxx;
   endcase
   

assign z=(state==s10010)?1:0;

endmodule

仿真激励如下
`timescale 1ns / 1ps

module time_test8;

wire x;
reg clk;
reg rst;
reg [23:0]data;

wire z;
wire [2:0]state_out;

test8_fsm uut (
  .x(x),
  .z(z),
  .clk(clk),
  .rst(rst),
  .state_out(state_out)
);

assign x=data[23];
always #10clk=~clk;
always@(posedge clk)
   data<={data[22:0],data[23]};

  
initial
begin
  
  
  clk = 1;
  rst = 0;
  data=24'b1100_1001_0000_10010_0100_1010;
  #10rst=1;
  #100rst=0;
  

  #1000 rst=1;
  #1000 rst=0;
  #2000 rst=1;
  #1000 rst=0;
  #5000 $stop;
  end
  
endmodule

错误的仿真结果如下··
仿真.jpg
仿真.jpg
 楼主| 发表于 2013-7-18 13:50:59 | 显示全部楼层
麻烦看看我写的 问题出在了哪儿··谢谢各位了!
发表于 2013-7-18 15:15:49 | 显示全部楼层
看下状态机方面的资料吧,状态转换和输入的always块改写为组合逻辑电路。
发表于 2013-7-18 15:56:37 | 显示全部楼层
问题不少
nst没有声明过
nextstate=3'bxxx; 改成3'b000;  哪有自己把状态导向不可知的
给nextstate赋值的always 改成组合逻辑 always @*  这个应该是造成你状态机不能正常转移的关键问题
发表于 2013-7-18 18:32:35 | 显示全部楼层
Have  you compiled the code successfully?
it is no neccessary to finish this function by means of fsm,in fact.
you can use a shifter to realize the same function.
If you do finish the funciton in your own way, i suggest that you should learn how to finish function  in  fsm
 楼主| 发表于 2013-7-18 19:29:21 | 显示全部楼层
回复 4# hiloco


       你好,谢谢你的耐心和热心!我那个NST就是NEXTSTATE```之前复制时这个没替换到,不好意思!
  主要问题就出在always@()里的触发条件噢,如果改为always@(*)的话 ,假如输入为连续两个低电平,X不跳变,这样状态会不会发生转移·····?
  我后来又改了一下 ,把状态跳转改成阻塞赋值了 ,结果可以出正常结果了,可是结果总是慢两个时钟,大大您看一下,这是为什么呢?
原先是                  always@(posedge clk)
                              if(rst)
                             state<=idle;
                              else
                              state<=nextstate;
改后                always@(posedge clk)
                       if(rst)
                       state=idle;
                         else
                       state=nextstate;  
     这样能出结果了 ,就是慢了两个周期才出!仿真图如下
QQ图片20130718192745.jpg
 楼主| 发表于 2013-7-18 19:31:16 | 显示全部楼层
回复 3# HADIST


    恩,目前正在学习。!但有时遇到问题解决不了确实蛮难受的·
 楼主| 发表于 2013-7-18 19:34:56 | 显示全部楼层
回复 5# gechuanzhi2006


    我现在就在学习如何用三段式状态机写法来写代码啊···我用两段式写出来的没问题,但三段式总是有问题,现在就是自己发现不了问题!盯着这段代码看了好久好久,也换东西仿真,但还是····哎,谢谢各位能热情的点开这个求助帖!
 楼主| 发表于 2013-7-18 19:42:25 | 显示全部楼层
本帖最后由 孟晨旭 于 2013-7-18 19:45 编辑

回复 4# hiloco


    大大!如你所眼我把always@(posedge clk)改成always@(*)后,仿真了一下 ,能行了!
   谢谢你!但是我还想问一下为什么会这样,我每个上升沿采集一下X然后判定一次状态转移感觉上时行的,可实际上为什么行不通呢?
   而且如我楼上那个回复,为什么把非阻塞改为阻塞后 ,也可以?只是慢了两个时钟
发表于 2013-7-18 20:21:50 | 显示全部楼层
慢慢学会debug,,楼上已经说了,可以用移位寄存器和FSM来实现此功能,FSM写法很重要
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-27 18:55 , Processed in 0.030209 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表