L
lgeorge123
Guest
Rašau dažnumo skaitiklis VHDL su I2C ryšių su MCU.Visi kartu turiu 8 IO uosto, o po to surinkti tik 6 rasta So what's wrong with my code?Aš naudoju Xilinx XL9572 CPLD.
ibrary IEEE;
naudoti ieee.std_logic_1164.all;
naudoti ieee.std_logic_unsigned.all;
subjektas fcounter5 yra
generic (
- WR: std_logic: = '0 ';
DADDR: std_logic_vector (6 downto 0): = "0.010.001" - 11h (22h) įtaisas adresas
Addr: std_logic_vector (7 downto 0): = "00000000" - 00h sub adresas
)
uostas (
rodyti: in STD_LOGIC - pradėti skaičius
užimta: iš STD_LOGIC - statusas
parą: į STD_LOGIC - master clock 12.8MHz
cclk: in STD_LOGIC - counter Clock Input
sigout: iš STD_LOGIC;
- RST: In std_logic;
SCL: in std_logic;
Nuomoju: Inout std_logic;
sigin: in STD_LOGIC - Signal Input
)
pabaigoje
Architektūra RTL dėl fcounter5 yra
-----------------------------------
- Nustatyti sudėtinės BCD skaitiklis
-----------------------------------
komponentas COUNT10
uostas (
CLK, reset: į STD_LOGIC;
CYIN: in STD_LOGIC;
Klausimas: iš STD_LOGIC_VECTOR (3 downto 0);
CYOUT: iš STD_LOGIC
)
end component;------------------------------------
- Nustatyti vidaus signalas
------------------------------------
signalas dgt0: STD_LOGIC_VECTOR (3 downto 0); - 1st BCD skaitmenų skaitiklis produkcija
signalas dgt1: STD_LOGIC_VECTOR (3 downto 0); - 2nd BCD skaitmenų skaitiklis produkcija
signalas dgt2: STD_LOGIC_VECTOR (3 downto 0); - 3rd BCD skaitmenų skaitiklis produkcija
signalas dgt3: STD_LOGIC_VECTOR (3 downto 0); - 4 BCD skaitmenų skaitiklis produkcija
signalas dgt4: STD_LOGIC_VECTOR (3 downto 0); - 5th BCD skaitmenų skaitiklis produkcija
signalas dgt5: STD_LOGIC_VECTOR (3 downto 0); - 6 BCD skaitmenų skaitiklis produkcija
signalas dgt6: STD_LOGIC_VECTOR (3 downto 0); - 7th BCD skaitmenų skaitiklis produkcija
signalas dgt7: STD_LOGIC_VECTOR (3 downto 0); - 8 BCD skaitmenų skaitiklis produkcija
signalas co0: STD_LOGIC; - 1st overflow
signalas co1: STD_LOGIC; - 2nd overflow
signalas CO2: STD_LOGIC; - 3rd overflow
signalas CO3: STD_LOGIC; - 4th overflow
signalas co4: STD_LOGIC; - 5th overflow
signalas co5: STD_LOGIC; - 6 overflow
signalas co6: STD_LOGIC; - 7th overflow
signalas vartų STD_LOGIC; - vidaus vartai
signalas gatecounter: STD_LOGIC_VECTOR (23 downto 0) - vartai skaitiklis
signalas intbusy: STD_LOGIC; - vidaus užsiėmęs vėliavos
signalas shiftout: std_logic_vector (3 downto 0);
signalas SDA_IN, start, stop, ACTIVE, ack: std_logic;
signalas SHIFTREG: std_logic_vector (8 downto 0);
signalas bcdout: STD_LOGIC - BCD išvesties duomenų
signalas out_shift_count: sveikasis skaičius nuo 0 iki 7;
signalas ok: boolean: = false;
signalas NARĖ: std_logic_vector (1 downto 0); - 00 - iddle valstybės
signalas dgtslct: STD_LOGIC_VECTOR (2 downto 0): = "000"; - skaitmuo pasirinkite
pradėti
----------------------------------------
- Pradedanti laiko laikrodis
-----------------------------------------
procesas (laikrodis, laikas, rodyti, intbusy) prasideda
if (rodyti = '1 ') then
gatecounter <= "000000000000000000000000", - pradėti nuo nulio
elsif (laikrodis "renginys ir laikrodis = '1 'ir intbusy = '0'), tada - ne 12.8MHz
gatecounter <= gatecounter 1; - Count vartų laikas
end if;
galutinio proceso;
------------------------------------------
- Kurti vartai impulso užimtas statusas
------------------------------------------
procesas (sukelti, gatecounter) prasideda
if (rodyti = '1 ') then
vartai <= '0 ';
intbusy <= '0 ';
elsif (gatecounter = 1) tuomet
vartai <= '1 ';
elsif (gatecounter = 12800000) tada
vartai <= '0 '; - uždaryti vartai 1sec
intbusy <= '1 '; - Reset užimtas
end if;
galutinio proceso;
užimtas <= intbusy - statusas kompiuterių
----------------------------------------
- Vartai įvesties ir išvesties
----------------------------------------
procesas (vartai, sigin) prasideda
if (vartai = '1 '), paskui - prie vartų įėjimo impulso
sigout <= sigin;
kitas
sigout <= '0 ';
end if;
galutinio proceso;
-----------------------------------------
- Pasirinkite BCD ženklų produkcija
-----------------------------------------
procesas (intbusy, dgtslct, dgt0, dgt1, dgt2, dgt3, dgt4, dgt5, dgt6, dgt7) prasideda - BCD selektorių
if (intbusy = '1 ') then
atveju dgtslct (2 downto 0)
kai "111" => shiftout <= dgt7 (3 downto 0); - pasirinkite 1. skaitmenį nuo 0
kai "110" => shiftout <= dgt6 (3 downto 0);
kai "101" => shiftout <= dgt5 (3 downto 0);
kai "100" => shiftout <= dgt4 (3 downto 0);
kai "011" => shiftout <= dgt3 (3 downto 0);
kai "010" => shiftout <= dgt2 (3 downto 0);
kai "001" => shiftout <= dgt1 (3 downto 0);
kai "000" => shiftout <= dgt0 (3 downto 0);
kai kiti => shiftout <= "1111"; - atsakyti F nereguliarios pasirinkite
pabaigos atveju;
end if;
galutinio proceso;- Procesas (SDA_IN, START_RST)
- Pradžia
- - Jei (rodyti = '1 ') then
- Pirmas <= '0 ';
- Elsif (SDA_IN'event ir SDA_IN = '0 '), tada
- Pirmas <= SCL;
- END IF;
- Galutinio proceso;
- Procesas (SCL, start, stop)
- Pradžia
- If (SCL'event ir SCL = '0 '), tada
- START_RST <= start;
- END IF;
- Galutinio proceso;
-------------------------------------------------- ----------------------------
- Pradėti būklės nustatymo metodą 2 (paprasta - bet per savaitę nuo triukšmo)
procesas (sukelti, SCL, SDA_IN)
pradėti
jeigu rodyti = '1 'ar SCL = '0', tada
Pradėti <= '0 ';
elsif SCL = '1 'ir SDA_IN = '0' ir SDA_IN'event tada
Pradėti <= '1 ';
end if;
galutinio proceso;
-------------------------------------------------- ----------------------------
- Stabdymo sąlyga nustatymo
procesas (sukelti, SCL, SDA_IN, START)
pradėti
jeigu rodyti = '1 'ar SCL = '0' arba start = '1 'tada
Stop <= '0 ';
elsif SCL = '1 'ir SDA_IN = '1' ir SDA_IN'event tada
Stop <= '1 ';
end if;
galutinio proceso;
-------------------------------------------------- ----------------------------
- "Aktyvūs komunikacijos" signalas
procesas (sukelti, STOP, START)
pradėti
jeigu rodyti = '1 'arba STOP = '1' tada - arba (SHIFTREG = "000.000.001" ir ACK = '0 'ir SCL = '1' ir SCL'event)
Aktyvus <= '0 ';
elsif start = '0 'ir START'event tada
Aktyvus <= '1 ';
end if;
galutinio proceso;
-------------------------------------------------- ----------------------------
- RX duomenų shifter
procesas (sukelti, ACTIVE, ACK, SCL, SDA_IN)
pradėti
jeigu rodyti = '1 'ar aktyvūs = '0', tada
SHIFTREG <= "000000001";
elsif SCL'event ir SCL = '1 'tada
jei ACK = '1 'tada
SHIFTREG <= "000000001";
kitas
SHIFTREG (8 downto 0) <= SHIFTREG (7 downto 0) & SDA_IN;
end if;
end if;
galutinio proceso;
-------------------------------------------------- ----------------------------
- ACK
procesas (sukelti, SCL, SHIFTREG, valstybė, aktyvus)
pradėti
jeigu rodyti = '1 'ar aktyvūs = '0', tada
ACK <= '0 ';
VALSTYBĖS <= "00";
elsif SCL = '0 'ir SCL'event tada
jei SHIFTREG (= '1 'ir valstybė / = "11", tada
VALSTYBĖS <= VALSTYBĖS 1;
if ((VALSTYBĖ = "00" ir SHIFTREG (7 downto 0) = DADDR) arba (VALSTYBĖ = "01" ir SHIFTREG (7 downto 0) = ADDR) arba valstijos = "10"), tada
ACK <= '1 ';
Gerai <= true;
kitas
VALSTYBĖS <= "11";
Gerai <= false;
end if;
kitas
ACK <= '0 ';
end if;
end if;
galutinio proceso;
-------------------------------------------------- ----------------------------
- I2C duomenų rašymą
procesas (SCL, out_shift_count, OK)
pradėti
jei (SCL = '1 'ir SCL'event), tada
jei out_shift_count = 7 tada
out_shift_count <= 0;
jei dgtslct = "111", tada
dgtslct <= "000";
elsif Gerai tada
out_shift_count <= out_shift_count 1;
bcdout <= shiftout (3);
shiftout <= shiftout (2 downto 0) & "0";
dgtslct <= dgtslct 1 - skaitmenų pasirinkite
end if;
end if;
end if;
galutinio proceso;
sda <= bcdout;
-------------------------------------------------- ------------------------------------------------------------------------------ ----------------------------
----------------------------------------
- 8 skaitmenų BCD skaitiklis
----------------------------------------
DIGIT0: COUNT10 uostų žemėlapyje (cclk, paspartinti, '1 ', dgt0, co0);
DIGIT1: COUNT10 uostų žemėlapyje (cclk, paspartinti, co0, dgt1, co1);
DIGIT2: COUNT10 uostų žemėlapyje (cclk, paspartinti, co1, dgt2, CO2);
DIGIT3: COUNT10 uostų žemėlapyje (cclk, paspartinti, CO2, dgt3, CO3);
DIGIT4: COUNT10 uostų žemėlapyje (cclk, paspartinti, CO3, dgt4, co4);
DIGIT5: COUNT10 uostų žemėlapyje (cclk, paspartinti, co4, dgt5, co5);
DIGIT6: COUNT10 uostų žemėlapyje (cclk, paspartinti, co5, dgt6, co6);
DIGIT7: COUNT10 uostų žemėlapyje (cclk, paspartinti, co6, dgt7, atidaryti);
pabaigos RTL;
- Toliau count10 kodasBiblioteka IEEE;
naudoti ieee.std_logic_1164.all;
naudoti ieee.std_logic_unsigned.all;
subjektas count10 yra
uostas (
CLK, reset: į std_logic;
CYIN: in std_logic;
Klausimas: iš std_logic_vector (3 downto 0);
CYOUT: iš std_logic
)
pabaigoje
Architektūra RTL dėl count10 yra
signalas TK: std_logic_vector (3 downto 0);
pradėti
procesas (CLK, RESET, CYIN) prasideda
if (RESET = '1 ') then
TK <= "0000";
elsif (CLK'event ir CLK = '1 'ir CYIN = '1') then
if (TK = "1001"), tada
TK <= "0000";
kitas
TK <= TK '1 ';
end if;
end if;
galutinio proceso;
--
procesas (TK, CYIN) prasideda
if (TK = "1001" ir CYIN = '1 ') then
CYOUT <= '1 ';
kitas
CYOUT <= '0 ';
end if;
galutinio proceso;
--
Q <= TK;
pabaigos RTL;
Paskutinį kartą redagavo lgeorge123 buvo 07 Nov 2006 11:25, edited 1 kartą
ibrary IEEE;
naudoti ieee.std_logic_1164.all;
naudoti ieee.std_logic_unsigned.all;
subjektas fcounter5 yra
generic (
- WR: std_logic: = '0 ';
DADDR: std_logic_vector (6 downto 0): = "0.010.001" - 11h (22h) įtaisas adresas
Addr: std_logic_vector (7 downto 0): = "00000000" - 00h sub adresas
)
uostas (
rodyti: in STD_LOGIC - pradėti skaičius
užimta: iš STD_LOGIC - statusas
parą: į STD_LOGIC - master clock 12.8MHz
cclk: in STD_LOGIC - counter Clock Input
sigout: iš STD_LOGIC;
- RST: In std_logic;
SCL: in std_logic;
Nuomoju: Inout std_logic;
sigin: in STD_LOGIC - Signal Input
)
pabaigoje
Architektūra RTL dėl fcounter5 yra
-----------------------------------
- Nustatyti sudėtinės BCD skaitiklis
-----------------------------------
komponentas COUNT10
uostas (
CLK, reset: į STD_LOGIC;
CYIN: in STD_LOGIC;
Klausimas: iš STD_LOGIC_VECTOR (3 downto 0);
CYOUT: iš STD_LOGIC
)
end component;------------------------------------
- Nustatyti vidaus signalas
------------------------------------
signalas dgt0: STD_LOGIC_VECTOR (3 downto 0); - 1st BCD skaitmenų skaitiklis produkcija
signalas dgt1: STD_LOGIC_VECTOR (3 downto 0); - 2nd BCD skaitmenų skaitiklis produkcija
signalas dgt2: STD_LOGIC_VECTOR (3 downto 0); - 3rd BCD skaitmenų skaitiklis produkcija
signalas dgt3: STD_LOGIC_VECTOR (3 downto 0); - 4 BCD skaitmenų skaitiklis produkcija
signalas dgt4: STD_LOGIC_VECTOR (3 downto 0); - 5th BCD skaitmenų skaitiklis produkcija
signalas dgt5: STD_LOGIC_VECTOR (3 downto 0); - 6 BCD skaitmenų skaitiklis produkcija
signalas dgt6: STD_LOGIC_VECTOR (3 downto 0); - 7th BCD skaitmenų skaitiklis produkcija
signalas dgt7: STD_LOGIC_VECTOR (3 downto 0); - 8 BCD skaitmenų skaitiklis produkcija
signalas co0: STD_LOGIC; - 1st overflow
signalas co1: STD_LOGIC; - 2nd overflow
signalas CO2: STD_LOGIC; - 3rd overflow
signalas CO3: STD_LOGIC; - 4th overflow
signalas co4: STD_LOGIC; - 5th overflow
signalas co5: STD_LOGIC; - 6 overflow
signalas co6: STD_LOGIC; - 7th overflow
signalas vartų STD_LOGIC; - vidaus vartai
signalas gatecounter: STD_LOGIC_VECTOR (23 downto 0) - vartai skaitiklis
signalas intbusy: STD_LOGIC; - vidaus užsiėmęs vėliavos
signalas shiftout: std_logic_vector (3 downto 0);
signalas SDA_IN, start, stop, ACTIVE, ack: std_logic;
signalas SHIFTREG: std_logic_vector (8 downto 0);
signalas bcdout: STD_LOGIC - BCD išvesties duomenų
signalas out_shift_count: sveikasis skaičius nuo 0 iki 7;
signalas ok: boolean: = false;
signalas NARĖ: std_logic_vector (1 downto 0); - 00 - iddle valstybės
signalas dgtslct: STD_LOGIC_VECTOR (2 downto 0): = "000"; - skaitmuo pasirinkite
pradėti
----------------------------------------
- Pradedanti laiko laikrodis
-----------------------------------------
procesas (laikrodis, laikas, rodyti, intbusy) prasideda
if (rodyti = '1 ') then
gatecounter <= "000000000000000000000000", - pradėti nuo nulio
elsif (laikrodis "renginys ir laikrodis = '1 'ir intbusy = '0'), tada - ne 12.8MHz
gatecounter <= gatecounter 1; - Count vartų laikas
end if;
galutinio proceso;
------------------------------------------
- Kurti vartai impulso užimtas statusas
------------------------------------------
procesas (sukelti, gatecounter) prasideda
if (rodyti = '1 ') then
vartai <= '0 ';
intbusy <= '0 ';
elsif (gatecounter = 1) tuomet
vartai <= '1 ';
elsif (gatecounter = 12800000) tada
vartai <= '0 '; - uždaryti vartai 1sec
intbusy <= '1 '; - Reset užimtas
end if;
galutinio proceso;
užimtas <= intbusy - statusas kompiuterių
----------------------------------------
- Vartai įvesties ir išvesties
----------------------------------------
procesas (vartai, sigin) prasideda
if (vartai = '1 '), paskui - prie vartų įėjimo impulso
sigout <= sigin;
kitas
sigout <= '0 ';
end if;
galutinio proceso;
-----------------------------------------
- Pasirinkite BCD ženklų produkcija
-----------------------------------------
procesas (intbusy, dgtslct, dgt0, dgt1, dgt2, dgt3, dgt4, dgt5, dgt6, dgt7) prasideda - BCD selektorių
if (intbusy = '1 ') then
atveju dgtslct (2 downto 0)
kai "111" => shiftout <= dgt7 (3 downto 0); - pasirinkite 1. skaitmenį nuo 0
kai "110" => shiftout <= dgt6 (3 downto 0);
kai "101" => shiftout <= dgt5 (3 downto 0);
kai "100" => shiftout <= dgt4 (3 downto 0);
kai "011" => shiftout <= dgt3 (3 downto 0);
kai "010" => shiftout <= dgt2 (3 downto 0);
kai "001" => shiftout <= dgt1 (3 downto 0);
kai "000" => shiftout <= dgt0 (3 downto 0);
kai kiti => shiftout <= "1111"; - atsakyti F nereguliarios pasirinkite
pabaigos atveju;
end if;
galutinio proceso;- Procesas (SDA_IN, START_RST)
- Pradžia
- - Jei (rodyti = '1 ') then
- Pirmas <= '0 ';
- Elsif (SDA_IN'event ir SDA_IN = '0 '), tada
- Pirmas <= SCL;
- END IF;
- Galutinio proceso;
- Procesas (SCL, start, stop)
- Pradžia
- If (SCL'event ir SCL = '0 '), tada
- START_RST <= start;
- END IF;
- Galutinio proceso;
-------------------------------------------------- ----------------------------
- Pradėti būklės nustatymo metodą 2 (paprasta - bet per savaitę nuo triukšmo)
procesas (sukelti, SCL, SDA_IN)
pradėti
jeigu rodyti = '1 'ar SCL = '0', tada
Pradėti <= '0 ';
elsif SCL = '1 'ir SDA_IN = '0' ir SDA_IN'event tada
Pradėti <= '1 ';
end if;
galutinio proceso;
-------------------------------------------------- ----------------------------
- Stabdymo sąlyga nustatymo
procesas (sukelti, SCL, SDA_IN, START)
pradėti
jeigu rodyti = '1 'ar SCL = '0' arba start = '1 'tada
Stop <= '0 ';
elsif SCL = '1 'ir SDA_IN = '1' ir SDA_IN'event tada
Stop <= '1 ';
end if;
galutinio proceso;
-------------------------------------------------- ----------------------------
- "Aktyvūs komunikacijos" signalas
procesas (sukelti, STOP, START)
pradėti
jeigu rodyti = '1 'arba STOP = '1' tada - arba (SHIFTREG = "000.000.001" ir ACK = '0 'ir SCL = '1' ir SCL'event)
Aktyvus <= '0 ';
elsif start = '0 'ir START'event tada
Aktyvus <= '1 ';
end if;
galutinio proceso;
-------------------------------------------------- ----------------------------
- RX duomenų shifter
procesas (sukelti, ACTIVE, ACK, SCL, SDA_IN)
pradėti
jeigu rodyti = '1 'ar aktyvūs = '0', tada
SHIFTREG <= "000000001";
elsif SCL'event ir SCL = '1 'tada
jei ACK = '1 'tada
SHIFTREG <= "000000001";
kitas
SHIFTREG (8 downto 0) <= SHIFTREG (7 downto 0) & SDA_IN;
end if;
end if;
galutinio proceso;
-------------------------------------------------- ----------------------------
- ACK
procesas (sukelti, SCL, SHIFTREG, valstybė, aktyvus)
pradėti
jeigu rodyti = '1 'ar aktyvūs = '0', tada
ACK <= '0 ';
VALSTYBĖS <= "00";
elsif SCL = '0 'ir SCL'event tada
jei SHIFTREG (= '1 'ir valstybė / = "11", tada
VALSTYBĖS <= VALSTYBĖS 1;
if ((VALSTYBĖ = "00" ir SHIFTREG (7 downto 0) = DADDR) arba (VALSTYBĖ = "01" ir SHIFTREG (7 downto 0) = ADDR) arba valstijos = "10"), tada
ACK <= '1 ';
Gerai <= true;
kitas
VALSTYBĖS <= "11";
Gerai <= false;
end if;
kitas
ACK <= '0 ';
end if;
end if;
galutinio proceso;
-------------------------------------------------- ----------------------------
- I2C duomenų rašymą
procesas (SCL, out_shift_count, OK)
pradėti
jei (SCL = '1 'ir SCL'event), tada
jei out_shift_count = 7 tada
out_shift_count <= 0;
jei dgtslct = "111", tada
dgtslct <= "000";
elsif Gerai tada
out_shift_count <= out_shift_count 1;
bcdout <= shiftout (3);
shiftout <= shiftout (2 downto 0) & "0";
dgtslct <= dgtslct 1 - skaitmenų pasirinkite
end if;
end if;
end if;
galutinio proceso;
sda <= bcdout;
-------------------------------------------------- ------------------------------------------------------------------------------ ----------------------------
----------------------------------------
- 8 skaitmenų BCD skaitiklis
----------------------------------------
DIGIT0: COUNT10 uostų žemėlapyje (cclk, paspartinti, '1 ', dgt0, co0);
DIGIT1: COUNT10 uostų žemėlapyje (cclk, paspartinti, co0, dgt1, co1);
DIGIT2: COUNT10 uostų žemėlapyje (cclk, paspartinti, co1, dgt2, CO2);
DIGIT3: COUNT10 uostų žemėlapyje (cclk, paspartinti, CO2, dgt3, CO3);
DIGIT4: COUNT10 uostų žemėlapyje (cclk, paspartinti, CO3, dgt4, co4);
DIGIT5: COUNT10 uostų žemėlapyje (cclk, paspartinti, co4, dgt5, co5);
DIGIT6: COUNT10 uostų žemėlapyje (cclk, paspartinti, co5, dgt6, co6);
DIGIT7: COUNT10 uostų žemėlapyje (cclk, paspartinti, co6, dgt7, atidaryti);
pabaigos RTL;
- Toliau count10 kodasBiblioteka IEEE;
naudoti ieee.std_logic_1164.all;
naudoti ieee.std_logic_unsigned.all;
subjektas count10 yra
uostas (
CLK, reset: į std_logic;
CYIN: in std_logic;
Klausimas: iš std_logic_vector (3 downto 0);
CYOUT: iš std_logic
)
pabaigoje
Architektūra RTL dėl count10 yra
signalas TK: std_logic_vector (3 downto 0);
pradėti
procesas (CLK, RESET, CYIN) prasideda
if (RESET = '1 ') then
TK <= "0000";
elsif (CLK'event ir CLK = '1 'ir CYIN = '1') then
if (TK = "1001"), tada
TK <= "0000";
kitas
TK <= TK '1 ';
end if;
end if;
galutinio proceso;
--
procesas (TK, CYIN) prasideda
if (TK = "1001" ir CYIN = '1 ') then
CYOUT <= '1 ';
kitas
CYOUT <= '0 ';
end if;
galutinio proceso;
--
Q <= TK;
pabaigos RTL;
Paskutinį kartą redagavo lgeorge123 buvo 07 Nov 2006 11:25, edited 1 kartą