这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » 继续求助状态机的问题

共13条 1/2 1 2 跳转至

继续求助状态机的问题

助工
2009-08-14 16:30:06     打赏

我编写的状态机,在功能仿真的时候可以完成我要的功能,可是为什么下到板子里功能就不对了,仿真和实际差在哪里呢
可是在下到板子后RD一直是高电平,没有出来上图的结果?
附代码;module ADCNT(D,Clk,Busy,
      ,RESET,CS,ConvSTX,RD,Lock0,Q,ret,flag);
input [15:0] D;
input Clk,Busy,ret;
output ConvSTX,RESET;
output RD,Lock0,CS,flag;
output [15:0] Q;
reg [15:0] REGL;
reg ConvSTX,RESET,flag;
wire CS;
wire [15:0] Q;
reg Lock,RD;
parameter st0=4'b0000,st1=4'b0001,st2=4'b0010,st3=4'b0011,st4=4'b0100,st5=4'b0101;
parameter st6=4'b0110,st7=4'b0111,st8=4'b1000,st9=4'b1001,st10=4'b1010,st11=4'b1011;
parameter st12=4'b1100,st13=4'b1101,st14=4'b1110,st15=4'b1111;
reg [3:0] current_states, next_states;
 assign CS= 0;
 assign Q= REGL;
 assign Lock0= Lock;

 always@(current_states)
  begin
      
      case(current_states)
   
    st0:begin
        RESET<=0;
         ConvSTX<= 0;
            Lock<=0;
            RD<=1;
            flag<=1;
            next_states<=st1;           
         end //Initial

    st1:begin
      RESET<=1;
     ConvSTX<= 1;
     Lock<= 0;
     RD<= 1;
      flag<=0;
     next_states<= st2;
    
          end //启动采样
    st2:begin
     RESET<=1;
     ConvSTX<= 1;
     Lock<= 0; 
     flag<=1;                                                                                   RD<= 1;
     if(Busy==0) 
      begin
        RD<=1;
       next_states<= st3;
     
      end
     else
      next_states<= st2;
        end //如果busy为0 转换结束 进入状态st3

    st3: begin
    RESET<=1;
    ConvSTX<= 1;
     Lock<= 1;
     RD=0;
     flag<=0;
     next_states<= st4; 
         end //第一路转换结果储存
 
  st4: begin
    RESET<=1;
    ConvSTX<= 1;
     Lock<= 0;
     RD=1;
     flag<=1;
      next_states<= st5;
        end //将RD拉高
  
  st5: begin
    RESET<=1;
    ConvSTX<= 1;
     Lock<= 1;
     RD=0;
     flag<=0;
      next_states<= st6;
     
         end //第二路转换结果储存
     st6: begin
     RESET<=1;
    ConvSTX<= 1;
     Lock<= 0;
      RD=1;
      flag<=1;
     next_states<= st7;
   
         end //将RD拉高 
     st7: begin
     RESET<=1;
   ConvSTX<= 1;
     Lock<= 1;
      RD=0;
      flag<=0;
     next_states<= st8;
   
         end //第三路转换结果储存
    st8: begin
    RESET<=1;
    ConvSTX<= 1;
     Lock<= 0;
     RD=1;
      flag<=1;
     next_states<= st9;
   
         end //将RD拉高
    st9: begin
    RESET<=1;
   ConvSTX<= 1;
     Lock<= 1;
     RD=0;
     flag<=0;
     next_states<= st10;
   
         end //第四路转换结果储存
     st10: begin
     RESET<=1;
     ConvSTX<= 1;
     Lock<= 0;
     RD=1;
     flag<=1;
     next_states<= st11;

         end //将RD拉高
    st11: begin
     RESET<=1;
     ConvSTX<= 1;
     Lock<= 1;
     RD=0;
     flag<=0;
     next_states<= st12;

         end //第五路转换结果储存
     st12: begin
     RESET<=1;
     ConvSTX<= 1;
     Lock<= 0;
     RD=1;
     flag<=1;
     next_states<= st13;

         end //将RD拉高
     st13: begin
     RESET<=1;
     ConvSTX<= 1;
     Lock<= 1;
     RD=0;
     flag<=0;
     next_states<= st14;

         end //第六路转换结果储存
     st14: begin
     RESET<=1;
       ConvSTX<= 1;
           Lock<=0;
           RD<=1;
           flag<=1;
           next_states<=st0;

           end
    default:begin
    RESET<=0;
      next_states<= st0;
     end
   endcase
  end

 
