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

📄 ledwater.vhd

📁 VHDL通信程序VHDL通信程序VHDL通信程序VHDL通信程序VHDL通信程序
💻 VHD
字号:
------------------------------------------------------------------------
--程序说明:
--8个数据位,8个地址位;(其中地址位只用了低4位)
--三组输入(每组8位,一组为检测输入,两组组为AD器件);
--输出控制(每组8位,三组为控制固态继电器输出,一组为AD器件)
--每位具体定义见通讯协议
-------------------------------------------------------------------------
--操作过程举例:(空闲时key(3 DOWNTO 0) 赋值为 1111;data赋值为 11111111) 
--1.上电复位命令
--data赋值为 11111111;key(3 DOWNTO 0) 赋值为 1111;
--写复位命令:将data赋值为 01010101;将key(3 DOWNTO 0) 赋值为 1010;
--           然后key(3 DOWNTO 0) 赋值为 1111;data赋值为 11111111;

--2.检测输入
--将key(3 DOWNTO 0) 赋值为 1110,然后直接读取data;得到检测状态(如:内桶水位探针、液位传感器等) 
--最后将key(3 DOWNTO 0) 赋值为 1111;data赋值为 11111111;
--其他两组操作相同

--3.输出控制(打开水阀1)
--(data赋值为 11111111;key(3 DOWNTO 0) 赋值为 1111;)
--写使能命令:将data赋值为 10101010;将key(3 DOWNTO 0) 赋值为 0101;
--           然后key(3 DOWNTO 0) 赋值为 1111;data赋值为 11111111;
--写输出控制命令:将data赋值为 11111110;将key(3 DOWNTO 0) 赋值为 1100;此时打开水阀1;
--               然后key(3 DOWNTO 0) 赋值为 1111;data赋值为 11111111;
--写不使能命令:将data赋值为 01010101;将key(3 DOWNTO 0) 赋值为 0101; 
--             然后key(3 DOWNTO 0) 赋值为 1111;data赋值为 11111111;
--其他两组操作相同

--4.AD输出控制(置MAX1247位5 DIN为0)
--(data赋值为 11111111;key(3 DOWNTO 0) 赋值为 1111;)
--写输出控制命令:将data赋值为 01111111;将key(3 DOWNTO 0) 赋值为 1001;
--               然后key(3 DOWNTO 0) 赋值为 1111;data赋值为 11111111;
--其他位操作相同

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ledwater IS
   PORT (
        datain0		: IN std_logic_vector(7 DOWNTO 0);    --检测输入
		datain1		: IN std_logic_vector(7 DOWNTO 1);    --AD器件输入
		
		key			: IN std_logic_vector(7 downto 0);    --地址
		data		: INOUT std_logic_vector(7 DOWNTO 0); --数据
		sdata		: INOUT std_logic;                    --AD7710 sdata
		contrl		: OUT std_logic;                      --4245集成电路方向控制
		dataout0    : OUT std_logic_vector(7 DOWNTO 0);   --第一组输出
		dataout1	: OUT std_logic_vector(7 DOWNTO 0);   --第二组输出
		dataout2	: OUT std_logic_vector(7 DOWNTO 0);   --第三组输出
		dataout3	: OUT std_logic_vector(7 DOWNTO 0));  --第四组AD器件输出   
END ledwater;

ARCHITECTURE arch OF ledwater IS
   SIGNAL CONTRL_T : std_logic;                           --用于4245集成电路方向控制
   SIGNAL CONTRL_T0 : std_logic;                          --用于4245集成电路方向控制

   SIGNAL data_Temp : std_logic_vector(7 DOWNTO 0);       --用于数据缓存

   SIGNAL DIN0:  std_logic_vector(7 DOWNTO 0);            --用于检测输入缓存 
   
   SIGNAL DIN1:  std_logic_vector(7 DOWNTO 0);            --用于AD器件输入缓存

   SIGNAL DIN2:  std_logic_vector(7 DOWNTO 0);            --用于AD器件输入缓存
   
   SIGNAL DOUT0:  std_logic_vector(7 DOWNTO 0);           --用于第一组输出

   SIGNAL DOUT1:  std_logic_vector(7 DOWNTO 0);           --用于第二组输出

   SIGNAL DOUT2:  std_logic_vector(7 DOWNTO 0);           --用于第三组输出

   SIGNAL DOUT3:  std_logic_vector(7 DOWNTO 0);           --用于第四组AD器件输出

   SIGNAL DBB :  std_logic:='1';                          --用于复位

   SIGNAL DBB0 :  std_logic:='0';                         --用于中转水箱保护
   SIGNAL DBB1 :  std_logic:='0';                         --用于中转水箱保护

   SIGNAL WRITE_EN :  std_logic:='1';                     --用于使能

BEGIN

DIN0 <= datain0 WHEN (key(3 DOWNTO 0) ="1110") ELSE "ZZZZZZZZ";
--第一组输入检测进缓存(信息为内桶水位探针、液位传感器等) 
DIN1(7 DOWNTO 1) <= datain1(7 DOWNTO 1) WHEN (key(3 DOWNTO 0) ="1101") ELSE "ZZZZZZZ";
DIN1(0) <= '1' ;
--第二组输入进缓存(信息为AD7710位2 DRDY、MAX1247位1 SSTRB等)

data <= DIN0 WHEN (key(3 DOWNTO 0) ="1110") ELSE "ZZZZZZZZ";
--第一组输入缓存进端口(信息为内桶水位探针、液位传感器等) 
data <= DIN1 WHEN (key(3 DOWNTO 0) ="1101") ELSE "ZZZZZZZZ";
--第二组输入缓存进端口(信息为AD7710位2 DRDY、MAX1247位1 SSTRB等)

