本帖最后由 543667538 于 2015-2-1 22:18 编辑 
module ADC0804(clk_50M,rst,INTR,DB,CS,WR,RD);
    input clk_50M,rst,INTR;//clk_50M是外部
FPGA时钟信号   rst是复位信号   INTR是ADC转换结束信号
    input [7:0] DB;    //DB是ADC转换结果数据
    output CS,WR,RD;   //CS是片选信号  WR是启动转换控制信号  RD是外部读取转换结果控制信号,从ADC端口送出
    reg CS,WR,RD;
    reg [7:0] data;    //data用来存取FPGA读进来的DB数据  
    reg [15:0] cnt;     //cnt用来计数给50MHZ分频
    reg [2:0] state;
//------------------------------------------------------------------
    parameter state0 = 3'b000,   //用状态机控制ADC的时序转换
                          state1 = 3'b001,
                          state2 = 3'b010,
                          state3 = 3'b011,
                          state4 = 3'b100,
                          state5 = 3'b101;
//------------------------------------------------------------------------
always @(posedge clk_50M)
   begin
                if(!rst)       //rst有效的话,状态机和计数复位
                  begin 
                     state<=state0;
                         cnt <= 0;
                  end
                else 
                  begin 
            cnt <= cnt +1'b1;
            if(16'd50 == cnt) //1us采样一次
                                begin
                  cnt <= 0;
                  case(state)
                                    state0:   //状态0 控制ADC初始化
                            begin 
                               RD = 1;
                               CS = 1;
                               WR = 1;
                                                           state <= state1;
                            end
                        state1:   //状态1,控制ADC开始转换
                            begin 
                               CS = 0;
                               WR = 0;
                               RD = 1;
                               state <= state2;
                            end                        
                        state2:  //状态2,等待INTR信号变低,[size=14.3999996185303px]采样结束
                            begin
                               CS = 1;
                               WR = 1;
                               RD = 1;
                               if (0 == INTR)
                                 state <= state3;
                            end
                        state3:   //状态3
                            begin
                               CS = 0;
                               WR = 1;
                               RD = 0;
                               state <= state4;
                            end
                        state4:  //状态4,从ADC读入模拟电压转换之后的数据
                            begin
                                                           data <= DB;
                               state <= state0;
                            end
                     endcase 
               end
        end
   end
endmodule 
///////////////////////////////////////////////////////////////////////////////////////////////////
 用quartusII的signaltap II logic analyaer(逻辑分析仪)检测输出信号如图:
 
 
 
[size=14.3999996185303px]状态机的时序问题我也反复看过,貌似没有问题。各位大神,对于没有结果输出时什么原因呢?