⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad.vhd

📁 这是一个用VHDL开发的RS422通讯程序,在ALTERA FLEX EPF10K上通过了测试
💻 VHD
📖 第 1 页 / 共 2 页
字号:
--功能:读出AD值.
--输入:sa=x"c001"
--      启动命令:x"01" = 单独启动CH指定的一路。
--              : x"03" = 从ch=0开始连续启动3路。
--              " x"07" = 从ch=0开始连续启动5路。           
--	  	sa=x"c000" 通道号:ch
--
--输出:如果是测+5V参考电压,则给出好与不好。
--	    如果是连通性检查,则给出连通否。
--      如果是SD,则给出当前SD位置。
--      如果是CM,则给出当前CM位置。
--返回状态:sa=x"c018"
--			adc_st=x"10"  正常结束。
--          adc_st="00"   复位 
--          adc_st=x"03"  AD未正常结束,超时。

LIBRARY IEEE;

use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity ad is port(
		rst				: in std_logic;
		sa				: in std_logic_vector(15 downto 0);
		sd_in			: in std_logic_vector(7 downto 0);
		iow				: in std_logic;
		ior				: in std_logic;
		p1mhz			: in std_logic;
		cda				: out std_logic_vector(2 downto 0);
		eoc_state		: in std_logic;
		sd				: in std_logic_vector(7 downto 0);
		rd_adl			: out std_logic;
		rd_adh			: out std_logic;
		start_ad 		: out std_logic;
	--ad 转换状态。00=转换结束;11=转换超时。	
		adc_state		: out std_logic_vector(7 downto 0);
		lchk_level 		: out std_logic_vector(1 downto 0); 
		p28v_level 		: out std_logic;
		n28v_level 		: out std_logic;
		ref5v_level		: out std_logic;	
		cm_level 		: out std_logic_vector(3 downto 0);
		sd_level		: out std_logic_vector(3 downto 0)

);
end entity ;

architecture ad of ad is

component wri_reg8 is port(
		iow			: in std_logic;
		rst			: in std_logic;
		cs			: in std_logic;
		data_in		: in std_logic_vector(7 downto 0);
		data_out	: out std_logic_vector(7 downto 0)
		);
end component;
		
	
signal st : integer range 0 to 31;
		
constant st_idle 			: integer	:= 0;
constant st_start_ad 		: integer	:= 1;	
constant st_ad_wait			: integer	:= 2;
constant st_ad_wait0		: integer	:= 3;
constant st_read_adl		: integer	:= 4;
constant st_read_adl_wait	: integer	:= 5;
constant st_read_adl_wait0	: integer	:= 6;
constant st_read_adh		: integer	:= 7;
constant st_read_adh_wait	: integer	:= 8;
constant st_read_adh_wait0	: integer	:= 9;
constant st_ad_next			: integer	:= 10;
constant st_ad_end			: integer	:= 11;
constant st_con_ad			: integer	:= 12;
constant st_ad_error		: integer	:= 13;
constant st_charge			: integer	:= 14;
constant st_cda_inc			: integer	:= 15;
constant st_cda_inc_wait	: integer	:= 16;
constant st_ad_end_wait		: integer	:= 17;

----lchk--如果小于clhk,则未开锁---
--未开锁时,输入电压3.75V,算作4V;开锁后,输入电压为4.7V
constant no_lock_l : std_logic_vector(11 downto 0) := x"a60";--3V
constant no_lock_h : std_logic_vector(11 downto 0) := x"b40";--4V
constant on_lock_l : std_logic_vector(11 downto 0) := x"B90";--4.5V
constant on_lock_h : std_logic_vector(11 downto 0) := x"c00";--5V

-------------cm1 data-----------------------
constant cml1 : std_logic_vector(11 downto 0) := x"920";
constant cmh1 : std_logic_vector(11 downto 0) := x"a00";
-------------cm2 data-----------------------
constant cml2 : std_logic_vector(11 downto 0) := x"a20";
constant cmh2 : std_logic_vector(11 downto 0) := x"b40";
-------------cm3 data-----------------------
constant cml3 : std_logic_vector(11 downto 0) := x"c00";
constant cmh3 : std_logic_vector(11 downto 0) := x"d00";
-------------cm4 data-----------------------
constant cml4 : std_logic_vector(11 downto 0) := x"e00";
constant cmh4 : std_logic_vector(11 downto 0) := x"f00";
-------------cm5 data-----------------------
constant cml5 : std_logic_vector(11 downto 0) := x"f20";
constant cmh5 : std_logic_vector(11 downto 0) := x"fff";
-------------cm6 data-----------------------
constant cml6 : std_logic_vector(11 downto 0) := x"520";
constant cmh6 : std_logic_vector(11 downto 0) := x"600";
-------------cm7 data-----------------------
constant cml7 : std_logic_vector(11 downto 0) := x"620";
constant cmh7 : std_logic_vector(11 downto 0) := x"700";
-------------cm8 data-----------------------
constant cml8 : std_logic_vector(11 downto 0) := x"420";
constant cmh8 : std_logic_vector(11 downto 0) := x"500";
-------------cm9 data-----------------------
constant cml9 : std_logic_vector(11 downto 0) := x"320";
constant cmh9 : std_logic_vector(11 downto 0) := x"400";
-------------cm1 data-----------------------
constant cml10 : std_logic_vector(11 downto 0) := x"220";
constant cmh10 : std_logic_vector(11 downto 0) := x"300";
-------------cm11 data-----------------------
constant cml11 : std_logic_vector(11 downto 0) := x"000";
constant cmh11 : std_logic_vector(11 downto 0) := x"100";
-------------cm1 data-----------------------
constant cml12 : std_logic_vector(11 downto 0) := x"120";
constant cmh12 : std_logic_vector(11 downto 0) := x"200";


