RS-232 prepojenia s FPGA

D

dadda007

Guest
Napísal som kód, aby v sériovej dáta z RS-232 a uložiť ich do registra.Mám v úmysle vytvárať 2 signály, jeden signál ack1 ktorý ide po vysokej platné štart bit bolo získané a ďalší signál ack2 po všetkých 8 dátových bitov boli prijaté správne.Ak chcete skontrolovať platnosť som použil prevzorkovania hodiny, ktoré vzorky každý bit trvania na 16 násobok prenosovej rýchlosti hodiny a používa maximálne logiku pre hodnotenie rovnaké.Avšak po simulácia som dostával žiadnu hodnotu do registra, a tiež chybné hodnoty pre ack1 a ack2 .... prosím pomôžte !!!!!

Kód:Knižnica IEEE;

použitie IEEE.STD_LOGIC_1164.all;subjektu rs232_lport jeport (dáta: v BIT;

clk_rs232: InOut STD_LOGIC;

Rýchlosť: v STD_LOGIC;

- Lport_clk: z BIT: = '0 ';

ack1: mimo BIT;

ack2: mimo BIT;

- Skontrolovať: v BIT;

- Lport_data: z BIT_VECTOR (3 downto 0);

input_reg: buffer BIT_VECTOR (7 downto 0): = "00000000");koniec subjektu;Architektúra rs232_lport_behav z rs232_lport jezdieľané premenné med, med1: BIT_VECTOR (4 downto 0);

zdieľané premenné i, lcount_16, DCOUNT, nos_0, nos_1: integer;

zdieľané premenné veľký, big1, dbit: bit;

zdieľané premenné first_4, last_4: BIT_VECTOR (3 downto 0);Typ state_rs232 je (S0, s1, s2);

Typ state_lport je (v nečinnosti, F4, L4);

signál l_state: state_lport;

signál rs_state: state_rs232 - Počiatočný stav je S0.začaťproces (dáta)začaťprípad rs_state jekeď S0 => - kľudový stav stavový automatif (data = '1 '), potom - ak dáta je potom nastavenie všetkých parametrov na nulu.ack1 <= '0 ';

rs_state <= S0 - Späť na kľudový stav .....inýrs_state <= s1, - Ak je dátová linka je nula, potom ísť do štátu S1.end if;pri s1 => - skontroluje platnosť štart bit.- Skontrolujte <= '1 ';pre lcount_16 v 1 až 16 slučke - kontroluje hodnota prvý štart bit.ack2 <= '0 ';

ack1 <= '0 ';if (clk_rs232'event) a (clk_rs232 = '1 ') a (clk_rs232'last_value = '0'), potomif (lcount_16 = 7) potom

med (0): = data;

end if;if (lcount_16 = 8), potom

med (1): = data;

end if;if (lcount_16 = 9) potom

med (2): = data;

end if;if (lcount_16 = 10) potom

med (3): = data;

end if;if (lcount_16 = 11) potom

med (4): = data;

end if;end if;koniec vedenia;pre i pri 0 až 4 slučky - kontroluje hodnotu štart bit za použitia maximálnej logiku.if (med (i) = '0 '), potom

nos_0: = nos_0 1;

