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

📄 sig_adc.vhd

📁 rs422协议的通讯程序.做一些简单改动即可以移植到各种环境。
💻 VHD
字号:
--功能:执行单一通道的ad转换
--输入:启动信号can_ad
--
--输出:
--返回状态:
--			adc_st=x"80"  正常结束。
--          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 sig_adc is port(
		rst				: in std_logic;
		sa				: in std_logic_vector(15 downto 0);
		ad_in			: in std_logic_vector(7 downto 0);
		can_adc			: in std_logic;
		iow				: in std_logic;
		p12mhz			: in std_logic;
		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);
		ad_data			: out std_logic_vector(11 downto 0)


);
end entity ;

architecture ad of sig_adc 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;
constant st_read_adl_end			: integer	:= 18;
constant st_read_adh_end			: integer	:= 19;
constant st_read_adl_end_wait		: integer	:= 20;
constant st_read_adh_end_wait		: integer	:= 21;
constant st_st_ad_end_wait			: integer	:= 22;
constant st_st_ad_end_wait0			: integer	:= 23;
constant st_ad_error_wait			: integer	:= 24;
constant st_ad_error_wait0			: integer	:= 25;
constant st_read_adh_endx			: integer	:= 26;
constant st_read_adl_endx			: integer	:= 27;


signal t_sig_adc,t_sig_adc_end : std_logic;
signal ad_charge_time : integer range 0 to 1500;
signal ad_delay_time : integer range 0 to 1000;
signal can_ad : std_logic;
signal t_setup_adc_state : std_logic;
signal t_t_sig_adc_end_tag : std_logic;
---------sig_ad data---------------------------
constant read_data_time 		: integer := 800; 
constant distance_time 			: integer := 900; 
constant delay_time 			: integer := 300; 
constant charge_time 			: integer := 1400;
constant start_ad_time 			: integer := 200;
constant change_wait_time 		: integer := 800;
constant read_data_up_wait		: integer := 400;

 
begin


setup_sig_adc : process(rst,t_sig_adc_end,can_adc)
begin
	if rst='0' or t_sig_adc_end = '1' then
		t_sig_adc <= '0';
	else
		if rising_edge(can_adc)	then
			 t_sig_adc <= '1';
		end if;
	end if;		
end process;


gen_t_sig_adc_end_tag : process(rst,t_sig_adc_end,eoc_state)
begin
	if rst='0' or t_sig_adc_end='1' then
		t_t_sig_adc_end_tag <= '0';
	else
		if rising_edge(eoc_state) then			
			t_t_sig_adc_end_tag <= '1';
		end if;
	end if;		
end process;


