打印

怎么读AD7714的数据?

[复制链接]
7249|68
手机看帖
扫描二维码
随时随地手机跟帖
沙发
SuperX-man| | 2010-11-11 15:04 | 只看该作者
在AD7714的PDF中有相应的转换时序及配置. 根据其流程写你的VHDL程序,从AD7714的输出脚上就能读到数据了. 上传一个PDF,看一下14-17,29,30页

AD7714.pdf

306.7 KB

使用特权

评论回复
板凳
anqi0126|  楼主 | 2010-11-12 15:15 | 只看该作者
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
ENTITY AD7714 IS
     PORT(
         
         AD7714-1_sclk:IN std_logic;
         
         AD7714-1_pol:IN std_logic;
         AD7714-1_sync:IN std_logic;
         AD7714-1_reset:IN std_logic;
         AD7714-1_standby:IN std_logic;
         
         AD7714-1_din:IN std_logic;
        
         AD7714-1_cs:IN std_logic;
         
         AD7714-1_drdy:OUT std_logic;
         
         AD7714-1_dout:OUT std_logic;
         
         AD7714-1_buffer:IN std_logic;
         );
END AD7714;
ARCHITECTURE AD7714_DATA OF AD7714 IS
     VARIABLE AD7714-1_in_DATA:std_logic_vector(7 downto 0);
     VARIABLE AD7714_1_OUT_DATA:std_logic_vector(23 downto 0);
     VARIABLE in:std_logic;
     VARIABLE n:std_logic;
     VARIABLE m:std_logic;
BEGIN
     
     AD7714_Ctl:PROCESS(clk)                                --读数据
     BEGIN
           AD7714-1_pol:='1';                               --初始化
           AD7714-1_sync:='1';
           AD7714-1_standby:='1';
           AD7714-1_buffer:='1';
           AD7714-1_cs:='0';
           AD7714-1_reset:='1';
           --AD7714-1_in_DATA:="00010000";   --选模式寄存器
           --AD7714-1_in_DATA:="00100000";   --自校准,增益1
           --AD7714-1_in_DATA:="00100000";   --选滤波器高寄存器
           --AD7714-1_in_DATA:="01010001";   --双极性24位
           --AD7714-1_in_DATA:="00110000";   --选滤波器低寄存器
           --AD7714-1_in_DATA:="10000000";   --第1个凹口产生的频率50HZ                 
            
            
               
                  
            IF clk'EVENT and clk='1'THEN
                IF n<'7' THEN
                  CASE n IS
                  WHEN '0' =>AD7714-1_in_DATA:="00010000";
                  WHEN '1' =>AD7714-1_in_DATA:="00100000";
                  WHEN '2' =>AD7714-1_in_DATA:="00100000";
                  WHEN '3' =>AD7714-1_in_DATA:="01010001";
                  WHEN '4' =>AD7714-1_in_DATA:="00110000";
                  WHEN '5' =>AD7714-1_in_DATA:="10000000";
                  WHEN '6' =>AD7714-1_in_DATA:="01011000";
                  END CASE;
                END IF;
                IF i<'8' THEN
                   AD7714-1_sclk<='0';
                   AD7714-1_din<=AD7714-1_in_DATA(i);
                   i:=i+1;
                   AD7714-1_sclk<='1';
                ELSEIF n='6' THEN
                       IF m<'24' THEN
                          AD7714-1_sclk<='0';
                          AD7714-1_OUT_DATA(m)<=AD7714-1_dout;   
                          i:='0';
                          AD7714-1_sclk<='1';
                       AND IF;
                  ELSE i:='0';
                       n:=n+1;
                       
                  END IF;
                END IF;
         END PROCESS AD7714_Ctl;

使用特权

评论回复
地板
anqi0126|  楼主 | 2010-11-12 15:19 | 只看该作者
帮忙看一下我写的程序,这样行吗?总觉得不对。VHDL中付初值,可以就这样放哪就可以吗?
AD7714-1_in_DATA:="00010000";   --选模式寄存器
AD7714-1_in_DATA:="00100000";   --自校准,增益1
AD7714-1_in_DATA:="00100000";   --选滤波器高寄存器
AD7714-1_in_DATA:="01010001";   --双极性24位
AD7714-1_in_DATA:="00110000";   --选滤波器低寄存器
AD7714-1_in_DATA:="10000000";   --第1个凹口产生的频率50HZ

