打印

5416DSP+FPGA数据采集系统,项目进行中,经验直播年后回归!

[复制链接]
楼主: congfeiyu
手机看帖
扫描二维码
随时随地手机跟帖
21
赶上LZ直播了,坐等LZ成功!

使用特权

评论回复
22
congfeiyu|  楼主 | 2010-12-14 11:58 | 只看该作者
呵呵 我知道 我测量的是正五伏电源 20# 老鱼探戈

使用特权

评论回复
23
kubuco| | 2010-12-14 19:14 | 只看该作者
持续关注。

使用特权

评论回复
24
congfeiyu|  楼主 | 2010-12-15 09:12 | 只看该作者
看来编程真的是一个重头戏,我都不知道从哪开始,想了又想还是从FPGA程序开始吧,FPGA需要的模块也不少,需要配置DDS芯片,接收八路ADC的串行输出并转换为并行,还要接收DSP的指令输出DDS波形给DAC,就先从接收ADC的数据开始吧,老板要求需要用FPGA片上RAM做成八对"乒乓式"FIFO,先来研究研究这个“乒乓式”FIFO怎么玩的..

1.jpg (94.99 KB )

ADC与FPGA的接口

ADC与FPGA的接口

使用特权

评论回复
25
congfeiyu|  楼主 | 2010-12-17 10:35 | 只看该作者
这两天没进展因为我一直在考虑一个问题:DSP给FPGA发指令,让FPGA做出各种操作怎么实现?又查资料又看书的,感觉似乎明白了一些,既然DSP的地址总线的低8位是连在FPGA上,那就让FPGA通过地址译码来识别各种指令,每一个指令占一个DSP外设的地址。
那接下来FPGA的程序就能细化了,接下来要考虑FPGA和ADC接口的问题,要做串并转换和FIFO,还有八路的ADC输出怎么能传送给DSP。
另外我想起来一件事,最好能在板子上加个LED作为测试,还有DSP的reset脚最好也有个指示用的LED,这样电路有没有正常工作就能直接看出来,这是我从一个DSP开发板上学到的。如果以后做新板子我就这样做。
说实话,我一个人做这个项目挺难的,感觉前面有一个大槛,但是我昨天见到一句话,贴出来和大家共勉:一个人的成就大小往往取决于他所遇到的困难的程度。竖在你面前的栏越高,你跳得也越高。当你遇到困难或挫折时,不要被眼前的困境所吓倒,只要你勇敢面对,坦然接受生活的挑战,就能克服困难和挫折,取得更高的成就。这就是著名的跨栏定律。

使用特权

评论回复
26
congfeiyu|  楼主 | 2010-12-17 14:00 | 只看该作者
我*,还是老师厉害,今天导师来了,说可以只用一个地址,在FPGA内部做一个类似16位寄存器的东西,然后就像CPU一样,寄存器的每一位代表一个功能,比如启动AD转换、启动DA转换等等..这样会比我楼上的想法简单而且肯定节省资源,好来构思构思:lol

使用特权

评论回复
27
kubuco| | 2010-12-20 09:56 | 只看该作者
帮顶。

使用特权

评论回复
28
congfeiyu|  楼主 | 2010-12-20 14:26 | 只看该作者
最近在忙着开发FPGA的程序,由于这里是DSP版面,那FPGA程序的进展就不在这里贴出了,过一些天等我FPGA开发完毕开始开发DSP时再来更新吧!

使用特权

评论回复
29
大碗拉面| | 2010-12-23 16:16 | 只看该作者
看了楼主的直播,很棒。
楼主能给讲解一下DDS、FPGA、DA之间的控制关系么?

使用特权

评论回复
30
congfeiyu|  楼主 | 2010-12-24 09:28 | 只看该作者
29# 大碗拉面 呵呵 我这个里面DDS的输出是ADC的时钟,同时ADC的时钟经过FPGA二分频后成为DAC的时钟。而DDS的时钟是由DSP的CLKOUT(40MHz)引脚输出的时钟经过FPGA二分频提供的。

使用特权

评论回复
31
大碗拉面| | 2010-12-27 16:02 | 只看该作者
很不错的设计思路哦~~
楼主测试AD和DA了么?抖动大么?
AD那块电路楼主调好了么?看到楼主选用的是24位AD,不知到在实际使用中,AD采样结果是否稳定?

使用特权

评论回复
32
congfeiyu|  楼主 | 2010-12-27 18:36 | 只看该作者
AD和DA都还没调试呢 调试时肯定都会遇到很多问题,现在还在开发FPGA的程序,以后遇到问题会继续更新的哈!
31# 大碗拉面

使用特权

