FPGA|CPLD|ASICwilliam hill官网
直播中

543667538

9年用户 11经验值
擅长:可编程逻辑
私信 关注

各位大神,基于FPGA控制ADC0804的程序,有疑问

本帖最后由 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(逻辑分析仪)检测输出信号如图: 输出结果 ADC0804时序图 QQ截图20150201221236.png

[size=14.3999996185303px]状态机的时序问题我也反复看过,貌似没有问题。各位大神,对于没有结果输出时什么原因呢?


已退回2积分

回帖(2)

bottlewater

2015-3-6 17:00:05
你确定会用Sigtap?确定把采样时钟加到Sigtap里面去了么(例如你程序里面的50M时钟)?如果这点能确定,那就看下你的时钟是否有,或者时钟管脚分配没有。
举报

jack_7

2015-3-9 16:39:30
贴图中的 fclk是多少M的频率?程序中1us采一次,是不是采不到INTR信号,还有一点state3时,不需要讲cs拉低吧,这样写状态机的编码风格不好,若要简单,可采用二段式的方式
举报

更多回帖

发帖
×
20
完善资料,
赚取积分