3238|2

314

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

FPGA做AD采样? [复制链接]

AD芯片的时序图应该抓住哪些关键时间参数啊?我看给的时间参数很多,应该不是每个参数都要管吧?
此帖出自FPGA/CPLD论坛

最新回复

参考一下这个吧 module AD_R(clk,sck,Din,nRST,pulse,CNV,Dout,done,flag); input clk,sck,nRST,Din,pulse; output CNV,done,flag; output [15:0]Dout; reg done,CNV,flag; reg [15:0]Dout; wire neg_sck; reg temp1,temp2; always@(posedge clk or negedge nRST)         begin     if(~nRST)     begin         temp1   详情 回复 发表于 2013-7-21 15:32
点赞 关注
 

回复
举报

6423

帖子

16

TA的资源

版主

沙发
 
参考一下这个吧

module AD_R(clk,sck,Din,nRST,pulse,CNV,Dout,done,flag);
input clk,sck,nRST,Din,pulse;
output CNV,done,flag;
output [15:0]Dout;
reg done,CNV,flag;
reg [15:0]Dout;



wire neg_sck;
reg temp1,temp2;

always@(posedge clk or negedge nRST)        
begin
    if(~nRST)
    begin
        temp1 <= 1'b0;
        temp2 <= 1'b0;
    end
   
    else
    begin
        temp1 <= sck;
        temp2 <= temp1;
    end
end
assign neg_sck = (!temp1)&(temp2);





wire pos_sck;
reg temp3,temp4;

always@(posedge clk or negedge nRST)   
begin
    if(~nRST)
    begin
        temp3 <= 1'b0;
        temp4 <= 1'b0;
    end
   
    else
    begin
        temp3 <= sck;
        temp4 <= temp3;
    end
end
assign pos_sck = (temp3)&(!temp4);




wire pos_pulse;
reg temp5,temp6;

always@(posedge clk or negedge nRST)        
begin
    if(~nRST)
    begin
        temp5 <= 1'b0;
        temp6 <= 1'b0;
    end
   
    else
    begin
        temp5 <= pulse;
        temp6 <= temp5;
    end
end
assign pos_pulse = (temp5)&(!temp6);






reg ena_cnt_read;   
reg rst_cnt_read;
reg[4:0] bit_cnt_read;   
always @(posedge clk or negedge nRST )
    begin
        if(~nRST)
            bit_cnt_read <=5'b0;
        else if(ena_cnt_read)
            bit_cnt_read <=bit_cnt_read +5'b1;
        else if(rst_cnt_read)
            bit_cnt_read <= 5'b0;
    end
   
   
reg ena_cnt_wait;
reg [8:0] bit_cnt_wait;
always @(posedge clk or negedge nRST)
    if(~nRST) bit_cnt_wait<= 0;
    else if(ena_cnt_wait) bit_cnt_wait <= bit_cnt_wait +1;
    else bit_cnt_wait <= 0;





reg [4:0]state,next_state;
parameter x_idle        = 5'b00001;
parameter x_wait        = 5'b00010;
parameter x_read_D15_1  = 5'b00100;
parameter x_read_D15_2  = 5'b01000;
parameter x_read        = 5'b10000;

parameter wait_time_1 = 9'd125;
parameter wait_time_2 = 9'd3;
parameter read_time = 5'd14;

always @(posedge clk or negedge nRST)
    if(~nRST) state <= x_idle;
    else state <= next_state;
   
   
   
   
always @(state or pos_pulse or neg_sck or bit_cnt_read or bit_cnt_wait)
    begin
        next_state     = state;
        ena_cnt_read   = 1'b0;
        ena_cnt_wait   = 1'b0;
        rst_cnt_read   = 1'b0;
        done           = 1'b0;
        
        
        
        case(state)
        
        x_idle:
            if(pos_pulse)
            begin
                //flag = 1'b1;
                CNV = 1'b1;
                //nCS = 1'b1;
                rst_cnt_read = 1'b1;
                next_state = x_wait;
            end
            else
            begin
                //flag = 1'b0;
                CNV = 1'b0;
                //nCS = 1'b1;
                //next_state = x_idle;
            end
            
        x_wait:
            if(bit_cnt_wait == wait_time_1)
                begin
                next_state = x_read_D15_1;
                CNV = 1'b0;
                end
            else
                begin
                    next_state = x_wait;
                    ena_cnt_wait = 1'b1;
                end
               
        x_read_D15_1:
            if(bit_cnt_wait == wait_time_2)
                begin
                    next_state = x_read;
                    Dout[15] = Din;
                end
            else
                begin
                    next_state = x_read_D15_1;
                    ena_cnt_wait = 1'b1;
                end

        
        
        x_read:
            if(neg_sck)
                begin
                    if(bit_cnt_read > read_time)
                    begin
                        rst_cnt_read = 1'b1;
                        done = 1'b1;
                        next_state = x_idle;
                    end
                    
                    else
                    begin
                        case(bit_cnt_read)
                        
                        5'd0:
                        begin
                        Dout[14]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd1:
                        begin
                        Dout[13]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd2:
                        begin
                        Dout[12]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd3:
                        begin
                        Dout[11]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd4:
                        begin
                        Dout[10]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd5:
                        begin
                        Dout[9]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd6:
                        begin
                        Dout[8]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd7:
                        begin
                        Dout[7]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd8:
                        begin
                        Dout[6]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd9:
                        begin
                        Dout[5]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd10:
                        begin
                        Dout[4]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd11:
                        begin
                        Dout[3]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd12:
                        begin
                        Dout[2]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd13:
                        begin
                        Dout[1]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        5'd14:
                        begin
                        Dout[0]     = Din;
                        ena_cnt_read = 1'b1;
                        end
                        
                        /*5'h15:
                        begin
                        ena_cnt_read = 1'b1;
                        end*/
                    
                    
                        
                    
                        default next_state = x_idle;
                        endcase
                    end
                end
               
            default next_state = x_idle;
        endcase
    end
endmodule
此帖出自FPGA/CPLD论坛

点评

为什么这里的wait_time_2 还比wait_time_1小呢?  详情 回复 发表于 2013-7-22 10:14
 
 

回复

314

帖子

0

TA的资源

纯净的硅(初级)

板凳
 

回复 沙发白丁 的帖子

为什么这里的wait_time_2 还比wait_time_1小呢?
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表