微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于FPGA的AD转换有人做过么?

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

时间:10-02 整理:3721RD 点击:

我用的是AD0804,按时序图写出的状态机程序,但是在数码管老是无法正常显示,数字不是老跳就是定在一个值不动,我让其每隔0.5秒就转换一次

  1.         always@(posedge clk)
  2.                 if(sw)
  3.                         begin
  4.                         cs<=1;
  5.                         rd<=1;
  6.                         wr<=1;
  7.                         statead<=idle;
  8.                         end
  9.                 else
  10.                         case(statead)
  11.                                 idle:
  12.                                         if(reset)
  13.                                                 begin
  14.                                                 statead<=start;
  15.                                                 cs<=0;
  16.                                                 end
  17.                                         else
  18.                                                 statead<=idle;
  19.                                 start:
  20.                                         begin
  21.                                         statead<=deng;
  22.                                         wr<=0;
  23.                                         cntwr<=0;
  24.                                         end
  25.                                 deng:
  26.                                         if(cntwr==4'd6)
  27.                                                 begin
  28.                                                 cntwr<=0;
  29.                                                 wr<=1;
  30.                                                 statead<=nobusy;
  31.                                                 cntbusy<=0;
  32.                                                 end
  33.                                         else
  34.                                                 cntwr<=cntwr+1;
  35.                                 nobusy:
  36.                                         if(cntbusy==19'd5000)
  37.                                                 begin
  38.                                                 cntbusy<=0;
  39.                                                 statead<=trans;
  40.                                                 rd<=0;
  41.                                                 cnttrans<=0;
  42.                                                 end
  43.                                         else
  44.                                                 cntbusy<=cntbusy+1;
  45.                                 trans:
  46.                                         if(cnttrans==4'd10)
  47.                                                 begin
  48.                                                 cnttrans<=0;
  49.                                                 vol<=db;
  50.                                                 rd<=1;
  51.                                                 statead<=final;
  52.                                                 end
  53.                                         else
  54.                                                 cnttrans<=cnttrans+1;
  55.                                 final:
  56.                                         begin
  57.                                         statead<=idle;
  58.                                         cs<=1;
  59.                                         end
  60.                         endcase

复制代码


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

把代码重新排版一下

2# falloutmx 额。整理好了
这位仁兄是不是有用过这个?

?

你好,我做过fpga对ad的采集,这个数值跳变的原因有很多,可能是你模拟电路部分AD电源有纹波,导致ad采集每次数值不一样。建议你在固定周期内多次采集,将数据求和取平均值显示,这样可以保证数据比较稳定,你可以尝试一下。

同意楼上建议……

非要用状态机,建议学习一下三段式状态机的写法。
还有ADC采样,注意ADC的采样时钟和自己的电路工作时钟是否同源。
如果不是需要FIFO。
没有仔细看你的代码,对代码的逻辑是否存在逻辑错误不做评价。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top