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;
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;