L
lgeorge123
Guest
Eu scriu o VHDL de frecvenţa cu contor de comunicare I2C cu MCU.Tot împreună am 8 port IO, dar după ce compilaţi numai 6 sunt găsite, deci ce e în neregulă cu codul meu?Eu folosesc CPLD XILINX XL9572.
IEEE ibrary;
ieee.std_logic_1164.all utilizare;
ieee.std_logic_unsigned.all utilizare;
entitate fcounter5 este de
generice (
- WR: std_logic: = '0 ';
DADDR: std_logic_vector (6 downto 0): = "0010001"; - 11h (22h) adresa de dispozitiv
Addr: std_logic_vector (7 downto 0): = "00000000" - 00h sub adresa de
);
port (
declanşare: in std_logic; - numărul de a începe
ocupat: out std_logic; - statutul
clock: in std_logic; - Ceas Master 12.8MHz
cclk: in std_logic; - Contor de intrare ceas
sigout: out std_logic;
- RST: in std_logic;
SCL: in std_logic;
Sda: std_logic InOut;
sigin: in std_logic - Semnal de intrare
);
end;
RTL arhitectura fcounter5 este de
-----------------------------------
- Componenta Definiţi BCD counter
-----------------------------------
COUNT10 componentă
port (
CLK, RESET: in std_logic;
CYIN: in std_logic;
Î: out std_logic_vector (3 downto 0);
CYOUT: out std_logic
);
componentă scop;------------------------------------
- Definirea semnal intern
------------------------------------
semnal de dgt0: std_logic_vector (3 downto 0); - 1 BCD de ieşire cifre counter
semnal de dgt1: std_logic_vector (3 downto 0); - 2nd BCD de ieşire cifre counter
Semnalul dgt2: std_logic_vector (3 downto 0); - 3rd BCD de ieşire cifre counter
Semnalul dgt3: std_logic_vector (3 downto 0); - 4a BCD de ieşire cifre counter
Semnalul dgt4: std_logic_vector (3 downto 0); - 5a BCD de ieşire cifre counter
Semnalul dgt5: std_logic_vector (3 downto 0); - a 6-BCD de ieşire cifre counter
semnal de dgt6: std_logic_vector (3 downto 0); - 7a BCD de ieşire cifre counter
semnal de dgt7: std_logic_vector (3 downto 0); - 8a BCD de ieşire cifre counter
semnal de co0: std_logic; - 1st overflow
semnal de co1: std_logic; - 2nd overflow
semnal de CO2: std_logic; - 3 overflow
semnal de CO3: std_logic; - 4a overflow
semnal de co4: std_logic; - 5a overflow
semnal de co5: std_logic; - a 6-revărsare
semnal de co6: std_logic; - 7th overflow
gate de semnal: std_logic; - poarta internă
gatecounter semnal: std_logic_vector (23 downto 0); - Contor poarta
intbusy semnal: std_logic; - pavilion interne ocupat
shiftout semnal: std_logic_vector (3 downto 0);
semnal SDA_IN, start, stop, ACTIVE, ack: std_logic;
SHIFTREG semnal: std_logic_vector (8 downto 0);
bcdout semnal: std_logic; - BCD Date de iesire
out_shift_count semnal: Range integer 0 la 7;
ok semnal: boolean: = false;
STAT semnal: std_logic_vector (1 downto 0); - 00 - de stat iddle
dgtslct semnal: std_logic_vector (2 downto 0): = "000"; - cifre selectaţi
începe
----------------------------------------
- Începe ceas de sincronizare
-----------------------------------------
proces (de ceas, de a declanşa, intbusy) începe
în cazul în care (de declanşare = '1 '), apoi
gatecounter <= "000000000000000000000000"; - începe de la zero
elsif (de ceas "eveniment şi CLOCK = '1 'şi intbusy = '0'), apoi - la 12.8MHz
gatecounter <= gatecounter 1; - numărul de poarta de timp
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
------------------------------------------
- Genera puls poarta ocupat şi de statutul de
------------------------------------------
proces (de declanşare, gatecounter) începe
în cazul în care (de declanşare = '1 '), apoi
poarta <= '0 ';
intbusy <= '0 ';
elsif (gatecounter = 1), atunci
poarta <= '1 ';
elsif (gatecounter = 12,800,000), atunci
poarta <= '0 '; - poarta aproape de la 1sec
intbusy <= '1 '; - a nu putea suporta ocupat
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
ocupat <= intbusy; - starea de calculator
----------------------------------------
- Poarta de intrare şi ieşire
----------------------------------------
proces (Gate, sigin) începe
în cazul în care (Gate = '1 '), apoi - poarta de intrare de impuls
sigout <= sigin;
alt
sigout <= '0 ';
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-----------------------------------------
- Selectaţi BCD cifre de ieşire
-----------------------------------------
proces (intbusy, dgtslct, dgt0, dgt1, dgt2, dgt3, dgt4, dgt5, dgt6, dgt7) începe - Selector BCD
în cazul în care (intbusy = '1 '), apoi
cazul dgtslct (2 downto 0) este
atunci când "111" => shiftout <= dgt7 (3 downto 0); - selectaţi 1st cifre la 0
atunci când "110" => shiftout <= dgt6 (3 downto 0);
atunci când "101" => shiftout <= dgt5 (3 downto 0);
atunci când "100" => shiftout <= dgt4 (3 downto 0);
atunci când "011" => shiftout <= dgt3 (3 downto 0);
atunci când "010" => shiftout <= dgt2 (3 downto 0);
atunci când "001" => shiftout <= dgt1 (3 downto 0);
atunci când "000" => shiftout <= dgt0 (3 downto 0);
atunci când alţii => shiftout <= "1111"; - F răspuns la selectaţi neregulate
cazul scop;
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;- Proces (SDA_IN, START_RST)
- Begin
- - În cazul în care (de declanşare = '1 '), apoi
- Start <= '0 ';
- Elsif (SDA_IN'event şi SDA_IN = '0 '), apoi
- Start <= SCL;
- În cazul în care scop;
- Procesul de sfârşit;
- Proces (SCL, start, stop)
- Begin
- În cazul în care (SCL'event şi SCL = '0 '), apoi
- START_RST <= Start;
- În cazul în care scop;
- Procesul de sfârşit;
-------------------------------------------------- ----------------------------
- De a porni de detectare condiţie, metoda 2 (simplă - dar săptămâni împotriva zgomotului)
proces (trigger, SCL, SDA_IN)
începe
în cazul în care de declanşare = '1 'sau SCL = '0', apoi
Start <= '0 ';
elsif SCL = '1 'şi SDA_IN = '0' şi apoi SDA_IN'event
Start <= '1 ';
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-------------------------------------------------- ----------------------------
- Stop condiţie de detectare a
proces (trigger, SCL, SDA_IN, START)
începe
în cazul în care de declanşare = '1 'sau SCL = '0' sau pe Start = '1 ', apoi
STOP <= '0 ';
elsif SCL = '1 'şi SDA_IN = '1' şi apoi SDA_IN'event
STOP <= '1 ';
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-------------------------------------------------- ----------------------------
- "Comunicarea activă" semnal de
proces (trigger, stop, START)
începe
în cazul în care de declanşare = '1 'sau a opri = "1", apoi - sau (SHIFTREG = "000000001" şi ACK = '0' şi SCL = '1 'şi SCL'event)
ACTIVE <= '0 ';
elsif Start = '0 'şi apoi START'event
ACTIVE <= '1 ';
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-------------------------------------------------- ----------------------------
- RX schimbator de date
proces (trigger, ACTIVE, ACK, SCL, SDA_IN)
începe
în cazul în care de declanşare = '1 'sau active = '0', apoi
SHIFTREG <= "000000001";
elsif SCL'event şi SCL = '1 ', apoi
în cazul în care ACK = '1 ', apoi
SHIFTREG <= "000000001";
alt
SHIFTREG (8 downto 0) <= SHIFTREG (7 downto 0) & SDA_IN;
sfârşitul anului în cazul în care;
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-------------------------------------------------- ----------------------------
- ACK
proces (trigger, SCL, SHIFTREG, stat, activă)
începe
în cazul în care de declanşare = '1 'sau active = '0', apoi
ACK <= '0 ';
STAT <= "00";
elsif SCL = '0 'şi apoi SCL'event
în cazul în care SHIFTREG (= '1 'şi de stat / = "11", atunci
STAT <= STAT 1;
if ((DE STAT = "00" şi SHIFTREG (7 downto 0) = DADDR) sau (de stat = "01" şi SHIFTREG (7 downto 0) = addr) sau de stat = "10"), atunci
ACK <= '1 ';
OK <= true;
alt
STAT <= "11";
OK <= false;
sfârşitul anului în cazul în care;
alt
ACK <= '0 ';
sfârşitul anului în cazul în care;
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-------------------------------------------------- ----------------------------
- Date I2C scrie
proces (SCL, out_shift_count, OK)
începe
în cazul în care (SCL = '1 'şi SCL'event), apoi
în cazul în care out_shift_count = 7, atunci
out_shift_count <= 0;
în cazul în care dgtslct = "111", atunci
dgtslct <= "000";
elsif OK apoi
out_shift_count <= out_shift_count 1;
bcdout <= shiftout (3);
shiftout <= shiftout (2 downto 0) & '0 ';
dgtslct <= dgtslct 1; - cifră selectaţi
sfârşitul anului în cazul în care;
sfârşitul anului în cazul în care;
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
sda <= bcdout;
-------------------------------------------------- ------------------------------------------------------------------------------ ----------------------------
----------------------------------------
- 8 cifre BCD counter
----------------------------------------
DIGIT0: COUNT10 harta port (cclk, de a declanşa, '1 ', dgt0, co0);
DIGIT1: COUNT10 harta port (cclk, de a declanşa, co0, dgt1, co1);
DIGIT2: COUNT10 harta port (cclk, de a declanşa, co1, dgt2, CO2);
DIGIT3: COUNT10 harta port (cclk, de a declanşa, CO2, dgt3, CO3);
DIGIT4: COUNT10 harta port (cclk, de a declanşa, CO3, dgt4, co4);
DIGIT5: COUNT10 harta port (cclk, de a declanşa, co4, dgt5, co5);
DIGIT6: COUNT10 harta port (cclk, de a declanşa, co5, dgt6, co6);
DIGIT7: COUNT10 harta port (cclk, de a declanşa, co6, dgt7, deschis);
RTL scop;
- De mai jos este codul count10IEEE biblioteca;
ieee.std_logic_1164.all utilizare;
ieee.std_logic_unsigned.all utilizare;
entitate count10 este de
port (
CLK, RESET: in std_logic;
CYIN: in std_logic;
Î: out std_logic_vector (3 downto 0);
CYOUT: out std_logic
);
end;
RTL arhitectura count10 este de
Semnalul TQ: std_logic_vector (3 downto 0);
începe
proces (CLK, RESET, CYIN) începe
în cazul în care (reset = '1 '), apoi
TQ <= "0000";
elsif (CLK'event şi CLK = '1 'şi CYIN = '1'), apoi
în cazul în care (TQ = "1001"), atunci
TQ <= "0000";
alt
TQ <= TQ '1 ';
sfârşitul anului în cazul în care;
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
--
proces (TQ, CYIN) începe
în cazul în care (TQ = "1001" şi CYIN = '1 '), apoi
CYOUT <= '1 ';
alt
CYOUT <= '0 ';
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
--
Q <= TQ;
RTL scop;
Last edited by lgeorge123 pe 07 noiembrie 2006 11:25; editat 1 dată în total
IEEE ibrary;
ieee.std_logic_1164.all utilizare;
ieee.std_logic_unsigned.all utilizare;
entitate fcounter5 este de
generice (
- WR: std_logic: = '0 ';
DADDR: std_logic_vector (6 downto 0): = "0010001"; - 11h (22h) adresa de dispozitiv
Addr: std_logic_vector (7 downto 0): = "00000000" - 00h sub adresa de
);
port (
declanşare: in std_logic; - numărul de a începe
ocupat: out std_logic; - statutul
clock: in std_logic; - Ceas Master 12.8MHz
cclk: in std_logic; - Contor de intrare ceas
sigout: out std_logic;
- RST: in std_logic;
SCL: in std_logic;
Sda: std_logic InOut;
sigin: in std_logic - Semnal de intrare
);
end;
RTL arhitectura fcounter5 este de
-----------------------------------
- Componenta Definiţi BCD counter
-----------------------------------
COUNT10 componentă
port (
CLK, RESET: in std_logic;
CYIN: in std_logic;
Î: out std_logic_vector (3 downto 0);
CYOUT: out std_logic
);
componentă scop;------------------------------------
- Definirea semnal intern
------------------------------------
semnal de dgt0: std_logic_vector (3 downto 0); - 1 BCD de ieşire cifre counter
semnal de dgt1: std_logic_vector (3 downto 0); - 2nd BCD de ieşire cifre counter
Semnalul dgt2: std_logic_vector (3 downto 0); - 3rd BCD de ieşire cifre counter
Semnalul dgt3: std_logic_vector (3 downto 0); - 4a BCD de ieşire cifre counter
Semnalul dgt4: std_logic_vector (3 downto 0); - 5a BCD de ieşire cifre counter
Semnalul dgt5: std_logic_vector (3 downto 0); - a 6-BCD de ieşire cifre counter
semnal de dgt6: std_logic_vector (3 downto 0); - 7a BCD de ieşire cifre counter
semnal de dgt7: std_logic_vector (3 downto 0); - 8a BCD de ieşire cifre counter
semnal de co0: std_logic; - 1st overflow
semnal de co1: std_logic; - 2nd overflow
semnal de CO2: std_logic; - 3 overflow
semnal de CO3: std_logic; - 4a overflow
semnal de co4: std_logic; - 5a overflow
semnal de co5: std_logic; - a 6-revărsare
semnal de co6: std_logic; - 7th overflow
gate de semnal: std_logic; - poarta internă
gatecounter semnal: std_logic_vector (23 downto 0); - Contor poarta
intbusy semnal: std_logic; - pavilion interne ocupat
shiftout semnal: std_logic_vector (3 downto 0);
semnal SDA_IN, start, stop, ACTIVE, ack: std_logic;
SHIFTREG semnal: std_logic_vector (8 downto 0);
bcdout semnal: std_logic; - BCD Date de iesire
out_shift_count semnal: Range integer 0 la 7;
ok semnal: boolean: = false;
STAT semnal: std_logic_vector (1 downto 0); - 00 - de stat iddle
dgtslct semnal: std_logic_vector (2 downto 0): = "000"; - cifre selectaţi
începe
----------------------------------------
- Începe ceas de sincronizare
-----------------------------------------
proces (de ceas, de a declanşa, intbusy) începe
în cazul în care (de declanşare = '1 '), apoi
gatecounter <= "000000000000000000000000"; - începe de la zero
elsif (de ceas "eveniment şi CLOCK = '1 'şi intbusy = '0'), apoi - la 12.8MHz
gatecounter <= gatecounter 1; - numărul de poarta de timp
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
------------------------------------------
- Genera puls poarta ocupat şi de statutul de
------------------------------------------
proces (de declanşare, gatecounter) începe
în cazul în care (de declanşare = '1 '), apoi
poarta <= '0 ';
intbusy <= '0 ';
elsif (gatecounter = 1), atunci
poarta <= '1 ';
elsif (gatecounter = 12,800,000), atunci
poarta <= '0 '; - poarta aproape de la 1sec
intbusy <= '1 '; - a nu putea suporta ocupat
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
ocupat <= intbusy; - starea de calculator
----------------------------------------
- Poarta de intrare şi ieşire
----------------------------------------
proces (Gate, sigin) începe
în cazul în care (Gate = '1 '), apoi - poarta de intrare de impuls
sigout <= sigin;
alt
sigout <= '0 ';
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-----------------------------------------
- Selectaţi BCD cifre de ieşire
-----------------------------------------
proces (intbusy, dgtslct, dgt0, dgt1, dgt2, dgt3, dgt4, dgt5, dgt6, dgt7) începe - Selector BCD
în cazul în care (intbusy = '1 '), apoi
cazul dgtslct (2 downto 0) este
atunci când "111" => shiftout <= dgt7 (3 downto 0); - selectaţi 1st cifre la 0
atunci când "110" => shiftout <= dgt6 (3 downto 0);
atunci când "101" => shiftout <= dgt5 (3 downto 0);
atunci când "100" => shiftout <= dgt4 (3 downto 0);
atunci când "011" => shiftout <= dgt3 (3 downto 0);
atunci când "010" => shiftout <= dgt2 (3 downto 0);
atunci când "001" => shiftout <= dgt1 (3 downto 0);
atunci când "000" => shiftout <= dgt0 (3 downto 0);
atunci când alţii => shiftout <= "1111"; - F răspuns la selectaţi neregulate
cazul scop;
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;- Proces (SDA_IN, START_RST)
- Begin
- - În cazul în care (de declanşare = '1 '), apoi
- Start <= '0 ';
- Elsif (SDA_IN'event şi SDA_IN = '0 '), apoi
- Start <= SCL;
- În cazul în care scop;
- Procesul de sfârşit;
- Proces (SCL, start, stop)
- Begin
- În cazul în care (SCL'event şi SCL = '0 '), apoi
- START_RST <= Start;
- În cazul în care scop;
- Procesul de sfârşit;
-------------------------------------------------- ----------------------------
- De a porni de detectare condiţie, metoda 2 (simplă - dar săptămâni împotriva zgomotului)
proces (trigger, SCL, SDA_IN)
începe
în cazul în care de declanşare = '1 'sau SCL = '0', apoi
Start <= '0 ';
elsif SCL = '1 'şi SDA_IN = '0' şi apoi SDA_IN'event
Start <= '1 ';
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-------------------------------------------------- ----------------------------
- Stop condiţie de detectare a
proces (trigger, SCL, SDA_IN, START)
începe
în cazul în care de declanşare = '1 'sau SCL = '0' sau pe Start = '1 ', apoi
STOP <= '0 ';
elsif SCL = '1 'şi SDA_IN = '1' şi apoi SDA_IN'event
STOP <= '1 ';
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-------------------------------------------------- ----------------------------
- "Comunicarea activă" semnal de
proces (trigger, stop, START)
începe
în cazul în care de declanşare = '1 'sau a opri = "1", apoi - sau (SHIFTREG = "000000001" şi ACK = '0' şi SCL = '1 'şi SCL'event)
ACTIVE <= '0 ';
elsif Start = '0 'şi apoi START'event
ACTIVE <= '1 ';
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-------------------------------------------------- ----------------------------
- RX schimbator de date
proces (trigger, ACTIVE, ACK, SCL, SDA_IN)
începe
în cazul în care de declanşare = '1 'sau active = '0', apoi
SHIFTREG <= "000000001";
elsif SCL'event şi SCL = '1 ', apoi
în cazul în care ACK = '1 ', apoi
SHIFTREG <= "000000001";
alt
SHIFTREG (8 downto 0) <= SHIFTREG (7 downto 0) & SDA_IN;
sfârşitul anului în cazul în care;
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-------------------------------------------------- ----------------------------
- ACK
proces (trigger, SCL, SHIFTREG, stat, activă)
începe
în cazul în care de declanşare = '1 'sau active = '0', apoi
ACK <= '0 ';
STAT <= "00";
elsif SCL = '0 'şi apoi SCL'event
în cazul în care SHIFTREG (= '1 'şi de stat / = "11", atunci
STAT <= STAT 1;
if ((DE STAT = "00" şi SHIFTREG (7 downto 0) = DADDR) sau (de stat = "01" şi SHIFTREG (7 downto 0) = addr) sau de stat = "10"), atunci
ACK <= '1 ';
OK <= true;
alt
STAT <= "11";
OK <= false;
sfârşitul anului în cazul în care;
alt
ACK <= '0 ';
sfârşitul anului în cazul în care;
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
-------------------------------------------------- ----------------------------
- Date I2C scrie
proces (SCL, out_shift_count, OK)
începe
în cazul în care (SCL = '1 'şi SCL'event), apoi
în cazul în care out_shift_count = 7, atunci
out_shift_count <= 0;
în cazul în care dgtslct = "111", atunci
dgtslct <= "000";
elsif OK apoi
out_shift_count <= out_shift_count 1;
bcdout <= shiftout (3);
shiftout <= shiftout (2 downto 0) & '0 ';
dgtslct <= dgtslct 1; - cifră selectaţi
sfârşitul anului în cazul în care;
sfârşitul anului în cazul în care;
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
sda <= bcdout;
-------------------------------------------------- ------------------------------------------------------------------------------ ----------------------------
----------------------------------------
- 8 cifre BCD counter
----------------------------------------
DIGIT0: COUNT10 harta port (cclk, de a declanşa, '1 ', dgt0, co0);
DIGIT1: COUNT10 harta port (cclk, de a declanşa, co0, dgt1, co1);
DIGIT2: COUNT10 harta port (cclk, de a declanşa, co1, dgt2, CO2);
DIGIT3: COUNT10 harta port (cclk, de a declanşa, CO2, dgt3, CO3);
DIGIT4: COUNT10 harta port (cclk, de a declanşa, CO3, dgt4, co4);
DIGIT5: COUNT10 harta port (cclk, de a declanşa, co4, dgt5, co5);
DIGIT6: COUNT10 harta port (cclk, de a declanşa, co5, dgt6, co6);
DIGIT7: COUNT10 harta port (cclk, de a declanşa, co6, dgt7, deschis);
RTL scop;
- De mai jos este codul count10IEEE biblioteca;
ieee.std_logic_1164.all utilizare;
ieee.std_logic_unsigned.all utilizare;
entitate count10 este de
port (
CLK, RESET: in std_logic;
CYIN: in std_logic;
Î: out std_logic_vector (3 downto 0);
CYOUT: out std_logic
);
end;
RTL arhitectura count10 este de
Semnalul TQ: std_logic_vector (3 downto 0);
începe
proces (CLK, RESET, CYIN) începe
în cazul în care (reset = '1 '), apoi
TQ <= "0000";
elsif (CLK'event şi CLK = '1 'şi CYIN = '1'), apoi
în cazul în care (TQ = "1001"), atunci
TQ <= "0000";
alt
TQ <= TQ '1 ';
sfârşitul anului în cazul în care;
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
--
proces (TQ, CYIN) începe
în cazul în care (TQ = "1001" şi CYIN = '1 '), apoi
CYOUT <= '1 ';
alt
CYOUT <= '0 ';
sfârşitul anului în cazul în care;
Procesul de sfârşitul anului;
--
Q <= TQ;
RTL scop;
Last edited by lgeorge123 pe 07 noiembrie 2006 11:25; editat 1 dată în total