微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求助状态机

求助状态机

时间:10-02 整理:3721RD 点击:
我编写的状态机在功能仿真的时候可以实现所要的功能,为什么下到板子中后,状态机不运转,所要的输出信号一直为初始化状态,无法进入循环状态,有人遇到这种问题吗,谢谢了!

最好把程序贴上来看看,这样怎么知道是什么问题。

yeah, better post the code out, but well, you can check some trivial things first, is it the clock not connected on your board, or the reset pin is simply tied low in your board?
Why don't you just map a counter first, to see if there's clock.
if it's OK, then you can map a counter with async reset, see if the reset is OK

谢谢楼上2位关注,我的代码如下
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[/email])
  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[/email] Clk)
  
  begin
   if(ret)
   //RESET<=0;
  
   current_states<= next_states;
  
else
    current_states<=st0;
    end

always@(posedge[/email] Lock)
  begin
   REGL <= D;
        
  end //如果lock上升沿来了 将AD7656输出的结果送给REGL
endmodule
由于刚刚接触可能写的不符合语法,呵呵,麻烦给看看,仿真时可以,但是下到板子中就不运行?

st0时 reset=0,
而reset等于0时,currents-state=st0
如果你想写组合逻辑,请用“=”
写时序逻辑请用“<=”
这样你的仿真就和你的实际一样了

谢谢楼上的高手帮忙,我试试看,不行的话在请教你,在一次感谢

看看,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top