always@(posedge Clk)
 
  begin
   if(ret)
   //RESET<=0;
 
   current_states<= next_states;
 
else
    current_states<=st0;
    end
 
always@(posedge Lock)
  begin
   REGL <= D;
       
  end //如果lock上升沿来了 将AD7656输出的结果送给REGL
 endmodule


还请大家帮忙看看




关键词: 继续     求助     状态机     问题     RESET     ConvST    

菜鸟
2009-08-14 21:43:22     打赏
2楼

我看你的状态机没有转起来
always@(posedge Clk)
 
  begin
   if(ret)
   //RESET<=0;
 
   current_states<= next_states;
 
else
    current_states<=st0;
    end
 这里有问题;
我估计你的系统一上电,ret就为高电平,所以它就执行不了 current_states<=st0;
应该改为:

reg   ret_buf;
always @(posedge clk)
begin 
        ret_buf<=ret;
end 
 
always@(posedge Clk)
 
  begin
   if(ret_buf)
   //RESET<=0;
 
   current_states<= next_states;
 
else
    current_states<=st0;
    end


助工
2009-08-15 22:07:48     打赏
3楼
可是我的本意就是系统一上电就执行current_states<= next_states; 这样它就进入了状态机,只有当要复位的时候ret才给低电,现在问题就是下到板子里后就没有任何反应,ConvSTX一直为高电平,按下ret会有个低电平出现,可是RD与flag根本就一直持续高电平,不明白为什么没有进入状态!

高工
2009-08-16 23:01:42     打赏
4楼
我放假在家,没装Modelsim,等过三天后回学校再帮你看看吧,希望能帮上你的忙。

助工
2009-08-19 10:57:55     打赏
5楼
我下进板子后 ConvSTX,RD flag RESET一直为高电平,ret上电为高,按下ret后ConvSTX ,RESET为低电平,RD flag没有任何反应

助工
2009-08-21 19:52:58     打赏
6楼

有人帮忙吗?这个问题还是没有解决,我在组合逻辑中改用阻塞赋值结果还是一样.很奇怪!


高工
2009-08-23 23:14:26     打赏
7楼
给风语者的若干建议和说明:

1. 你的状态机的风格不好,应尽量用“三段式”,关于这点,我之前发过一篇文章,你可以查查看;

2. 你的复位操作:
always@(posedge Clk)
  begin
   if(ret)
   //RESET<=0;
   current_states<= next_states;
else
    current_states<=st0;
    end

系统只有在复位后才能进入正确的状态转换,刚上电,若ret==1,则因next_states值随机,状态机进入未知状态,可能发生死锁,出不来。

3. 如果复位后仍不行,检查你的输入Busy信号是否有效,用示波器看,因为它是控制状态机切换的关键。

4. 调试状态机时,应想办法看状态值,比如用逻辑分析仪或用LED看。

有什么问题,欢迎继续讨论。希望对你有帮助。

助工
2009-08-24 17:24:24     打赏
8楼
我在按照状态机的写法改一下,我不间断的间歇性按复位键也不行,进入的状态也不是st0,应该不是复位键的问题

高工
2009-08-24 18:45:30     打赏
9楼

你说的是:按下复位了,状态机也不再St0吗?不该这样啊。
那么你实际运行时的状态机是处于哪个状态?


助工
2009-08-25 10:20:04     打赏
10楼
感谢版主Jason_Zhang的帮忙提醒,我重新调整了一下busy信号,现在状态机可以运行了,只是波形很差,稍后我会传上一些图片,感觉他的波形大体有我想要的样子,可是有一些杂波。先去照图!

共13条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]