L
lgeorge123
Guest
Jeg skriver en VHDL av frekvens møte med i2c kommunikasjon med LDO.Alle sammen Jeg har 8 IO-port, men etter kompilere bare 6 er funnet, så hva er galt med koden min?Jeg bruker Xilinx XL9572 CPLD.
ibrary IEEE;
bruk ieee.std_logic_1164.all;
bruk ieee.std_logic_unsigned.all;
enhet fcounter5 er
generisk (
- WR: std_logic: = '0 ';
DADDR: std_logic_vector (6 downto 0): = "0010001"; - 11t (22h) enhet adresse
Addr: std_logic_vector (7 downto 0): = "00000000" - 00t sub-adresse
);
port (
utløse: i STD_LOGIC; - start teller
opptatt: out STD_LOGIC; - status
klokke: i STD_LOGIC; - master klokke 12.8MHz
cclk: i STD_LOGIC; - counter clock input
sigout: out STD_LOGIC;
- RST: in std_logic;
SCL: in std_logic;
SDA: Inout std_logic;
sigin: i STD_LOGIC - signalinngang
);
end;
arkitektur RTL av fcounter5 er
-----------------------------------
- Definer komponent BCD counter
-----------------------------------
komponent COUNT10
port (
CLK, RESET: in STD_LOGIC;
CYIN: i STD_LOGIC;
Q: out STD_LOGIC_VECTOR (3 downto 0);
CYOUT: out STD_LOGIC
);
end component;------------------------------------
- Definer interne signalet
------------------------------------
signal dgt0: STD_LOGIC_VECTOR (3 downto 0); - 1st BCD siffer counter output
signal dgt1: STD_LOGIC_VECTOR (3 downto 0); - 2nd BCD siffer counter output
signal dgt2: STD_LOGIC_VECTOR (3 downto 0); - 3rd BCD siffer counter output
signal dgt3: STD_LOGIC_VECTOR (3 downto 0); - 4th BCD siffer counter output
signal dgt4: STD_LOGIC_VECTOR (3 downto 0); - 5th BCD siffer counter output
signal dgt5: STD_LOGIC_VECTOR (3 downto 0); - 6th BCD siffer counter output
signal dgt6: STD_LOGIC_VECTOR (3 downto 0); - 7th BCD siffer counter output
signal dgt7: STD_LOGIC_VECTOR (3 downto 0); - 8th BCD siffer counter output
signal co0: STD_LOGIC; - 1st overflow
signal co1: STD_LOGIC; - 2nd overflow
signal CO2: STD_LOGIC; - 3rd overflow
signal CO3: STD_LOGIC; - 4th overflow
signal co4: STD_LOGIC; - 5th overflow
signal co5: STD_LOGIC; - 6th overflow
signal co6: STD_LOGIC; - 7th overflow
signal gate: STD_LOGIC; - intern gate
signal gatecounter: STD_LOGIC_VECTOR (23 downto 0); - gate counter
signal intbusy: STD_LOGIC; - intern opptatt flag
signal shiftout: std_logic_vector (3 downto 0);
signal SDA_IN, starte, stoppe, ACTIVE, ACK: std_logic;
signal SHIFTREG: std_logic_vector (8 downto 0);
signal bcdout: STD_LOGIC; - BCD data output
signal out_shift_count: integer range 0-7;
signal ok: boolean: = false;
signal TILSTAND: std_logic_vector (1 downto 0); - 00 - iddle stat
signal dgtslct: STD_LOGIC_VECTOR (2 downto 0): = "000"; - siffer velge
begynne
----------------------------------------
- Starte tidtakingen klokke
-----------------------------------------
Prosessen (klokke, avtrekker, intbusy) begynne
if (trigger = '1 ') then
gatecounter <= "000000000000000000000000"; - starter fra null
elsif (klokke 'hendelse og klokke = '1' and intbusy = '0 ') og - på 12.8MHz
gatecounter <= gatecounter 1; - count gate tid
end if;
end process;
------------------------------------------
- Generere gate puls og opptatt status
------------------------------------------
Prosessen (utløse, gatecounter) begynne
if (trigger = '1 ') then
gate <= '0 ';
intbusy <= '0 ';
elsif (gatecounter = 1) then
gate <= '1 ';
elsif (gatecounter = 12800000) så
gate <= '0 '; - lukk porten på 1sec
intbusy <= '1 '; - restarte opptatt
end if;
end process;
opptatt <= intbusy; - status for datamaskinen
----------------------------------------
- Gate inngang og utgang
----------------------------------------
Prosessen (gate, sigin) begynne
if (gate = '1 ') then - gate inngang puls
sigout <= sigin;
ellers
sigout <= '0 ';
end if;
end process;
-----------------------------------------
- Velg BCD siffer output
-----------------------------------------
Prosessen (intbusy, dgtslct, dgt0, dgt1, dgt2, dgt3, dgt4, dgt5, dgt6, dgt7) begynner - BCD selector
if (intbusy = '1 ') then
case dgtslct (2 downto 0) er
når "111" => shiftout <= dgt7 (3 downto 0); - velg 1ste siffer ved 0
når "110" => shiftout <= dgt6 (3 downto 0);
når "101" => shiftout <= dgt5 (3 downto 0);
når "100" => shiftout <= dgt4 (3 downto 0);
når "011" => shiftout <= dgt3 (3 downto 0);
når "010" => shiftout <= dgt2 (3 downto 0);
når "001" => shiftout <= dgt1 (3 downto 0);
når "000" => shiftout <= dgt0 (3 downto 0);
når andre => shiftout <= "1111"; - Svaret F med ujevne velger
end case;
end if;
end process;- Prosessen (SDA_IN, START_RST)
- Begin
- - If (utløse = '1 ') then
- START <= '0 ';
- Elsif (SDA_IN'event og SDA_IN = '0 ') then
- START <= SCL;
- End if;
- End process;
- Prosessen (SCL, START, STOPP)
- Begin
- If (SCL'event og SCL = '0 ') then
- START_RST <= start;
- End if;
- End process;
-------------------------------------------------- ----------------------------
- Start tilstand deteksjon, metode 2 (enkel - men uken mot støy)
Prosessen (utløse, SCL, SDA_IN)
begynne
hvis avtrekkeren = '1 'eller SCL = '0' da
START <= '0 ';
elsif SCL = '1 'and SDA_IN = '0' og SDA_IN'event deretter
START <= '1 ';
end if;
end process;
-------------------------------------------------- ----------------------------
- Stop tilstand detection
Prosessen (utløse, SCL, SDA_IN, Start)
begynne
hvis avtrekkeren = '1 'eller SCL = '0' eller START = '1 'da
STOP <= '0 ';
elsif SCL = '1 'and SDA_IN = '1' and SDA_IN'event deretter
STOP <= '1 ';
end if;
end process;
-------------------------------------------------- ----------------------------
- "Aktiv kommunikasjon" signal
Prosessen (utløse, STOP, Start)
begynne
hvis avtrekkeren = '1 'eller STOP = '1' da - eller (SHIFTREG = "000000001" og ACK = '0 'og SCL = '1' and SCL'event)
AKTIVE <= '0 ';
elsif START = '0 'og START'event deretter
AKTIVE <= '1 ';
end if;
end process;
-------------------------------------------------- ----------------------------
- RX data shifter
Prosessen (utløse, ACTIVE, ACK, SCL, SDA_IN)
begynne
hvis avtrekkeren = '1 'eller aktiv = '0' da
SHIFTREG <= "000000001";
elsif SCL'event og SCL = '1 'da
hvis ACK = '1 'da
SHIFTREG <= "000000001";
ellers
SHIFTREG (8 downto 0) <= SHIFTREG (7 downto 0) & SDA_IN;
end if;
end if;
end process;
-------------------------------------------------- ----------------------------
- ACK
Prosessen (utløse, SCL, SHIFTREG, STATE, aktiv)
begynne
hvis avtrekkeren = '1 'eller aktiv = '0' da
ACK <= '0 ';
STATE <= "00";
elsif SCL = '0 'og SCL'event deretter
hvis SHIFTREG (= '1 'og stat / = "11" da
STAT <= STAT 1;
if ((STAT = "00" og SHIFTREG (7 downto 0) = DADDR) eller (STAT = "01" og SHIFTREG (7 downto 0) = addr) eller STAT = "10") så
ACK <= '1 ';
ok <= true;
ellers
STATE <= "11";
ok <= false;
end if;
ellers
ACK <= '0 ';
end if;
end if;
end process;
-------------------------------------------------- ----------------------------
- I2C data skrive
Prosessen (SCL, out_shift_count, ok)
begynne
if (SCL = '1 'og SCL'event) så
hvis out_shift_count = 7 klikk
out_shift_count <= 0;
hvis dgtslct = "111" then
dgtslct <= "000";
elsif ok da
out_shift_count <= out_shift_count 1;
bcdout <= shiftout (3);
shiftout <= shiftout (2 downto 0) & '0 ';
dgtslct <= dgtslct 1; - siffer velge
end if;
end if;
end if;
end process;
SDA <= bcdout;
-------------------------------------------------- ------------------------------------------------------------------------------ ----------------------------
----------------------------------------
- 8 sifret BCD counter
----------------------------------------
DIGIT0: COUNT10 port map (cclk, avtrekker, '1 ', dgt0, co0);
DIGIT1: COUNT10 port map (cclk, avtrekker, co0, dgt1, co1);
DIGIT2: COUNT10 port map (cclk, avtrekker, co1, dgt2, CO2);
DIGIT3: COUNT10 port map (cclk, avtrekker, CO2, dgt3, CO3);
DIGIT4: COUNT10 port map (cclk, avtrekker, CO3, dgt4, co4);
DIGIT5: COUNT10 port map (cclk, avtrekker, co4, dgt5, co5);
DIGIT6: COUNT10 port map (cclk, avtrekker, co5, dgt6, co6);
DIGIT7: COUNT10 port map (cclk, avtrekker, co6, dgt7, åpen);
end RTL;
- Nedenfor er count10 kodenlibrary IEEE;
bruk ieee.std_logic_1164.all;
bruk ieee.std_logic_unsigned.all;
enhet count10 er
port (
CLK, RESET: in std_logic;
CYIN: in std_logic;
Q: out std_logic_vector (3 downto 0);
CYOUT: out std_logic
);
end;
arkitektur RTL av count10 er
signal TQ: std_logic_vector (3 downto 0);
begynne
Prosessen (CLK, RESET, CYIN) begynne
if (RESET = '1 ') then
TQ <= "0000";
elsif (CLK'event og CLK = '1 'and CYIN = '1') then
if (TQ = "1001") så
TQ <= "0000";
ellers
TQ <= TQ '1 ';
end if;
end if;
end process;
--
Prosessen (TQ, CYIN) begynne
if (TQ = "1001" og CYIN = '1 ') then
CYOUT <= '1 ';
ellers
CYOUT <= '0 ';
end if;
end process;
--
Q <= TQ;
end RTL;
Sist endret av lgeorge123 den 07. Nov 2006 11:25, endret 1 gang totalt
ibrary IEEE;
bruk ieee.std_logic_1164.all;
bruk ieee.std_logic_unsigned.all;
enhet fcounter5 er
generisk (
- WR: std_logic: = '0 ';
DADDR: std_logic_vector (6 downto 0): = "0010001"; - 11t (22h) enhet adresse
Addr: std_logic_vector (7 downto 0): = "00000000" - 00t sub-adresse
);
port (
utløse: i STD_LOGIC; - start teller
opptatt: out STD_LOGIC; - status
klokke: i STD_LOGIC; - master klokke 12.8MHz
cclk: i STD_LOGIC; - counter clock input
sigout: out STD_LOGIC;
- RST: in std_logic;
SCL: in std_logic;
SDA: Inout std_logic;
sigin: i STD_LOGIC - signalinngang
);
end;
arkitektur RTL av fcounter5 er
-----------------------------------
- Definer komponent BCD counter
-----------------------------------
komponent COUNT10
port (
CLK, RESET: in STD_LOGIC;
CYIN: i STD_LOGIC;
Q: out STD_LOGIC_VECTOR (3 downto 0);
CYOUT: out STD_LOGIC
);
end component;------------------------------------
- Definer interne signalet
------------------------------------
signal dgt0: STD_LOGIC_VECTOR (3 downto 0); - 1st BCD siffer counter output
signal dgt1: STD_LOGIC_VECTOR (3 downto 0); - 2nd BCD siffer counter output
signal dgt2: STD_LOGIC_VECTOR (3 downto 0); - 3rd BCD siffer counter output
signal dgt3: STD_LOGIC_VECTOR (3 downto 0); - 4th BCD siffer counter output
signal dgt4: STD_LOGIC_VECTOR (3 downto 0); - 5th BCD siffer counter output
signal dgt5: STD_LOGIC_VECTOR (3 downto 0); - 6th BCD siffer counter output
signal dgt6: STD_LOGIC_VECTOR (3 downto 0); - 7th BCD siffer counter output
signal dgt7: STD_LOGIC_VECTOR (3 downto 0); - 8th BCD siffer counter output
signal co0: STD_LOGIC; - 1st overflow
signal co1: STD_LOGIC; - 2nd overflow
signal CO2: STD_LOGIC; - 3rd overflow
signal CO3: STD_LOGIC; - 4th overflow
signal co4: STD_LOGIC; - 5th overflow
signal co5: STD_LOGIC; - 6th overflow
signal co6: STD_LOGIC; - 7th overflow
signal gate: STD_LOGIC; - intern gate
signal gatecounter: STD_LOGIC_VECTOR (23 downto 0); - gate counter
signal intbusy: STD_LOGIC; - intern opptatt flag
signal shiftout: std_logic_vector (3 downto 0);
signal SDA_IN, starte, stoppe, ACTIVE, ACK: std_logic;
signal SHIFTREG: std_logic_vector (8 downto 0);
signal bcdout: STD_LOGIC; - BCD data output
signal out_shift_count: integer range 0-7;
signal ok: boolean: = false;
signal TILSTAND: std_logic_vector (1 downto 0); - 00 - iddle stat
signal dgtslct: STD_LOGIC_VECTOR (2 downto 0): = "000"; - siffer velge
begynne
----------------------------------------
- Starte tidtakingen klokke
-----------------------------------------
Prosessen (klokke, avtrekker, intbusy) begynne
if (trigger = '1 ') then
gatecounter <= "000000000000000000000000"; - starter fra null
elsif (klokke 'hendelse og klokke = '1' and intbusy = '0 ') og - på 12.8MHz
gatecounter <= gatecounter 1; - count gate tid
end if;
end process;
------------------------------------------
- Generere gate puls og opptatt status
------------------------------------------
Prosessen (utløse, gatecounter) begynne
if (trigger = '1 ') then
gate <= '0 ';
intbusy <= '0 ';
elsif (gatecounter = 1) then
gate <= '1 ';
elsif (gatecounter = 12800000) så
gate <= '0 '; - lukk porten på 1sec
intbusy <= '1 '; - restarte opptatt
end if;
end process;
opptatt <= intbusy; - status for datamaskinen
----------------------------------------
- Gate inngang og utgang
----------------------------------------
Prosessen (gate, sigin) begynne
if (gate = '1 ') then - gate inngang puls
sigout <= sigin;
ellers
sigout <= '0 ';
end if;
end process;
-----------------------------------------
- Velg BCD siffer output
-----------------------------------------
Prosessen (intbusy, dgtslct, dgt0, dgt1, dgt2, dgt3, dgt4, dgt5, dgt6, dgt7) begynner - BCD selector
if (intbusy = '1 ') then
case dgtslct (2 downto 0) er
når "111" => shiftout <= dgt7 (3 downto 0); - velg 1ste siffer ved 0
når "110" => shiftout <= dgt6 (3 downto 0);
når "101" => shiftout <= dgt5 (3 downto 0);
når "100" => shiftout <= dgt4 (3 downto 0);
når "011" => shiftout <= dgt3 (3 downto 0);
når "010" => shiftout <= dgt2 (3 downto 0);
når "001" => shiftout <= dgt1 (3 downto 0);
når "000" => shiftout <= dgt0 (3 downto 0);
når andre => shiftout <= "1111"; - Svaret F med ujevne velger
end case;
end if;
end process;- Prosessen (SDA_IN, START_RST)
- Begin
- - If (utløse = '1 ') then
- START <= '0 ';
- Elsif (SDA_IN'event og SDA_IN = '0 ') then
- START <= SCL;
- End if;
- End process;
- Prosessen (SCL, START, STOPP)
- Begin
- If (SCL'event og SCL = '0 ') then
- START_RST <= start;
- End if;
- End process;
-------------------------------------------------- ----------------------------
- Start tilstand deteksjon, metode 2 (enkel - men uken mot støy)
Prosessen (utløse, SCL, SDA_IN)
begynne
hvis avtrekkeren = '1 'eller SCL = '0' da
START <= '0 ';
elsif SCL = '1 'and SDA_IN = '0' og SDA_IN'event deretter
START <= '1 ';
end if;
end process;
-------------------------------------------------- ----------------------------
- Stop tilstand detection
Prosessen (utløse, SCL, SDA_IN, Start)
begynne
hvis avtrekkeren = '1 'eller SCL = '0' eller START = '1 'da
STOP <= '0 ';
elsif SCL = '1 'and SDA_IN = '1' and SDA_IN'event deretter
STOP <= '1 ';
end if;
end process;
-------------------------------------------------- ----------------------------
- "Aktiv kommunikasjon" signal
Prosessen (utløse, STOP, Start)
begynne
hvis avtrekkeren = '1 'eller STOP = '1' da - eller (SHIFTREG = "000000001" og ACK = '0 'og SCL = '1' and SCL'event)
AKTIVE <= '0 ';
elsif START = '0 'og START'event deretter
AKTIVE <= '1 ';
end if;
end process;
-------------------------------------------------- ----------------------------
- RX data shifter
Prosessen (utløse, ACTIVE, ACK, SCL, SDA_IN)
begynne
hvis avtrekkeren = '1 'eller aktiv = '0' da
SHIFTREG <= "000000001";
elsif SCL'event og SCL = '1 'da
hvis ACK = '1 'da
SHIFTREG <= "000000001";
ellers
SHIFTREG (8 downto 0) <= SHIFTREG (7 downto 0) & SDA_IN;
end if;
end if;
end process;
-------------------------------------------------- ----------------------------
- ACK
Prosessen (utløse, SCL, SHIFTREG, STATE, aktiv)
begynne
hvis avtrekkeren = '1 'eller aktiv = '0' da
ACK <= '0 ';
STATE <= "00";
elsif SCL = '0 'og SCL'event deretter
hvis SHIFTREG (= '1 'og stat / = "11" da
STAT <= STAT 1;
if ((STAT = "00" og SHIFTREG (7 downto 0) = DADDR) eller (STAT = "01" og SHIFTREG (7 downto 0) = addr) eller STAT = "10") så
ACK <= '1 ';
ok <= true;
ellers
STATE <= "11";
ok <= false;
end if;
ellers
ACK <= '0 ';
end if;
end if;
end process;
-------------------------------------------------- ----------------------------
- I2C data skrive
Prosessen (SCL, out_shift_count, ok)
begynne
if (SCL = '1 'og SCL'event) så
hvis out_shift_count = 7 klikk
out_shift_count <= 0;
hvis dgtslct = "111" then
dgtslct <= "000";
elsif ok da
out_shift_count <= out_shift_count 1;
bcdout <= shiftout (3);
shiftout <= shiftout (2 downto 0) & '0 ';
dgtslct <= dgtslct 1; - siffer velge
end if;
end if;
end if;
end process;
SDA <= bcdout;
-------------------------------------------------- ------------------------------------------------------------------------------ ----------------------------
----------------------------------------
- 8 sifret BCD counter
----------------------------------------
DIGIT0: COUNT10 port map (cclk, avtrekker, '1 ', dgt0, co0);
DIGIT1: COUNT10 port map (cclk, avtrekker, co0, dgt1, co1);
DIGIT2: COUNT10 port map (cclk, avtrekker, co1, dgt2, CO2);
DIGIT3: COUNT10 port map (cclk, avtrekker, CO2, dgt3, CO3);
DIGIT4: COUNT10 port map (cclk, avtrekker, CO3, dgt4, co4);
DIGIT5: COUNT10 port map (cclk, avtrekker, co4, dgt5, co5);
DIGIT6: COUNT10 port map (cclk, avtrekker, co5, dgt6, co6);
DIGIT7: COUNT10 port map (cclk, avtrekker, co6, dgt7, åpen);
end RTL;
- Nedenfor er count10 kodenlibrary IEEE;
bruk ieee.std_logic_1164.all;
bruk ieee.std_logic_unsigned.all;
enhet count10 er
port (
CLK, RESET: in std_logic;
CYIN: in std_logic;
Q: out std_logic_vector (3 downto 0);
CYOUT: out std_logic
);
end;
arkitektur RTL av count10 er
signal TQ: std_logic_vector (3 downto 0);
begynne
Prosessen (CLK, RESET, CYIN) begynne
if (RESET = '1 ') then
TQ <= "0000";
elsif (CLK'event og CLK = '1 'and CYIN = '1') then
if (TQ = "1001") så
TQ <= "0000";
ellers
TQ <= TQ '1 ';
end if;
end if;
end process;
--
Prosessen (TQ, CYIN) begynne
if (TQ = "1001" og CYIN = '1 ') then
CYOUT <= '1 ';
ellers
CYOUT <= '0 ';
end if;
end process;
--
Q <= TQ;
end RTL;
Sist endret av lgeorge123 den 07. Nov 2006 11:25, endret 1 gang totalt