📄 ledwater.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 + -