end if;koniec vedenia;pre i pri 0 až 4 slučkyif (med (i) = 1 '), potom

nos_1: = nos_1 1;

end if;koniec vedenia;if (nos_1> nos_0), potom

veľká: = '1 ';

iný

veľká: = '0 ';

end if;if (veľký = '0 '), potom - ak hodnota štart bit je nula, potom nastavte hodnotu ack1 bit na jeden .....

ack1 <= '1 ';

rs_state <= s2, - Prejsť na štátnej s2inýack1 <= '0 ';

rs_state <= S0 - Ak je štart bit je 1 goto kľudovom stave.end if;keď s2 => - Tento stav trvá do hodnoty do registra a udržiava posunom.- If (ack1 = '1 '), potompre DCOUNT v 0 do 7 slučkyif (baudrate'event a prenosová rýchlosť = '1 '), potomdbit: = data;

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

input_reg (7) <= dbit;end if;koniec vedenia;ack2 <= '1 '; - Po všetkých 8 bitov boli posunuté nastaviť hodnotu ack2 bit vysoké.rs_state <= S0 - O stave S0, tj do pokojového stavu .....koniec prípadu;ukončenie procesu;koniec rs232_lport_behav;
 
Navrhujem použiť existujúce UART prijímača design ako šablónu.Pokiaľ ide o súčasné kód, som schopný forsey je to správanie.Pomocou hodiny citlivé výraz vnútri iteračné slučky je mimo môj obzor, a úplne unsynthesizable myslím.Simulátor môže našťastie prijať bez chýb, ale to nemusí nevyhnutne dávať zmysel kódu.

Je to všeobecne poučné písať takéto návrhy od nuly.Ale mali by ste dodržiavať obvyklé design pravidlá pre synchrónny prevedení s automatmi.Kompilácia design s nástrojom FPGA čoskoro môže pomôcť pri identifikácii unsynthesizable konštrukty.

 
Vďaka za odpoveď, som sa snažila sa na nasledujúci kód, ale s malým výsledkom ....

Kód:Knižnica IEEE;

použitie IEEE.STD_LOGIC_1164.all - hlavičkový súbor vyhláseniesubjektu rs232_lport jeport (

dáta: v BIT - vstup RS-232 dáta

clk_rs232: v STD_LOGIC; - aretačná hodiny

Rýchlosť: v STD_LOGIC - Bit rate

ack: z STD_LOGIC: = '0 '; - Acknoledge jede vysoké, keď je 8 dátových bitov pricestovať

input_reg: InOut BIT_VECTOR (7 downto 0): = "00000000"), - ukladá vstupná register sériových dátkoniec subjektu;Architektúra rs232_lport_behav z rs232_lport jeTyp state_rs232 je (S0, s1, s2) - 3 stavy receiever MFŠ

Typ state_lport je (v nečinnosti, F4, L4);

signál l_state: state_lport;

signál rs_state: state_rs232 - Počiatočný stav je S0.zdieľané premenné i, lcount_16, DCOUNT, nos_0, nos_1: integer: = 0;

zdieľané premenné med, med1: bit, - Obchody stredu vzorky.

signálu RST: STD_LOGIC: = '1 ';

- Zdieľané premenné ack_v: STD_LOGIC;začaťrxclk: proces (clk_rs232, RST) - Tento proces používa RS-232 hodinami a RST signál generovať prijímač hodiny.začaťif (RST = '0 '), potomif (clk_rs232'event a clk_rs232 = '1 '), potom - Generuje pult, ktorý drží na počítanie v dobe trvania zablokovania hodiny.if (lcount_16 = 15) potomlcount_16: = 0;inýlcount_16: = lcount_16 1;end if;end if;inýlcount_16: = 0;end if;ukončenie procesu;rx_fsm: proces (clk_rs232, RST) - MFŠ pre prijímacie modul.začaťprípad rs_state jekeď S0 => - kľudový stavif (data = '1 '), potomRST <= '1 ';

DCOUNT: = 0;

input_reg <= "00000000";

rs_state <= S0;inýrs_state <= s1;end if;pri s1 => - Tento štát kontroluje platnosť štart bit.RST <= '0 ';if (lcount_16 = 8), potom

med: = data;

end if;if (med = '0 '), potom - ak štart bit, je platné.

RST <= '1 ';

rs_state <= s2;

inak - Ak nie je ísť do pokojového stavu.

rs_state <= S0;

end if;keď s2 => - Tento stav vedie k presunu dátových bitov do vstupného registra.RST <= '0 ';if (DCOUNT <8) potom - Skúste mať 8 krát, tj do všetkých dátových bitov nedostala.if (lcount_16 = 8), potom - Take uprostred vzorky

med1: = data;

end if;if (lcount_16 = 15) potom - Na konci každej bit trvania posunu dátumu hodnoty do registra.

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

input_reg (7) <= med1;

DCOUNT: = DCOUNT 1; - Prírastok počítať.

rs_state <= s2, - Vráť sa do stavu S2, tj vrátiť sa do štátu, ktorý vedie k presunu dát hodnotu do registra.

end if;end if;if (DCOUNT = 8), potom - po všetkých 8 dátových bitov boli presunul späť do pokojového stavu.ack <= '1 '; - Súpravy ACK signál s vysokým po všetkých 8 dátových bitov už boli prijaté.

RST <= '1 ';

rs_state <= S0;end if;koniec prípadu;ukončenie procesu;koniec rs232_lport_behav;
 

Welcome to EDABoard.com

Sponsor

Back
Top