RS-232 sąsaja su FPGA

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;
 
Siūlau naudoti esamą UART imtuvas dizaino šabloną.Dėl šio kodo, aš negalime forsee tai elgesį.Naudojant laikrodis jautrus žodžio viduje iteracijos ciklo ne mano akiratį ir visiškai unsynthesizable manau.Laimei simuliatorius gali ją priimti be klaidų, tačiau tai nebūtinai įprasminti kodas.

Tai paprastai pamokomi parašyti tokio dizaino nuo nulio.Tačiau turėtumėte laikytis įprastinės konstrukcijos taisykles sinchroninio dizaino automatas.Surinkimas su FPGA įrankis dizainas anksti gali padėti nustatyti unsynthesizable stato.

 
Ačiū už atsakymą, aš išbandyti šį kodą, bet mažai rezultatų ....

KodasBiblioteka IEEE;

naudoti IEEE.STD_LOGIC_1164.all - Header failą deklaracijasubjektas rs232_lport yrauostas (

duomenys: BIT - Įvesties RS-232 Serial duomenų

clk_rs232: in STD_LOGIC - Latching laikrodis

Baudrate: in STD_LOGIC - Bit Rate

ack: iš STD_LOGIC: = '0 '; - Acknoledge važiuoja didelė, 8 duomenų bitus atvykti

input_reg: Inout BIT_VECTOR (7 downto 0): = "00000000"); - Įvesties registras parduotuvių eilės duomenųpabaigos subjektas;Architektūra rs232_lport_behav iš rs232_lport yratipo state_rs232 yra (S0, S1, S2); - 3 narių receiever FSM

tipo state_lport yra (idle, F4, L4 lervų);

signalas l_state: state_lport;

signalas rs_state: state_rs232, - Pradinis narė S0.bendra kintamasis i lcount_16, dcount, nos_0, nos_1: integer: = 0;

bendros kintamasis MED med1: Bit - Parduotuvės centras mėginys.

signalas RST: STD_LOGIC: = '1 ';

- bendra kintamasis ack_v: STD_LOGIC;pradėtirxclk: procesas (clk_rs232, RST) - Šis procesas naudoja RS-232 laikrodis ir RST signalas generuoti imtuvas laikrodis.pradėtiif (RST = '0 '), tadaif (clk_rs232'event ir clk_rs232 = '1 '), tada - generuoja skaitiklis, kuris apsaugo nuo skaičiavimo per laiko trukmė LATCHING laikrodis.if (lcount_16 = 15) tadalcount_16: = 0;kitaslcount_16: lcount_16 = 1;end if;end if;kitaslcount_16: = 0;end if;galutinio proceso;rx_fsm: procesas (clk_rs232, RST) - FMV už imtuvo modulis.pradėtiatveju rs_state yrakai S0 => - neveikos būsenosif (duomenys = '1 ') thenRST <= '1 ';

dcount: = 0;

input_reg <= "00000000";

rs_state <= S0;kitasrs_state <= s1;end if;kada s1 => - tai valstybės patikrinimų pradžios šiek galiojimas.RST <= '0 ';jei (8 = lcount_16), tada

med: = duomenys;

end if;if (med = '0 '), tada - Jei pradžioje šiek tiek galioja.

RST <= '1 ';

rs_state <= s2;

Else - Jei ne, pereikite prie neveikos būsenai.

rs_state <= S0;

end if;kai s2 => - Tai narė tvarko apie perjungimo duomenų bitai į pirkimo registrą.RST <= '0 ';if (dcount <8), tada - Pakartokite 8 kartus, ty iki visų duomenų bitai buvo gauta.if (lcount_16 = 8), tada - Take viduryje pavyzdys

med1: = duomenys;

end if;if (lcount_16 = 15), tada - Į kiekvieną bitų termino pabaigos perkelti duomenų vertę į registrą.

input_reg <= '0 '& input_reg (7 downto 1);

input_reg (7) <= med1;

dcount: = dcount 1; - didinti skaičių.

rs_state <= s2; - Atgal į valstybės S2, ty grįžti į valstybę, kuri laikosi ant perkelti duomenų vertę į registrą.

end if;end if;if (dcount = 8), tada - juk 8 duomenų bitai buvo perkelti atgal į neveikos būsenai.ack <= '1 '; - Rinkiniai ACK signalas aukšto po visų 8 duomenų bitai buvo gauta.

RST <= '1 ';

rs_state <= S0;end if;pabaigos atveju;galutinio proceso;pabaigos rs232_lport_behav;
 

Welcome to EDABoard.com

Sponsor

Back
Top