评论回复
33
hllyh| | 2011-1-7 10:55 | 只看该作者
24位的AD/DA,不知道是什么模拟信号?你用示波器看看现在板上的干扰波形吧,看看能用几位?

使用特权

评论回复
34
congfeiyu|  楼主 | 2011-1-10 12:12 | 只看该作者
是震动数据采集,模拟信号是传感器的输出。24位是项目交付方要求的,既然精度高,模拟通道的质量肯定也要跟上去的
33# hllyh

使用特权

评论回复
35
大碗拉面| | 2011-1-11 11:55 | 只看该作者
楼主快直播吧~~~
虽然是DSP板块,也不妨把FPGA的心得上传啊

使用特权

评论回复
36
jonjie| | 2011-1-11 20:15 | 只看该作者
明天看直播啊

使用特权

评论回复
37
lp1468| | 2011-1-14 11:22 | 只看该作者
学习

使用特权

评论回复
38
zc1718| | 2011-1-27 21:02 | 只看该作者
当个观众

使用特权

评论回复
39
congfeiyu|  楼主 | 2011-2-16 15:52 | 只看该作者
大家好,LZ又回来了!年前花了一个月搞FPGA的程序,搞的头都大了,尤其是FPGA和DSP接口的部分弄了我将近十天,期间还烧了个片子。有同学说把FPGA的部分也说出来,那我来介绍一下FPGA的部分哈!FPGA有四大模块:ADC接口模块、DAC接口模块,DSP接口模块,FIFO缓冲模块,细节太多不能一一说清,现在就我认为比较核心和通用的部分---FIFO缓冲模块和DSP接口模块介绍给大家。 LZ在FPGA内部调用了altera的8个FIFO作为8路AD的缓冲,深度为1K字,为此8个FIFO定义了八个地址供DSP读取,众所周知FIFO是需要读写使能信号和读写时钟的,那DSP读取FIFO时如何才能产生正确的FIFO的读使能信号和读时钟信号呢?大家看附图DSP IO读时序图,DSP读取时地址变化,且IS变低,LZ就用always@(ADDR or IS)对地址进行译码产生相应地址指向的FIFO的读使能信号,同时读取时DSP的IOSTRB会变低,LZ就将IOSTRB取反作为FIFO的读时钟就行啦!哈哈简单吧!FIFO的写由于牵扯到本项目用到的AD芯片,通用性不强,就不介绍喽!
DSP接口模块负责如上所述的向DSP传送FIFO中的数据,还可接收DSP发来的数据。LZ在FPGA内定义了很多寄存器,分配给它们不同的地址,DSP向不同地址的寄存器写入数据,再在FPGA内部对寄存器的内容进行判断就可以进行相应的控制操作了。至于怎样接收DSP发来的数据,大家看附图DSP IO写时序图,DSP的数据总线D的数据准备好后IOSTRB会有一个低电平脉冲,那LZ就检测低电平脉冲的上升沿:
always@(posedge IOSTRB or posedge RST)
if(RST)

begin
  ...
       end
else if(~R_W)

case(ADDR)

...就可以往相应的寄存器里写数据啦,最后用always@(register)来译码寄存器里的数据就能控制了!

1.jpg (58.23 KB )

DSP IO读时序图

DSP IO读时序图

2.jpg (62.81 KB )

DSP IO写时序图

DSP IO写时序图

使用特权

评论回复
40
congfeiyu|  楼主 | 2011-2-16 15:56 | 只看该作者
LZ在开发FPGA程序时在一个小记事本里记下了每天的程序进展,这样做下来可以看到自己每天的进步,很有成就感!

