?? ledwater.vhd
字號(hào):
------------------------------------------------------------------------
--程序說明:
--8個(gè)數(shù)據(jù)位,8個(gè)地址位;(其中地址位只用了低4位)
--三組輸入(每組8位,一組為檢測(cè)輸入,兩組組為AD器件);
--輸出控制(每組8位,三組為控制固態(tài)繼電器輸出,一組為AD器件)
--每位具體定義見通訊協(xié)議
-------------------------------------------------------------------------
--操作過程舉例:(空閑時(shí)key(3 DOWNTO 0) 賦值為 1111;data賦值為 11111111)
--1.上電復(fù)位命令
--data賦值為 11111111;key(3 DOWNTO 0) 賦值為 1111;
--寫復(fù)位命令:將data賦值為 01010101;將key(3 DOWNTO 0) 賦值為 1010;
-- 然后key(3 DOWNTO 0) 賦值為 1111;data賦值為 11111111;
--2.檢測(cè)輸入
--將key(3 DOWNTO 0) 賦值為 1110,然后直接讀取data;得到檢測(cè)狀態(tài)(如:內(nèi)桶水位探針、液位傳感器等)
--最后將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;此時(shí)打開水閥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); --檢測(cè)輸入
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); --數(shù)據(jù)
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); --用于數(shù)據(jù)緩存
SIGNAL DIN0: std_logic_vector(7 DOWNTO 0); --用于檢測(cè)輸入緩存
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'; --用于復(fù)位
SIGNAL DBB0 : std_logic:='0'; --用于中轉(zhuǎn)水箱保護(hù)
SIGNAL DBB1 : std_logic:='0'; --用于中轉(zhuǎn)水箱保護(hù)
SIGNAL WRITE_EN : std_logic:='1'; --用于使能
BEGIN
DIN0 <= datain0 WHEN (key(3 DOWNTO 0) ="1110") ELSE "ZZZZZZZZ";
--第一組輸入檢測(cè)進(jìn)緩存(信息為內(nèi)桶水位探針、液位傳感器等)
DIN1(7 DOWNTO 1) <= datain1(7 DOWNTO 1) WHEN (key(3 DOWNTO 0) ="1101") ELSE "ZZZZZZZ";
DIN1(0) <= '1' ;
--第二組輸入進(jìn)緩存(信息為AD7710位2 DRDY、MAX1247位1 SSTRB等)
data <= DIN0 WHEN (key(3 DOWNTO 0) ="1110") ELSE "ZZZZZZZZ";
--第一組輸入緩存進(jìn)端口(信息為內(nèi)桶水位探針、液位傳感器等)
data <= DIN1 WHEN (key(3 DOWNTO 0) ="1101") ELSE "ZZZZZZZZ";
--第二組輸入緩存進(jìn)端口(信息為AD7710位2 DRDY、MAX1247位1 SSTRB等)
contrl <= (CONTRL_T or CONTRL_T0);
--集成電路LVCA4245方向控制引腳
data_Temp <= data;
--端口數(shù)據(jù)進(jìn)緩存
-----------------------------
process(key(3 DOWNTO 0))--復(fù)位命令
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))--用于中轉(zhuǎn)水箱上下位置保護(hù)
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); --受中轉(zhuǎn)水箱上下位置保護(hù)
dataout0(5 DOWNTO 4) <= DOUT0(5 DOWNTO 4);
dataout0(3) <= DOUT0(3)and datain0(1);--DT4 --受中轉(zhuǎn)水箱上位置保護(hù)
dataout0(2) <= DOUT0(2)and datain0(0);--DT3 --受水位探針位置保護(hù)
dataout0(1) <= DOUT0(1)and datain0(0);--DT2 --受水位探針位置保護(hù)
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 --受水位探針位置保護(hù)
--第三組輸出
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" ;
--第三組輸入進(jìn)緩存(信息為AD7710位1 SDATA1)
data(7 DOWNTO 0) <= DIN2(7 DOWNTO 0) WHEN ((key(3 DOWNTO 0) ="1011")and (DOUT3(1)='1')) ELSE "ZZZZZZZZ";--TFS
--第三組輸入緩存進(jìn)端口(信息為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;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -