关于FPGA的AD转换有人做过么?

ko1982   2010-5-23 18:09 楼主
我用的是AD0804,按时序图写出的状态机程序,但是在数码管老是无法正常显示,数字不是老跳就是定在一个值不动,我让其每隔0.5秒就转换一次
        always@(posedge clk)
                if(sw)
                        begin
                        cs<=1;
                        rd<=1;
                        wr<=1;
                        statead<=idle;
                        end
                else
                        case(statead)
                                idle:
                                        begin
                                        statead<=start;
                                        cs<=0;
                                        end
                                start:
                                        begin
                                        statead<=deng;
                                        wr<=0;
                                        cntwr<=0;
                                        end
                                deng:
                                        if(cntwr==4'd6)
                                                begin
                                                cntwr<=0;
                                                wr<=1;
                                                statead<=nobusy;
                                                cntbusy<=0;
                                                end
                                        else
                                                cntwr<=cntwr+1;
                                nobusy:
        ******                                if(cntbusy==16'd50000)
                                                begin
                                                cntbusy<=0;
                                                statead<=trans;
                                                rd<=0;
                                                cnttrans<=0;
                                                end
                                        else
                                                cntbusy<=cntbusy+1;
                                trans:
                                        if(cnttrans==4'd10)
                                                begin
                                                cnttrans<=0;
                                                vol<=db;
                                                rd<=1;
                                                statead<=final;
                                                end
                                        else
                                                cnttrans<=cnttrans+1;
                                final:
                                        begin
                                        statead<=idle;
                                        cs<=1;
                                        end
                        endcase

注意打****号的语句,我感觉问题是不是就是出在这里,按datasheet里wr置高后有一段nobusy又有一段busy的时间,这段时间我一直不知道到底该取多少。。。请问这个延时过长的话或过短的话分别会造成什么情况啊?当然。。。我认为可能是这里有错误,可能其他地方时序也有不对,能有哪位好心人能全部看看就最好不过了

回复评论 (20)

你是说WR持续时间?
点赞  2010-5-23 18:59
引用: 引用 1 楼 peasant_lee 的回复:

你是说WR持续时间?


否,就是转换时间,WR变低再变高不是要等待一段时间吗?然后再让RD变低变高
点赞  2010-5-23 22:28
。。。。??
点赞  2010-5-24 15:34
就是有效电平的持续时间咯,呵呵。首先我看不懂硬件描述语言,这些保持时间要符合硬件要求,datasheet要求延时多长,你就按照它就OK了,假如还不行,估计不是延时的问题,时序。。。
点赞  2010-5-24 16:02
那敢问这位仁兄有用过AD么?不知是用的哪个型号的?用什么控制的啊?
点赞  2010-5-24 23:58
引用: 引用 5 楼 lincoln24 的回复:
那敢问这位仁兄有用过AD么?不知是用的哪个型号的?用什么控制的啊?

AD肯定用过,是用mcu控制的,一般是mcu自带的,不过则这独立的AD我也在读书的时候做过,单单就控制DA正常工作,不难的,就一些控制信号。
点赞  2010-5-25 00:19
恩,我也是觉得不难,我也严格按时序图做了但是就是出不来,我还怕延时不够索性把转换延时加的很长,不过他要不就是没反应要不就是数字乱跳,话说延时过长的话会不会也有影响?
点赞  2010-5-25 09:33
就是说,你现在用FPGA来控制AD芯片,但是结果是检测到的AD值,一就是没反应,二就是经常乱跳。你所说的没反应,是不是就是没检测到AD值?还是固定一个AD值?

假如硬件没问题,我还是怀疑控制信号控制的不好,比如cs 或者转换结果输出的FD, 是否设了高阻态,之类的。。。
点赞  2010-5-25 10:45
我是用8位LED来显示8位AD所转换后的数,没反应即是说灯就一直全亮(低电平时会亮),乱跳即是说LED显示出来的值不固定而且值相差很大,而我输入的是直流电
FD设了高阻态。。?额。。有这个可能,可我LED初始化时就设为8'hff了,你是说这里有问题?
点赞  2010-5-25 12:32
对的。在AD转换之后,你的ad要输出数据,就不应该设为高阻态。

还有,你是否确定你的显示部分是正确的?因为你的系统,现在有两部分:AD检测部分,和LED显示部分。要排除问题,确定LED显示部分没有错,这样,显示乱才代表是检测到数据是错的。
点赞  2010-5-25 12:51
引用: 引用 10 楼 peasant_lee 的回复:

还有,你是否确定你的显示部分是正确的?因为你的系统,现在有两部分:AD检测部分,和LED显示部分。要排除问题,确定LED显示部分没有错,这样,显示乱才代表是检测到数据是错的。


LED应该是没问题吧。。不就是你给0他就亮,你给1他就灭么,如果数据输出是全1,他就应该全灭。。应该没有错的可能吧

在AD转换之后,你的ad要输出数据,就不应该设为高阻态。
-----------AD的输出应该跟芯片自己有关吧,他输出多少我LED灯就显示多少,难道有哪里可以设置高阻态还是非高阻么。。。如果你指的是我LED是否设为高阻,我已经在复位时让他等于ff了,AD转换后把值赋予他的时候他难道会变成高阻么。。?
点赞  2010-5-25 18:16
你的ad芯片0804有个输出高阻态的引脚设置,你看看那个引脚有没有接?给什么电平了?看是否是AD输出高阻态了。
点赞  2010-5-25 18:30
楼主 采用FPGA 控制LED数码管 ,是采用静态扫描 还是动态扫描??

感觉楼主的问题,在于LED数码管的刷新频率 没有弄好;

楼主 注意调试 下LED的刷新频率,以及对应的延时。

楼主可以百度或GOOGLE下,看动态扫描来控制LED 时,为了保证人的视觉感受,对应的刷新频率的设置。
点赞  2010-5-25 18:37
引用: 引用 12 楼 peasant_lee 的回复:

你的ad芯片0804有个输出高阻态的引脚设置,你看看那个引脚有没有接?给什么电平了?看是否是AD输出高阻态了。


没找到这个引脚。。。DATASHEET上面貌似没说啊
话说我现在IO口很奇怪啊。。。我用手碰他们LED有些灯也会灭掉,这是什么原因啊(未接芯片时)
点赞  2010-5-25 23:59
就是 FD引脚,我刚才还特意查了一份资料。的确是0804,不知道为什么你那个没有。
点赞  2010-5-26 00:03
额……那那个引脚是第几管脚?
我现在外接io口很奇怪啊,我人为的用5V电源接了一下其中一个外接口(等于给其中一个灯接了高电平?),但是他却有两个灯熄灭了,不知道这是什么问题啊…?
点赞  2010-5-26 11:07
现在终于能出来了。。。不过测得数总是偏大,不知道这会是芯片本身的问题还是我程序的问题?
数小的时候会相差0.2左右,数大会相差0.4左右。。。。
点赞  2010-5-27 11:50
应该是芯片本身的问题,程序就两种情况,一就是读不出来,或者读错,二,读出来了,那肯定是你芯片转换出来的数据。
点赞  2010-5-27 12:19
恩,多谢
点赞  2010-5-27 16:28
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复