dltyy 发表于 2011-4-30 22:34:10

ADS7825的控制

有没有人用FPGA控制ADS7825完成AD转换(然后写入外部FIFO存储器)的经历,可否留下联系方式,QQ或电话,诚心交流和请教,谢谢!

dltyy 发表于 2011-5-1 11:30:40

下面是VHDL的源码,可以帮我看一下吗,不是很长:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

entity ad is
       
    GENERIC
    (
      STARTAD0: INTEGER:=1;
      RC0 :   INTEGER:=2;
      RC1 :   INTEGER:=3;
      STARTAD1: INTEGER:=4;
      RC2 :   INTEGER:=5;
      RC3 :   INTEGER:=6;
      STARTAD2: INTEGER:=7;
      
      
      STATE2: integer:= 8;
      STATE8: INTEGER:=9;
      READ0:INTEGER:=10;
      READ1:INTEGER:=11;
      
      STATE5: INTEGER:=12;
      READ2: integer:=13;
      READ3: INTEGER:=14;
      
      IDLE: integer:=0
      );
      
           port
        (
                -- Input ports
                clk        : instd_logic ;--系统外部有源晶振时钟,50MHZ
               
                ad_busy_n        : instd_logic ;--ADS7825 转换忙状态,_n表示低电平有效,下面的均是此含义
                datain :in std_logic_vector(7 DOWNTO 0);--ADS7825的数据输出端,即FPGA数据输入端
               
                               
                -- Output ports
                ad_r_c_n        : out std_logic;--ADS7825 read/convert
                ad_byte        : out std_logic;--ADS7825 转换输出数据的高低位选择,低电平对应高8位,高电平对应低8位                         ad_addr        : out std_logic_vector(1 downto 0);--ADS7825 地址               
                dataout : out std_logic_vector(7 downto 0)--这里,把读出的AD数据通过datain->data_r寄存器->dataout(连接的是LED灯显示)
                               
                );
end zong;

-- Library Clause(s) (optional)
-- Use Clause(s) (optional)

architecture arc_zong of zong is

SIGNAL ad_addr_r: STD_LOGIC_VECTOR(1 downto 0):="00";
SIGNAL data_r1,data_r2 : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL cstate: integer;
SIGNAL ad_r_c_n_r,ad_byte_r: STD_LOGIC;--_r代表寄存器,临时信号
SIGNAL read_0,read_1,rc_0,rc_1: integer;--定时计数的参数,


       
begin
         
   PROCESS(clk,cstate,datain,data_r1,data_r2)
      
      
          BEGIN
         
         IF (clk'EVENT AND clk='1') THEN
                  
                  CASE cstate IS
                  
                  WHEN IDLE=>cstate<=STARTAD0;

                  WHEN STARTAD0=>ad_r_c_n_r<='1';
                                 rc_0<=0;
                                  cstate<=RC0;
                  WHEN RC0=>    rc_0<=rc_0+1;
                                  cstate<=RC1;
                  WHEN RC1=>IF(rc_0=1) THEN
                                 cstate<=STARTAD1;
                                 ELSE cstate<=RC0;
                              END IF;
                  WHENSTARTAD1=>ad_r_c_n_r<='0';
                                    rc_1<=0;
                                    cstate<=RC2;
                  WHENRC2=>rc_1<=rc_1+1;
                                 cstate<=RC3;
                  WHENRC3=>IF(rc_1=50) THEN
                                 cstate<=STARTAD2;
                                 ELSE cstate<=RC2;
                              END IF;
                  
                  WHENSTARTAD2=>ad_r_c_n_r<='1';
                                    cstate<=STATE2;--以上几个状态完成了ad_c_r_n位的负脉冲启动AD转换,时间为50个计数,就是1us左右
                              
                  WHEN STATE2=> IF( ad_busy_n='1' ) THEN
                                     cstate<=STATE8;
                                 ELSE cstate<=STATE2;
                                    
                                 END IF;--等待转换完毕
                                 
                  
                  WHEN STATE8=>ad_r_c_n_r<='1';
                                 ad_byte_r<='0';
                                 read_0<=0;
                                 cstate<=READ0;
                     
                                 
                     WHEN READ0=>data_r1<=datain;
                                 read_0<=read_0+1;
                                 cstate<=READ1;
                     WHEN READ1=> IF(read_0=200) THEN
                                     cstate<=STATE5;
                                  ELSE cstate<=READ0;
                                  END IF;                     --读取高8位数据,放入data_r1寄存器
                                 
                  
                     WHEN STATE5=> ad_byte_r<='1';
                                    read_1<=0;
                                    cstate<=READ2;
                                    
                      WHEN READ2=> data_r2<=datain;
                                 read_1<=read_1+1;
                                 cstate<=READ3;
                      WHEN READ3=> IF(read_1=200) THEN
                                     cstate<=STARTAD0;
                                 ELSE cstate<=READ2;
                                 END IF;                  --读取低8位,放入data_r2寄存器               
                                          
                                                                                          
                                                
                     WHEN others=>cstate<=IDLE;
                                 
                  END CASE;
                  
            END IF;   
         END PROCESS;





ad_addr<="01";--一直转换通道1
ad_r_c_n<=ad_r_c_n_r;
ad_byte<=ad_byte_r;

dataout<=data_r1;--LED显示高8位,因为为了简单看一下是否能转换,通道1接的就是一个直流电平,所以两次转换之间没有额外延时,给LED充分的显示时间,如果数据不是直流信号,当然得给每次显示延时到人眼能识别

end arc_zong;

现在的问题是,我感觉AD芯片根本就没启动,我把输出数据一直为00000000(低8位,高8位没看)。不知道是为什么。

dltyy 发表于 2011-5-1 19:33:37

会不会是因为FPGA为3.3V的I/O逻辑电平,而ADS7825为5V逻辑电平芯片,会不会不匹配,常用的3.3V精度精度和速度要求均相对较高的AD芯片可否推荐几款?

dltyy 发表于 2011-5-2 22:59:14

有没有人用过这个芯片啊……真的需要求助。
页: [1]
查看完整版本: ADS7825的控制