关于FPGA的AD转换有人做过么?
时间:10-02
整理:3721RD
点击:
我用的是AD0804,按时序图写出的状态机程序,但是在数码管老是无法正常显示,数字不是老跳就是定在一个值不动,我让其每隔0.5秒就转换一次
- always@(posedge clk)
- if(sw)
- begin
- cs<=1;
- rd<=1;
- wr<=1;
- statead<=idle;
- end
- else
- case(statead)
- idle:
- if(reset)
- begin
- statead<=start;
- cs<=0;
- end
- else
- statead<=idle;
- 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==19'd5000)
- 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的时间,这段时间我一直不知道到底该取多少。请问这个延时过长的话或过短的话分别会造成什么情况啊?当然。我认为可能是这里有错误,可能其他地方时序也有不对,能有哪位好心人能全部看看就最好不过了
把代码重新排版一下
2# falloutmx 额。整理好了
这位仁兄是不是有用过这个?
?
你好,我做过fpga对ad的采集,这个数值跳变的原因有很多,可能是你模拟电路部分AD电源有纹波,导致ad采集每次数值不一样。建议你在固定周期内多次采集,将数据求和取平均值显示,这样可以保证数据比较稳定,你可以尝试一下。
同意楼上建议……
非要用状态机,建议学习一下三段式状态机的写法。
还有ADC采样,注意ADC的采样时钟和自己的电路工作时钟是否同源。
如果不是需要FIFO。
没有仔细看你的代码,对代码的逻辑是否存在逻辑错误不做评价。
