ADS7825的控制
有没有人用FPGA控制ADS7825完成AD转换(然后写入外部FIFO存储器)的经历,可否留下联系方式,QQ或电话,诚心交流和请教,谢谢! 下面是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位没看)。不知道是为什么。 会不会是因为FPGA为3.3V的I/O逻辑电平,而ADS7825为5V逻辑电平芯片,会不会不匹配,常用的3.3V精度精度和速度要求均相对较高的AD芯片可否推荐几款? 有没有人用过这个芯片啊……真的需要求助。
页:
[1]