|
![](static/image/common/ico_lz.png)
楼主 |
发表于 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 : in std_logic ;--系统外部有源晶振时钟,50MHZ
ad_busy_n : in std_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;
WHEN STARTAD1=>ad_r_c_n_r<='0';
rc_1<=0;
cstate<=RC2;
WHEN RC2=> rc_1<=rc_1+1;
cstate<=RC3;
WHEN RC3=> IF(rc_1=50) THEN
cstate<=STARTAD2;
ELSE cstate<=RC2;
END IF;
WHEN STARTAD2=>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位没看)。不知道是为什么。 |
|