在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2805|回复: 7

[求助] AD7658的ad busy信号正好,输出不对

[复制链接]
发表于 2016-1-14 11:44:10 | 显示全部楼层 |阅读模式
30资产
各位坛友,小弟最近在用FPGA配一块AD7658芯片,   并行输出到FPGA。发现输出不读,然后我就用chipscope抓了下信号线,如下:

                               
登录/注册后可看大图


                               
登录/注册后可看大图



可是,无论我输入是多少,抓出来的数据都是 0111 1111 1111(第一路数据,也就是ad_rd的第一个低电平对应的数据,这个芯片支持六路)。
现在是我把ad_convsta拉高以后,ad_busy跟着拉高,按手册上的说法应该是ad已经进入了转换模式了,ad_busy也正常拉低,可是读出来就是不对,时钟是500KHz。困扰我两天了。
这是手册上的时序图:

                               
登录/注册后可看大图


这是我的原理图:

                               
登录/注册后可看大图


                               
登录/注册后可看大图


这是我的代码:
module ad7658(
                                                        input wire sysclk,
                                                        input wire rst_b,
                                                        input wire sel,                //6路和4路选项     1--6路    0--4路
                                                        input wire ad_busy,
                                                        input wire[11:0] ad_data,
                                                        output reg ad_convsta,
                                                        output reg ad_convstb,
                                                        output reg ad_convstc,
                                                        output wire ad_cs,                //低电平有效
                                                        output reg ad_rd,                //低电平有效
                                                        output reg ad_reset,        //高电平有效
                                                        //6路数据
                                                        output reg[11:0] data1,
                                                        output reg[11:0] data2,
                                                        output reg[11:0] data3,
                                                        output reg[11:0] data4,
                                                        output reg[11:0] data5,
                                                        output reg[11:0] data6


    );



reg[3:0] state;
//分频
reg[7:0] div_cnt;
reg ad_clk;

always @(posedge sysclk or negedge rst_b)
begin
        if(!rst_b)
                begin
                        div_cnt <= 7'h0;
                        ad_clk  <= 0;
                end
        else if(div_cnt == 7'd49)
                begin
                        div_cnt <= 7'h0;
                        ad_clk <= ~ad_clk;
                end
        else
                begin
                        div_cnt <= div_cnt + 1;
                        ad_clk <= ad_clk;
                end
end


//ad7658配置
assign ad_cs = 0;
always @(posedge ad_clk or negedge rst_b)
begin
        if(!rst_b)
                begin
                        ad_reset <= 1;
                        data1    <= 12'h000;
                        data2    <= 12'h000;
                        data3    <= 12'h000;
                        data4    <= 12'h000;
                        data5    <= 12'h000;
                        data6    <= 12'h000;
                        state                <= 4'd0;
                end
        else
                case(state)
                        4'd0:
                                        begin
                                                ad_reset   <= 0;
                                                ad_convsta <= 0;
                                                ad_convstb <= 0;
                                                ad_convstc <= 0;
                                                ad_rd                  <= 1;
                                                state             <= 4'd1;
                                        end
                        4'd1:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd                  <= 1;
                                                state                  <= 4'd2;
                                        end
                        4'd2://开始采样
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd                  <= 1;
                                                if(ad_busy == 0)
                                                        state   <= 4'd3;
                                                else
                                                        state   <= 4'd2;
                                        end
                        4'd3:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd      <= 0;//50MHz晶振20分频,T=400ns > t9=6ns
                                                data1      <= ad_data;  //第一路
                                                state      <= 4'd4;
                                        end
                        4'd4:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd      <= 1;
                                                state                  <= 4'd5;
                                        end
                        4'd5:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd      <= 0;
                                                data2                  <= ad_data;  //第二路
                                                state                  <= 4'd6;
                                        end
                        4'd6:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd                  <= 1;
                                                state                  <= 4'd7;
                                        end
                        4'd7:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd      <= 0;
                                                data3                  <= ad_data;  //第三路
                                                state                  <= 4'd8;
                                        end
                        4'd8:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd                  <= 1;
                                                state                  <= 4'd9;
                                        end
                        4'd9:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd      <= 0;
                                                data4                  <= ad_data;  //第四路
                                                if(sel == 1)   //共6路
                                                        state        <= 4'd10;
                                                else                                //共4路
                                                        state <= 4'd14;
                                        end
                        4'd10:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd                  <= 1;
                                                state                  <= 4'd11;
                                        end
                        4'd11:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd      <= 0;
                                                data5                  <= ad_data;  //第五路
                                                state                  <= 4'd12;
                                        end
                        4'd12:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd                  <= 1;
                                                state                  <= 4'd13;
                                        end
                        4'd13:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd      <= 0;
                                                data6                  <= ad_data;  //第六路
                                                state                  <= 4'd14;
                                        end
                        4'd14:
                                        begin
                                                ad_convsta <= 1;
                                                ad_convstb <= 1;
                                                ad_convstc <= 1;
                                                ad_rd                  <= 1;
                                                state                  <= 4'd0;
                                        end
                        default:
                                        begin
                                                ad_convsta <= 0;
                                                ad_convstb <= 0;
                                                ad_convstc <= 0;
                                                ad_rd                  <= 1;
                                        end
                endcase
end






endmodule



求各位坛友帮忙指正下问题,谢谢~

发表于 2016-1-14 19:42:23 | 显示全部楼层
thanks
 楼主| 发表于 2016-1-14 22:29:21 | 显示全部楼层
回复 2# moloh


   ???
发表于 2016-1-15 10:58:35 | 显示全部楼层
你的rd信号
ad_rd      <= 0;//50MHz晶振20分频,T=400ns > t9=6ns
data1      <= ad_data;  //第一路
这样控制会不会导致ad没有转化完就读了,或许用一个高频来踩会好一点吧!
 楼主| 发表于 2016-1-15 22:56:18 | 显示全部楼层
回复 4# z894811350


   问题已经解决了,谢谢啦~确实是这样。手册上是这么说的, R8{P00PNY47BQ1]2W2DNR54.png ,可是我觉得这个是t6是最小值,我用的是RD拉低后60ns延迟读出来的。我之前用过RD拉低后20ns和40ns采,都没读出数据
发表于 2016-1-18 10:19:15 | 显示全部楼层
回复 5# qq470373513


   解决就好
发表于 2017-3-9 16:39:44 | 显示全部楼层
你好,最近也在做FPGA控制AD这一块,能把你的资料发下,参考借鉴下,邮箱1397132284@qq.com,谢谢!
发表于 2017-3-9 17:06:31 | 显示全部楼层
你好,最近也在做这个FPGA控制AD,中间出现点问题,能否发份您的资料,借鉴参考下,谢谢!
邮箱:1397132284@qq.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 11:43 , Processed in 0.034441 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表