-------------sd data----------------------- 
-------sd1---------
constant sdl1 : std_logic_vector(11 downto 0) := x"900";
constant sdh1 : std_logic_vector(11 downto 0) := x"9d0";
-------sd2---------
constant sdl2 : std_logic_vector(11 downto 0) := x"a00";
constant sdh2 : std_logic_vector(11 downto 0) := x"ad0";
-------sd3---------
constant sdl3 : std_logic_vector(11 downto 0) := x"b00";
constant sdh3 : std_logic_vector(11 downto 0) := x"bd0";
-------sd4----------
constant sdl4 : std_logic_vector(11 downto 0) := x"c00";
constant sdh4 : std_logic_vector(11 downto 0) := x"cd0";
-------sd5----------
constant sdl5 : std_logic_vector(11 downto 0) := x"d00";
constant sdh5 : std_logic_vector(11 downto 0) := x"dd0";
-------sd6----------
constant sdl6 : std_logic_vector(11 downto 0) := x"e00";
constant sdh6 : std_logic_vector(11 downto 0) := x"ed0";
-------sd7----------
constant sdl7 : std_logic_vector(11 downto 0) := x"f00";
constant sdh7 : std_logic_vector(11 downto 0) := x"fcc";

-----------ad_data_P28-------------
constant p28v_l : std_logic_vector(11 downto 0) := x"f90";
-----------ad_data_n28-------------
constant n28v_h : std_logic_vector(11 downto 0) := x"066";
-------------ref5v---------------
constant ref5v_l : std_logic_vector(11 downto 0) := x"B90";--4.5V
constant ref5v_h : std_logic_vector(11 downto 0) := x"c70";--5.5V


signal beg_ad,end_ad : std_logic;
--channel
signal cs_ch : std_logic;
signal t_cda : std_logic_vector(2 downto 0);
signal cda_inc : std_logic;
signal cs_com : std_logic;
signal com : std_logic_vector(7 downto 0);
signal ch_cnt : integer range 0 to 7;
signal ad_data_lchk : std_logic_vector(11 downto 0);
signal ad_data_sd : std_logic_vector(11 downto 0);
signal ad_data_cm : std_logic_vector(11 downto 0);
signal ad_data_P28 : std_logic_vector(11 downto 0);
signal ad_data_N28 : std_logic_vector(11 downto 0);
signal ad_data_V5 : std_logic_vector(11 downto 0);
signal ad_data_temp  : std_logic_vector(11 downto 0);
signal ad_charge_time : integer range 0 to 63;
signal ad_delay_time : integer range 0 to 110;
signal can_ad : std_logic;
signal t_adc_state : std_logic_vector(1 downto 0);
signal t_end_ad_tag : std_logic;
---------sig_ad data---------------------------
-----根据各个通道,判决输入状态。
--如果lchk_level="00",则+28VB未连接,
--    lchk_level="01",则未开锁。
--    lchk_level="10",则已开锁。
signal t_lchk_level : std_logic_vector(1 downto 0); 
--共1-7级
signal t_sd_level : std_logic_vector(3 downto 0);
--共1-12级
signal t_cm_level : std_logic_vector(3 downto 0);

--测p28v。经变压后成9.5V以上。
--如果电压在9.5V,则p28_level='0',否则='1'.
signal t_p28v_level : std_logic;

--测n28v。经变压后成0.5V以下。
--如果电压在0.5V以下,则n28_level='0',否则='1'.
signal t_n28v_level : std_logic;

--测ref5v。如果电压在4.5V~5.5V,则ref5v_level='0',否则='1'。
signal t_ref5v_level : std_logic; 

begin



lchk_level <= t_lchk_level; 
p28v_level <= t_p28v_level;
n28v_level <= t_n28v_level;
ref5v_level <= t_ref5v_level;	
cm_level <= t_cm_level;
sd_level <= t_sd_level;	

generate_lchk_level : process(ad_data_lchk)
begin
	if ad_data_lchk < no_lock_l then
		t_lchk_level <= "00";
	elsif ad_data_lchk >= no_lock_l and ad_data_lchk <= no_lock_h then
		t_lchk_level <= "01";	 
	elsif ad_data_lchk >= on_lock_l and ad_data_lchk <= on_lock_h then
		t_lchk_level <= "10";	 	
	else
		t_lchk_level <= "00";	
	end if;	
end process;

gen_sd_level : process(ad_data_sd)
begin
	if ad_data_sd >= sdl1 and ad_data_sd <= sdh1 then
		t_sd_level <= x"1";
	elsif ad_data_sd >= sdl2 and ad_data_sd <= sdh2 then
		t_sd_level <= x"2";			  
	elsif ad_data_sd >= sdl3 and ad_data_sd <= sdh3 then
		t_sd_level <= x"3";			  
	elsif ad_data_sd >= sdl4 and ad_data_sd <= sdh4 then
		t_sd_level <= x"4";			  
	elsif ad_data_sd >= sdl5 and ad_data_sd <= sdh5 then
		t_sd_level <= x"5";			  
	elsif ad_data_sd >= sdl6 and ad_data_sd <= sdh6 then
		t_sd_level <= x"6";			  
	elsif ad_data_sd >= sdl7 and ad_data_sd <= sdh7 then
		t_sd_level <= x"7";			  
	else
		t_sd_level <= x"0";
	end if;	 		
end process;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -