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

共7条 1/1 1 跳转至

求助状态机

助工
2009-08-03 16:55:15     打赏

module ADCNT(D,Clk,Busy,CS,ConvSTA,ConvSTB,ConvSTC,RD,Lock0,Q);

input [15:0] D;
input Clk,Busy;
output ConvSTA,ConvSTB,ConvSTC;
output RD,Lock0,CS;
output [15:0] Q;

reg [15:0] REGL;
reg ConvSTA,ConvSTB,ConvSTC;
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;

reg [3:0] current_states, next_states;

 assign CS= 0;
 assign Q= REGL;
 assign Lock0= Lock;
 always@(current_states or Busy)
  begin
   case(current_states)
    
    st0:begin
     ConvSTA<= 0; ConvSTB<= 0; ConvSTC<=0;
     Lock<=0;
     next_states<=st1;
     RD=1'b1;
     case(current_states)
     //st0:next_states<=st1;
        st3:next_states<=st4;
     st4:next_states<=st5;
     st5:next_states<=st6;
     st6:next_states<=st7;
     st7:next_states<=st8;
     st8:next_states<=st0;
     //default next_states<=st1;
     endcase
     
         end 
    st1:begin
     ConvSTA<= 1; ConvSTB<=1; ConvSTC<= 1;
     Lock<= 0;
     next_states<= st2;
     RD<= 1;
         end
    st2:begin
     ConvSTA<= 0; ConvSTB<= 0; ConvSTC<=0;
     Lock<= 0; 
        RD<= 1;
     if(Busy==0) 
      begin
       next_states<= st3;
       RD<=1;
      end
     else
      next_states<= st2;
        end
    st3: begin
     ConvSTA<= 0; ConvSTB<= 0; ConvSTC<=0;
     Lock<= 1; next_states<= st0; RD=0;
      //第1路转换结果传输
         end
    st4: begin
     ConvSTA<= 0; ConvSTB<= 0; ConvSTC<=0;
     Lock<= 1; next_states<= st0; RD=0;//第2路转换结果传输

     
         end
    st5: begin
     ConvSTA<= 0; ConvSTB<= 0; ConvSTC<=0;
     Lock<= 1; next_states<= st0; RD=0;//第3路转换结果传输

     
         end
    st6: begin
     ConvSTA<= 0; ConvSTB<= 0; ConvSTC<=0;
     Lock<= 1; next_states<= st0; RD=0;//第4路转换结果传输

     
         end
    st7: begin
     ConvSTA<= 0; ConvSTB<= 0; ConvSTC<=0;
     Lock<= 1; next_states<= st0; RD=0;//第5路转换结果传输

     
         end
    st8: begin
     ConvSTA<= 0; ConvSTB<= 0; ConvSTC<=0;
     Lock<= 1; next_states<= st0; RD=0;//第6路转换结果传输

     
         end
    default:begin
      next_states<= st0;
     end
   endcase
  end
 always@(posedge Clk)
  begin
   current_states<= next_states;
  end

 always@(posedge Lock)
  begin
   REGL <= D;
       
  end

 endmodule




想把AD7656输入的D传到REGL中,AD7656传输6路数据,现在是无法正确传输数据,下面是AD7656的时序图

实际的仿真结果如下,现在出现问题是两个CONVSTX间隔中只有一个RD低电平,且传输的数据时序也不对。


还请大家帮忙看看?谢谢




关键词: 求助     状态机     ConvSTA     ConvSTB     Co    

助工
2009-08-03 16:57:38     打赏
2楼

具体出现什么问题呢?


助工
2009-08-03 16:59:06     打赏
3楼
最好先单独仿真一下,看看结果是不是理想~

助工
2009-08-03 17:04:19     打赏
4楼
我仿真了一下,现在的有几个问题,在我仿真的时候RD和Lock是互补的,但是按照我 的程序RD在什么地方出现高电平呢? 状态机具体运行时直接进入下一个状态还是先回到初始状态在进入下一状态?

助工
2009-08-04 16:19:40     打赏
5楼

状态st3开始时转换开始并传输结果,从st3开始每个状态开始要回到初始化状态st0,然后由st0在进入该状态的下一个状态,简单的说就是从st(i)——》st0——》st(i+1)状态,但是现在程序却无法按我想的进行,可能是对状态机不太熟悉,希望做过这个的人给一些指导,谢谢


助工
2009-08-04 16:22:53     打赏
6楼
每次状态回到st0 的时候,current_states都为了st0了,可能这也是一个原因吧? 看高手怎么说吧,呵呵

助工
2009-08-05 14:06:10     打赏
7楼

问题用最笨的方法解决了,在st3以后每个状态后加一个状态将RD拉高,出来的波形如下:
只是不知道和AD7656联系后能不能好用,这种方法会不会影响芯片性能?


共7条 1/1 1 跳转至

回复

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