D
dadda007
Guest
Parašiau kodą imtis serijos duomenų RS-232 ryšys ir laikykite jį užregistruoti.Ketinu 2 generuoti signalus, vienas signalas ack1 kuris eina aukšto po svarbių Pradžios bitas buvo gautas ir kitas signalo ack2 po visus 8 duomenų bitus buvo gautas tinkamai.Norėdami patikrinti galiojimo aš naudoju oversampling laikrodis, iš kurio mėginiai kiekvienos bitų trukmė yra 16 kartų Baud Rate laikrodis ir naudoja didžiausią logika įvertinti patys.Tačiau po modeliavimas buvau gauti jokios vertės į registrą ir taip pat neteisingai vertės ack1 ir ack2 .... Please help !!!!!
KodasBiblioteka IEEE;
naudoti IEEE.STD_LOGIC_1164.all;subjektas rs232_lport yrauostas (duomenys: bit;
clk_rs232: Inout STD_LOGIC;
Baudrate: in STD_LOGIC;
- Lport_clk: iš bit: = '0 ';
ack1: iš bit;
ack2: iš bit;
- Patikrinti: iš bit;
- Lport_data: iš BIT_VECTOR (3 downto 0);
input_reg: buferinis BIT_VECTOR (7 downto 0): = "00000000");pabaigos subjektas;Architektūra rs232_lport_behav iš rs232_lport yrabendros kintamasis MED med1: BIT_VECTOR (4 downto 0);
bendra kintamasis i lcount_16, dcount, nos_0, nos_1: integer;
bendras kintamasis didelis, big1, DBIT: bit;
bendros kintamasis first_4, last_4: BIT_VECTOR (3 downto 0);tipo state_rs232 yra (S0, S1, S2);
tipo state_lport yra (idle, F4, L4 lervų);
signalas l_state: state_lport;
signalas rs_state: state_rs232 - Pradinis narė S0.pradėtiprocesas (duomenų)pradėtiatveju rs_state yrakai S0 => - neveikos būsenai nustatyti valstybės aparatasif (duomenys = '1 '), tada - Jei duomenys yra vienas iš ten visi parametrai nustatyti į nulinę padėtį.ack1 <= '0 ';
rs_state <= S0 - Atgal į neveikos būsena .....kitasrs_state <= s1; - Jei duomenų eilutė yra lygi nuliui, tada eikite į valstybės S1.end if;jei s1 => - Tikrina pradžios bitas galiojimas.- Patikrinti, <= '1 ';už lcount_16 į 1-16 linijos - tikrina pirmą kartą paleidus bitų reikšmę.ack2 <= '0 ';
ack1 <= '0 ';if (clk_rs232'event) ir (clk_rs232 = '1 ') ir (clk_rs232'last_value = '0'), tadaif (lcount_16 = 7) then
med (0): = duomenys;
end if;if (lcount_16 = 8), tada
med (1): = duomenys;
end if;if (lcount_16 = 9), tada
med (2): = duomenys;
end if;if (lcount_16 = 10) tada
med (3): = duomenys;
end if;if (lcount_16 = 11) tada
med (4): = duomenys;
end if;end if;end loop;for i in 0-4 kilpa - patikrinimų pradžios truputį vertę, taikant didžiausią logika.if (MED (i) = '0 '), tada
nos_0: nos_0 = 1;
end if;end loop;for i in 0-4 kilpaif (MED (i) = '1 ') then
nos_1: nos_1 = 1;
end if;end loop;if (nos_1> nos_0), tada
BIG: = '1 ';
kitas
BIG: = '0 ';
end if;jei (didelis = '0 '), tada - Jei nuo pradžios bitas vertė yra lygi nuliui, tada nustatykite į ack1 bitų reikšmę į vieną .....
ack1 <= '1 ';
rs_state <= s2; - Grįžti į valstybės S2kitasack1 <= '0 ';
rs_state <= S0, - jei prasideda bitas yra 1 pradziu neveikos būsenai.end if;kai s2 => - Tai narė atsižvelgia į vertę į registrą ir neleidžia perkelti jį.- If (ack1 = '1 ') thenuž dcount į 0-7 linijosif (baudrate'event ir Baudrate = '1 ') thenDBIT: = duomenys;
input_reg <= '0 '& input_reg (7 downto 1);
input_reg (7) <= DBIT;end if;end loop;ack2 <= '1 '; - juk 8 bitai buvo perkelti nustatė ack2 bitų didelės vertės.rs_state <= S0, - Grįžti į valstybės S0, ty neveikos būsena .....pabaigos atveju;galutinio proceso;pabaigos rs232_lport_behav;
KodasBiblioteka IEEE;
naudoti IEEE.STD_LOGIC_1164.all;subjektas rs232_lport yrauostas (duomenys: bit;
clk_rs232: Inout STD_LOGIC;
Baudrate: in STD_LOGIC;
- Lport_clk: iš bit: = '0 ';
ack1: iš bit;
ack2: iš bit;
- Patikrinti: iš bit;
- Lport_data: iš BIT_VECTOR (3 downto 0);
input_reg: buferinis BIT_VECTOR (7 downto 0): = "00000000");pabaigos subjektas;Architektūra rs232_lport_behav iš rs232_lport yrabendros kintamasis MED med1: BIT_VECTOR (4 downto 0);
bendra kintamasis i lcount_16, dcount, nos_0, nos_1: integer;
bendras kintamasis didelis, big1, DBIT: bit;
bendros kintamasis first_4, last_4: BIT_VECTOR (3 downto 0);tipo state_rs232 yra (S0, S1, S2);
tipo state_lport yra (idle, F4, L4 lervų);
signalas l_state: state_lport;
signalas rs_state: state_rs232 - Pradinis narė S0.pradėtiprocesas (duomenų)pradėtiatveju rs_state yrakai S0 => - neveikos būsenai nustatyti valstybės aparatasif (duomenys = '1 '), tada - Jei duomenys yra vienas iš ten visi parametrai nustatyti į nulinę padėtį.ack1 <= '0 ';
rs_state <= S0 - Atgal į neveikos būsena .....kitasrs_state <= s1; - Jei duomenų eilutė yra lygi nuliui, tada eikite į valstybės S1.end if;jei s1 => - Tikrina pradžios bitas galiojimas.- Patikrinti, <= '1 ';už lcount_16 į 1-16 linijos - tikrina pirmą kartą paleidus bitų reikšmę.ack2 <= '0 ';
ack1 <= '0 ';if (clk_rs232'event) ir (clk_rs232 = '1 ') ir (clk_rs232'last_value = '0'), tadaif (lcount_16 = 7) then
med (0): = duomenys;
end if;if (lcount_16 = 8), tada
med (1): = duomenys;
end if;if (lcount_16 = 9), tada
med (2): = duomenys;
end if;if (lcount_16 = 10) tada
med (3): = duomenys;
end if;if (lcount_16 = 11) tada
med (4): = duomenys;
end if;end if;end loop;for i in 0-4 kilpa - patikrinimų pradžios truputį vertę, taikant didžiausią logika.if (MED (i) = '0 '), tada
nos_0: nos_0 = 1;
end if;end loop;for i in 0-4 kilpaif (MED (i) = '1 ') then
nos_1: nos_1 = 1;
end if;end loop;if (nos_1> nos_0), tada
BIG: = '1 ';
kitas
BIG: = '0 ';
end if;jei (didelis = '0 '), tada - Jei nuo pradžios bitas vertė yra lygi nuliui, tada nustatykite į ack1 bitų reikšmę į vieną .....
ack1 <= '1 ';
rs_state <= s2; - Grįžti į valstybės S2kitasack1 <= '0 ';
rs_state <= S0, - jei prasideda bitas yra 1 pradziu neveikos būsenai.end if;kai s2 => - Tai narė atsižvelgia į vertę į registrą ir neleidžia perkelti jį.- If (ack1 = '1 ') thenuž dcount į 0-7 linijosif (baudrate'event ir Baudrate = '1 ') thenDBIT: = duomenys;
input_reg <= '0 '& input_reg (7 downto 1);
input_reg (7) <= DBIT;end if;end loop;ack2 <= '1 '; - juk 8 bitai buvo perkelti nustatė ack2 bitų didelės vertės.rs_state <= S0, - Grįžti į valstybės S0, ty neveikos būsena .....pabaigos atveju;galutinio proceso;pabaigos rs232_lport_behav;