使用特权

评论回复
5
anqi0126|  楼主 | 2010-11-12 15:20 | 只看该作者
还是像上面那样付啊?

使用特权

评论回复
6
SuperX-man| | 2010-11-13 09:31 | 只看该作者
本帖最后由 SuperX-man 于 2010-11-13 10:11 编辑

小版我有个问题.
你这些VHDL代码是准备驱动AD7714么?
如果是驱动AD7714的话,不少输入输出方向好像反了.对于AD7714芯片的输入来说,FPGA应该是输出才对吧.

VHDL代码是硬件描述语言,如果按照
AD7714-1_in_DATA:="00010000";   --选模式寄存器
AD7714-1_in_DATA:="00100000";   --自校准,增益1
AD7714-1_in_DATA:="00100000";   --选滤波器高寄存器
AD7714-1_in_DATA:="01010001";   --双极性24位
AD7714-1_in_DATA:="00110000";   --选滤波器低寄存器
AD7714-1_in_DATA:="10000000";   --第1个凹口产生的频率50HZ
来写,综合以后AD7714-1_in_DATA就只有一个值.

还有从你的代码中嗅出了C语言的味道......
你完成代码以后,有用ISE综合过么?
对于外部端口的赋值不能直接用":="的吧.定义的外部端口都是signal,需要用"<="来赋值.
Variable定义的位置也不对吧,建议你看一下signal和variable的区别.
还有建议你仔细看一下PROCESS以及CASE语句的定义.
还有你完全可以用ISIM做一个仿真来验证一下.

个人感觉你对VHDL语言的了解比较不完整,特别是其构架及定义.建议你复习一下.

使用特权

评论回复
7
anqi0126|  楼主 | 2010-11-15 09:00 | 只看该作者
恩,你说的对啊!我就是不知道该怎么用VHDL,感觉我写的都是C的思想,郁闷啊!

使用特权

评论回复
8
anqi0126|  楼主 | 2010-11-15 09:00 | 只看该作者
这就是准备驱动AD7714的

使用特权

评论回复
9
anqi0126|  楼主 | 2010-11-15 09:02 | 只看该作者
我该怎么办啊?

使用特权

评论回复
10
anqi0126|  楼主 | 2010-11-15 09:07 | 只看该作者
我也觉得最后会只付给他最后一个值,所以我又想了之后的和C很像的付值方法,但也觉得有问题。我想把那几个初值分先后顺序的写进AD7714的片内寄存器,驱动它,我不知道用VHDL该怎么做?

使用特权

评论回复
11
SuperX-man| | 2010-11-15 09:19 | 只看该作者
你也不用那么着急,一步步来.
VHDL语言并不难,你需要的是把这语言搞清楚.
可以找一本VHDL书来看一下,不要多,把前面的基础部分认真看完就可以了.
小版我之前好像上传过一个PDF给你的,另外问一下,你用的是什么软件

使用特权

评论回复
12
SuperX-man| | 2010-11-15 09:20 | 只看该作者
做逐步输出的话用LOOP和CASE就能实现.
不过之前你最好看一下AD7714的时序,毕竟FPGA的速率很高

使用特权

评论回复
13
anqi0126|  楼主 | 2010-11-15 09:22 | 只看该作者
MAX+plus II

使用特权

评论回复
14
anqi0126|  楼主 | 2010-11-15 09:24 | 只看该作者
用的是总线时钟33MHZ的,想要分一下频。

使用特权

评论回复
15
SuperX-man| | 2010-11-15 09:40 | 只看该作者
那你之后要用什么芯片或者哪块开发板来实现呢? xilinx的ISE中是有DCM的(时钟管理器)

使用特权

评论回复
16
anqi0126|  楼主 | 2010-11-15 10:02 | 只看该作者
altera  cyclone