process(rst,p12mhz,can_ad,t_sig_adc)
begin
	if rst='0' then
		st <= st_idle;
		t_sig_adc_end <= '0';
		rd_adl <= '1';	
		rd_adh <= '1';
		ad_charge_time <= 0;
		ad_delay_time <= 0;
		adc_state <= x"00";
		t_setup_adc_state <= '1';
	else
		if rising_edge(p12mhz) then	
			case st is
				when st_idle =>
					rd_adl <= '1';	
					rd_adh <= '1';	
					ad_charge_time <= 0;
					ad_delay_time <= 0;
					t_sig_adc_end <= '0';
					t_setup_adc_state <= '1'; 
					if t_sig_adc='1' then
						adc_state <= x"00";
						st <= st_charge;
					else
						st <= st_idle;
					end if;
				when st_charge =>
					if ad_charge_time < charge_time then
						ad_charge_time	<= ad_charge_time + 1;
						st <= st_charge;
					else
						st <= st_start_ad;	
						ad_charge_time <= 0;
					end if;	
				when st_start_ad =>
					st <= st_ad_wait;
					start_ad <= '1';
					ad_delay_time <= 0;
				when st_ad_wait =>
					if ad_delay_time < start_ad_time then
						ad_delay_time <= ad_delay_time + 1; 
						start_ad <= '1';
						st <= st_ad_wait;
					else
						ad_delay_time <= 0;
						start_ad <= '0';
						st <= st_ad_wait0;
					end if;	
				when st_ad_wait0 =>
					if t_t_sig_adc_end_tag='0' and ad_delay_time < change_wait_time then
						ad_delay_time <= ad_delay_time + 1;
						st <= st_ad_wait0;
					elsif t_t_sig_adc_end_tag='1' then 
						ad_delay_time <= 0;
						st <= st_read_adl;
					else
						st <= st_ad_error;
						ad_delay_time <= 0;
					end if;		
				when st_read_adl =>
					rd_adl <= '0';	
					st <= st_read_adl_wait;
				when st_read_adl_wait =>
					if ad_delay_time < read_data_time then
						st <= st_read_adl_wait;
						ad_delay_time <= ad_delay_time + 1;
					else
						ad_delay_time <= 0; 
						st <= st_read_adl_wait0;
					end if;	
				when st_read_adl_wait0 =>
					ad_data(7 downto 0) <= sd(7 downto 0);
					ad_delay_time <= 0;
					st <= st_read_adl_endx;
				when st_read_adl_endx =>
					if ad_delay_time < read_data_up_wait then
						ad_delay_time <= ad_delay_time + 1;
						st <= st_read_adl_endx;
					else
						ad_delay_time <= 0;
						st <= st_read_adl_end;
					end if;	
				when st_read_adl_end =>
					rd_adl <= '1';
					ad_delay_time <= 0;	
					st <= st_read_adl_end_wait;
				when st_read_adl_end_wait =>
					if ad_delay_time < distance_time then	
						ad_delay_time <= ad_delay_time + 1;
						st <= st_read_adl_end_wait;
					else
						st <= st_read_adh;
						ad_delay_time <= 0;	
					end if;	
				when st_read_adh =>
					st <= st_read_adh_wait;
					rd_adh <= '0';
				when st_read_adh_wait =>
					if ad_delay_time < read_data_time then
						ad_delay_time <= ad_delay_time + 1;
						st <= st_read_adh_wait;
					else
						ad_delay_time <= 0;
						st <= st_read_adh_wait0;
					end if;	
				when st_read_adh_wait0 =>
					ad_data(11 downto 8) <= sd(3 downto 0);
					ad_delay_time <= 0;
					st <= st_read_adh_endx;
				when st_read_adh_endx =>
					if ad_delay_time < read_data_up_wait then
						ad_delay_time <= ad_delay_time + 1;
						st <= st_read_adh_endx;
					else
						ad_delay_time <= 0;	
						st <= st_read_adh_end ;
					end if;		
				when st_read_adh_end =>
					rd_adh <= '1';
					ad_delay_time <= 0;
					st <= st_read_adh_end_wait;
				when st_read_adh_end_wait =>
					if ad_delay_time < 300 then
						ad_delay_time <= ad_delay_time + 1;
						st <= st_read_adh_end_wait;
					else
						st <= st_ad_end;
					end if;	
				when st_ad_end =>--
					t_setup_adc_state <= '0';
					adc_state <= x"80";
					st <= st_st_ad_end_wait;
				when st_st_ad_end_wait =>
					st <= st_st_ad_end_wait0;
				when st_st_ad_end_wait0 =>
					t_setup_adc_state <= '1';		
					st <= st_idle;
					t_sig_adc_end <= '1';	
				when st_ad_error =>
					adc_state <= x"03"; --转换超时
					t_setup_adc_state <= '0';
					st <= st_ad_error_wait;
				when st_ad_error_wait =>
					st <= st_ad_error_wait0;
				when st_ad_error_wait0 =>
					t_setup_adc_state <= '1';		
					t_sig_adc_end <= '1';
					st <= st_idle;
				when others =>	
					st <= st_idle;
			end case;
		end if;
	end if;								

end process;

end architecture;		
		
		

⌨️ 快捷键说明

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