2010.12.17:  PLL3和PLL4的程序完成,定义了内部信号pll_reset还没用到,以后最好再用上Locked信号。
2010.12.18:弄清ADC的SCLK信号与CLK信号之间的关系
2010.12.19:已经用上了PLL的locked信号,SCLK为ADC时钟的二分频,帧同步信号的时序尚未搞清
2010.12.20:基本弄清ADC时序,用24位计数器产生了FSYNC的波形;将FPGA的引脚进行了分配,将nCEo引脚配置成了普通IO;将READY和SYNC先置1。
2010.12.21:将FPGA的工程重新建立,顶层为图形文件,再将先前的PLL等模块加入。写出了ADC接口模块的代码,目前只有一路串并转换,八路同时转换待代码测试正确后再修改
2010.12.22:ADC的帧同步信号不是SCLK的24分频,而是主时钟的256分频。将程序进行了修改并仿真,将主时钟通过三个D触发器八分频产生SCLK信号,再将SCLK32分频产生帧同步信号,一路串行信号成功转成并行输出,但CLK的下降沿到SCLK的下降沿之间的时间间隔不能达到主时钟为30MHZ时的时序要求(比时序要求多了大约4ns )。
2010.12.24:学习modelsim的使用和testbench的编写
2010.12.25:Altera的FIFO的空满标志位不是同步的,再程序中给帧同步脉冲计数来确定选择哪个FIFO,仿真结果正常
2010.12.27:FIFO在输入是高阻时也能将高阻数据读入,所以需要再串并变换期间将读使能信号置低
2010.12.28:16个FIFO接在同一个总线上,读使能无效时输出不是高阻,会对总线数据有影响,群里建议1:用数据选择器。2:assign        Output = enable? in0 : 1'bz;2010.12.30:采用数据选择器的方式,但是PLL3莫名没有波形输出
2010.12.31:准备不采用乒乓年操作,采用FIFO半满中断的方式来操作,发现FSYNC不是SCLK的32分频,是33分频,将adc_interface中的counter的31改成了30.
仿真发现ADC_INTERFACE模块的串并变换部分都是SCLK下降沿,数据未稳定,将移位寄存不问的always模块改成上升沿,确定何时输出以及何时complete为高的的counter都加1
2011.1.2:modelsim仿真时PLL总没有输出波形,将PLL模块去掉用时钟代替,FIFO写入正常,准备用FIFO半满标志来触发DSP读取FIFO
2011.1.6:将双向端口用宏单元实现,单独仿真EN模块正确,但是一起仿真不正确
2011.1.7:原来FIFO的前两个读时钟读不出正常的数据,而之前的仿真每个FIFO只读两次,才会不对。双向端口起初仿真只能输入不能输出,后在网上得知双向端口的输出是表现在生成的result信号里的,仿真正确。延时还需仔细考虑
2011.1.9:换了quartus ii 10.0 SP1和modelsim 6.5e
2011.1.10:   DDS配置模块,启动配置即串并变换后无法结束配置,改用DSP来控制一位一位的配置。功能基本实现,但是W_CLK上升沿时数据不稳定
2011.1.11:采用一对反向的W_CLK信号来解决昨天的问题。但是别的信号产生时(比如复位)会造成W_CLK的的误动作,将W_CLK和其他动作的寄存器分开,产生了W_CLK和CLK_POP信号,问题解决了,明天将此模块整合到顶层模块中
2011.1.12:将dsp_interface模块换成了一个verilog文件,不再用bdf文件,双向端口改用verilog描述.将dsp_interface模块单独拿出来测试双向端口,在此之前先定义一个只有双向端口的工程测试双向端口的仿真。quartus ii 10.0软件出了问题,编辑原理图会异常退出,下载了10.1做备用
2011.1.13:只要不为原理图内的引脚修改名称就不会异常退出,将dds_interface模块整合到顶层模块里,但是寄存器传输级仿真时会报错,说无法例化FIFO,改成门级仿真就不会报错,仿真结果正确!
2011.1.14:将模拟开关模块整合到顶层模块,仿真正确!将PLL模块整合到顶层模块中,发现整合后地址从FF变成01时延迟很大,以至于第一次从FIFO2读数会失败,但当地址从其他地址变成01时会正常读取。
2011.1.18:将产生读FIFO使能的模块由always@(posedge CLKOUT or RST)改成了always@(ADDR or IS),这样CLKOUT完全不再参与FPGA内部的读写,CLKOUT在PCB板上的延迟将无影响。之前的地址从FF变成01时有延迟的现象消失。DA部分的程序仍在FPGA内实现,不用DSP的串口,用FPGA实现IIS协议
2011.1.19:参考网上以及DE2的示例程序,DAC模块代码以及缓冲设计完成,用modelsim功能仿真正确,时序仿真不正确,但是用quartus的波形时序仿真结果正确,不管。将DAC模块整合到顶层模块中,用modelsim时序仿真成功!
2011.1.20:将多余的测试引脚去掉,将ADC的enable信号放在了dsp_interface里面,又加入了DAC的复位信号以及FIFO向DSP发中断的逻辑(一个触发器,用DSP的IACK清除)
2011.1.21:分配引脚,下载程序时发现JTAG模式无法下载,说无法检测JTAG接口,只能用AS模式下载到了配置芯片里,下载后测试模拟开关发现模拟开关模块的电平与设计吻合
晕!JTAG不能下载是因为我把下载插头插在了AS的插座上!
2011.1.22:用JTAG试着向FPGA的模拟开关控制模块发送数据,但没有成功,不知是DSP程序不正确还是FPGA代码有问题。而且DAC短路冒烟,可能是刚开机时电压源出了故障从5V一下子跳到了10V将DA击穿。将DA吹下后正常。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则