使用特权

评论回复
17
SuperX-man| | 2010-11-15 10:51 | 只看该作者
汗一个...小版我对altera的芯片或者开发板一点都不熟悉,看来在硬件上帮不上什么忙了.
只能帮你参考代码了,呵呵.

如果是Xilinx的ISE软件的话,分频器之类的有现成的IP核可以使用.你也可以用Xilinx的IP Generator生成代码,就是不知道兼容不?

使用特权

评论回复
18
anqi0126|  楼主 | 2010-11-15 20:16 | 只看该作者
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
ENTITY AD7714 IS
     PORT(
         AD7714sclk:OUT std_logic;
         
         AD7714pol:OUT std_logic;
         AD7714sync:OUT std_logic;
         AD7714reset:OUT std_logic;
         AD7714standby:OUT std_logic;
         
         AD7714din:OUT std_logic;
        
         AD7714cs:OUT std_logic;
         
         AD7714drdy:IN std_logic;
         
         AD7714dout:IN std_logic;
         AD7714buffer:OUT std_logic;
         clk:IN std_logic

         );
END AD7714;
ARCHITECTURE AD7714DATA OF AD7714 IS
     SIGNAL Read_AD7714DATA:std_logic_vector(23 downto 0);
     SIGNAL AD7714in_DATA:std_logic_vector(7 downto 0);
     
     BEGIN
       PROCESS(clk)
        VARIABLE i:std_logic:='0';
        VARIABLE m:std_logic:='0';
        VARIABLE n:Integer;                                               --读数据
       BEGIN
          AD7714pol<='1';                              --初始化
          AD7714sync<='1';
          AD7714standby<='1';
          AD7714buffer<='1';
          AD7714cs<='0';
          AD7714reset<='1';
           --AD7714-1_in_DATA:="00010000";   --选模式寄存器
           --AD7714-1_in_DATA:="00100000";   --自校准,增益1
           --AD7714-1_in_DATA:="00100000";   --选滤波器高寄存器
           --AD7714-1_in_DATA:="01010001";   --双极性24位
           --AD7714-1_in_DATA:="00110000";   --选滤波器低寄存器
           --AD7714-1_in_DATA:="10000000";   --第1个凹口产生的频率50HZ                 
           IF (clk'EVENT and clk='1')THEN
                IF n<'7' THEN
                  CASE n IS
                  WHEN '0'=>AD7714in_DATA<="00100000";              
                  WHEN '1' =>AD7714in_DATA<="01010001";              
                  WHEN '2' =>AD7714in_DATA<="00110000";
                  WHEN '3' =>AD7714in_DATA<="10000000";
                  WHEN '4' =>AD7714in_DATA<="00010000";
                  WHEN '5' =>AD7714in_DATA<="00100000";
                  WHEN '6' =>AD7714in_DATA<="01011000";  --选择数据寄存器
                  END CASE;
                END IF;
                IF i<'8' THEN
                   AD7714sclk<='0';
                   AD7714din<=AD7714in_DATA(i);       --把数据写入AD7714
                   i:=i+1;
                   AD7714sclk<='1';
                ELSIF n='6' THEN
                     IF AD7714drdy='0' THEN             --如果AD有新数据产生,就读AD输出数据
                       IF m<"24" THEN
                          AD7714sclk<='0';
                          Read_AD7714DATA(m)<=AD7714dout;   
                          i:='0';
                          AD7714sclk<='1';
                       END IF;
                     END IF;
                   ELSE i:='0';
                        n:=n+1;
                   END IF;
   
                END IF
    END IF;
         END  PROCESS ;
END AD7714DATA;

使用特权

评论回复
19
anqi0126|  楼主 | 2010-11-15 20:17 | 只看该作者
我改了一下,但是编译一下,有好多错误,但好像是共同的错误

使用特权

评论回复
20
anqi0126|  楼主 | 2010-11-15 20:20 | 只看该作者
你给我个邮箱吧?我把错误信息发给你帮我看看呗?那个错误信息复制不下来

使用特权

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

本版积分规则

0

主题

206

帖子

0

粉丝