Hva er galt med koden min

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

 
Det er litt vanskelig å lese, og ISE liker ikke smiley-fjes!code] ... [
/code] tags around your HDL.

Du kan fikse det ved å redigere meldingen din og setter inn
Code:
...  [/
code] rundt HDL din.
 
to porter er ikke benyttes antagelig på grunn av CLK
og cclk i ur-koden klokken gen modulen kan være til stede på bordet ur using.I er ikke sikker på dette.

 
Ur problemet er ur-koden for asynkron logikk med tre klokker
1.klokke
2.cclk
3.SCL

Endre ur-koden slik at den har bare én klokke og synkron.<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Kjølig" border="0" />
 
Ya
de tre klokkene kan være levert av en global klokke.hvis u ser @ ur floorplanned diagram u kan se det tydelig.
hvis u ikke vil få dem kjørt av en enkelt clk u kan bruke Xilinx kompilator direktiver.

 
Beklager, jeg er bare en nybegynner, så jeg vet ikke hva som er "u kan bruke Xilinx kompilator direktiver.??

 
Her er jeg reposting koden innrykket!
Code:

library 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: in std_logic; - start teller

opptatt: out std_logic; - status

clock: in std_logic; - master klokke 12.8MHz

cclk: in std_logic; - counter clock input

sigout: out std_logic;

- RST: in std_logic;

SCL: in std_logic;

SDA: Inout std_logic;

sigin: in std_logic - signalinngang

);

end;arkitektur RTL av fcounter5 er

-----------------------------------

- Definer komponent BCD counter

-----------------------------------

komponent COUNT10

port (

CLK, RESET: in std_logic;

CYIN: in 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 velgebegynne

----------------------------------------

- Starte tidtakingen klokke

-----------------------------------------

Prosessen (klokke, trigger, 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 (8) = '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 STATE = "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;

 

Welcome to EDABoard.com

Sponsor

Back
Top