contrl <= (CONTRL_T or CONTRL_T0);
--集成电路LVCA4245方向控制引脚
data_Temp <= data; 
--端口数据进缓存
-----------------------------
process(key(3 DOWNTO 0))--复位命令  
begin
IF(key(3 DOWNTO 0) = "1010")  THEN
  	IF(data(7 DOWNTO 0) = "01010101")THEN
	DBB <= '0';	
    end if;    
	IF(data(7 DOWNTO 0) = "10101010")THEN
    DBB <= '1';
    end if;
end if;
end process;

process(key(3 DOWNTO 0))--使能命令  
begin
IF(key(3 DOWNTO 0) = "0101")THEN
    IF(data(7 DOWNTO 0) = "10101010")THEN
    WRITE_EN <= '0';
    end if;
    IF(data(7 DOWNTO 0) = "01010101")THEN
    WRITE_EN <= '1';
    end if;
end if;
end process;
-----------------------------
process(datain0(1),datain0(4))--用于中转水箱上下位置保护
begin
if (DBB = '0') then
	DBB0 <= DBB1;
	DBB1 <= (not datain0(1) )or ( datain0(4) and DBB0);
end if;

if ((DBB = '1')or (DOUT0(6)='1')) then 
	DBB1 <= '0';
	DBB0 <= '0';
end if;
end process;
-----------------------------
process(key(1 DOWNTO 0))--第一组输出
begin
IF (WRITE_EN='0')THEN

	IF ((key(3 DOWNTO 0) = "1100")and(DBB ='0')) THEN
		DOUT0<= not data_Temp;
	end if;
end if;

if (DBB ='1') then
	DOUT0 <="00000000";		
end if;
end process;


process(key(3 DOWNTO 2))--第二组输出
begin
IF (WRITE_EN='0')THEN

	IF ((key(3 DOWNTO 0) = "0011")and(DBB ='0')) THEN
		DOUT1(7 DOWNTO 6)<= not data_Temp(7 DOWNTO 6);
		DOUT1(5 DOWNTO 4)<= data_Temp(5 DOWNTO 4);
		DOUT1(3 DOWNTO 0)<= not data_Temp(3 DOWNTO 0);
	end if;
end if;

if (DBB ='1') then
	DOUT1 <="00110000";	
end if;
end process;


process(key(3),key(0))--第三组输出
begin
IF (WRITE_EN='0')THEN

	IF ( (key(3 DOWNTO 0) = "0110")and(DBB ='0')) THEN
		DOUT2<= not data_Temp;
	end if;
end if;

if (DBB ='1') then
	DOUT2 <="00000000";	
end if;
end process;


process(key(2),key(1),data_Temp)--第四组输出AD器件
begin
IF (key(3 DOWNTO 0) = "1001") THEN
	DOUT3<=  data_Temp;
end if;

end process;

--第一组输出
dataout0(7) <= DOUT0(7);
dataout0(6) <= (DBB1 or DOUT0(6))and datain0(4);            --受中转水箱上下位置保护
dataout0(5 DOWNTO 4) <= DOUT0(5 DOWNTO 4);
dataout0(3) <= DOUT0(3)and datain0(1);--DT4                 --受中转水箱上位置保护
dataout0(2) <= DOUT0(2)and datain0(0);--DT3                 --受水位探针位置保护
dataout0(1) <= DOUT0(1)and datain0(0);--DT2                 --受水位探针位置保护
dataout0(0) <= DOUT0(0) ;--DT1


--第二组输出
dataout1(7 DOWNTO 6) <= DOUT1(7 DOWNTO 6);
dataout1(4 DOWNTO 0) <= DOUT1(4 DOWNTO 0);
dataout1(5) <= DOUT1(5)or(not datain0(0));--Mot down       --受水位探针位置保护


--第三组输出
dataout2 <= DOUT2;


process(key(2),key(1),DOUT3,DBB)--第四组输出AD器件
begin
IF ((key(3 DOWNTO 0) = "1001")and(DBB ='0')) THEN
	dataout3(7 DOWNTO 3) <= DOUT3(7 DOWNTO 3);
	dataout3(1 DOWNTO 0) <= DOUT3(1 DOWNTO 0);
	CONTRL_T <= DOUT3(1);

	if(DOUT3(1)='0') then  --TFS
		sdata <= DOUT3(2);
	else
		sdata <= 'Z';
	end if;
end if;

if (DBB ='1') then
	dataout3 <="00000000";	
end if;

end process;

DIN2(0) <= sdata ; --WHEN ((key(3 DOWNTO 0) ="1011")and (DOUT3(1)='1')) ELSE 'Z';--TFS
DIN2(7 DOWNTO 1) <= "1111111" ;
--第三组输入进缓存(信息为AD7710位1 SDATA1)
data(7 DOWNTO 0) <= DIN2(7 DOWNTO 0) WHEN ((key(3 DOWNTO 0) ="1011")and (DOUT3(1)='1')) ELSE "ZZZZZZZZ";--TFS
--第三组输入缓存进端口(信息为AD7710位1 SDATA1)

process(key(3 DOWNTO 0))--集成电路LVCA4245方向控制引脚处理
begin
IF (key(3 DOWNTO 0) = "1101") THEN
	CONTRL_T0<='1';
else
	CONTRL_T0<='0';
end if;
end process;

END arch;

⌨️ 快捷键说明

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