V
vaibhav_sinha
Guest
Hei.
Jeg har skrevet denne koden for RS232-mottakeren bruker 8-N-1-protokollen.Men koden ikke oppfører seg som forventet.Kan noen vennligst gå gjennom koden og feilsøke det?
library IEEE;
bruk ieee.std_logic_1164.all;
enhet får er
port (reset: i biter;
rx: i biter;
outp: ut bit_vector (7 downto 0);
clk:
I bit);
end motta;
architecture ARCH av få er
signal count: heltall rekkevidde 0 til 8000;
type stat (inaktiv, start, stopp, en, to, tre, fire, fem, seks, syv, åtte);
signal pr_state: tilstand;
signal nx_state: tilstand;
signal flagg: bit;
begynne
prosessen (clk, rx)
begynne
hvis reset ='1 'deretter
flagg <='0 ';
end if;
hvis pr_state = inaktiv og rx ='0 'deretter
flagg <='1 ';
end if;
end prosessen;
prosessen (flagg, pr_state, reset)
begynne
hvis reset ='1 'deretter
nx_state <= inaktiv;
end if;
tilfelle pr_state er
når inaktiv => hvis flagg ='0 'deretter
nx_state <= inaktiv;
ellers
nx_state <= start;
end if;
når start => nx_state <= en;
når en => nx_state <= to;
outp (7) <= rx;
når to => nx_state <= tre;
outp (6) <= rx;
da tre => nx_state <= fire;
outp (5) <= rx;
når fire =>
nx_state <= fem;
outp (4) <= rx;
når fem =>
nx_state <= seks;
outp (3) <= rx;
når seks =>
nx_state <= syv;
outp (2) <= rx;
når syv =>
nx_state <= åtte;
outp (1) <= rx;
når åtte =>
nx_state <= stop;
outp (0) <= rx;
når slutter =>
nx_state <= inaktiv;
end case;
end prosessen;prosessen (tilbakestilt, clk)
begynne
if (reset ='1 ') og deretter
count <= 0;
pr_state <= inaktiv;
ellers
if (clk'EVENT og clk ='1 ') og deretter
hvis count = 0 deretter
pr_state <= nx_state;
hvis pr_state = start deretter
count <= 7812;
elsif pr_state = stoppe deretter
count <= 0;
elsif pr_state / = inaktiv deretter
count <= 5208;
end if;
ellers
count <= telle-1;
end if;
end if;
end if;
end prosessen;
end hvelv;I denne koden, når en ny byte må være mottatt, har vi å tilbakestille først.Og flagget er påstått når start bit er oppdaget.
Klokken som benyttes er 50MHz og baudhastighet er 9600.
Derfor har jeg brukt en forsinkelse på 50000000/9600 = 5208 klokken sykluser.
For start bit, forsinkelsen er 7812 så å komme midt på bit.
Jeg har skrevet denne koden for RS232-mottakeren bruker 8-N-1-protokollen.Men koden ikke oppfører seg som forventet.Kan noen vennligst gå gjennom koden og feilsøke det?
library IEEE;
bruk ieee.std_logic_1164.all;
enhet får er
port (reset: i biter;
rx: i biter;
outp: ut bit_vector (7 downto 0);
clk:
I bit);
end motta;
architecture ARCH av få er
signal count: heltall rekkevidde 0 til 8000;
type stat (inaktiv, start, stopp, en, to, tre, fire, fem, seks, syv, åtte);
signal pr_state: tilstand;
signal nx_state: tilstand;
signal flagg: bit;
begynne
prosessen (clk, rx)
begynne
hvis reset ='1 'deretter
flagg <='0 ';
end if;
hvis pr_state = inaktiv og rx ='0 'deretter
flagg <='1 ';
end if;
end prosessen;
prosessen (flagg, pr_state, reset)
begynne
hvis reset ='1 'deretter
nx_state <= inaktiv;
end if;
tilfelle pr_state er
når inaktiv => hvis flagg ='0 'deretter
nx_state <= inaktiv;
ellers
nx_state <= start;
end if;
når start => nx_state <= en;
når en => nx_state <= to;
outp (7) <= rx;
når to => nx_state <= tre;
outp (6) <= rx;
da tre => nx_state <= fire;
outp (5) <= rx;
når fire =>
nx_state <= fem;
outp (4) <= rx;
når fem =>
nx_state <= seks;
outp (3) <= rx;
når seks =>
nx_state <= syv;
outp (2) <= rx;
når syv =>
nx_state <= åtte;
outp (1) <= rx;
når åtte =>
nx_state <= stop;
outp (0) <= rx;
når slutter =>
nx_state <= inaktiv;
end case;
end prosessen;prosessen (tilbakestilt, clk)
begynne
if (reset ='1 ') og deretter
count <= 0;
pr_state <= inaktiv;
ellers
if (clk'EVENT og clk ='1 ') og deretter
hvis count = 0 deretter
pr_state <= nx_state;
hvis pr_state = start deretter
count <= 7812;
elsif pr_state = stoppe deretter
count <= 0;
elsif pr_state / = inaktiv deretter
count <= 5208;
end if;
ellers
count <= telle-1;
end if;
end if;
end if;
end prosessen;
end hvelv;I denne koden, når en ny byte må være mottatt, har vi å tilbakestille først.Og flagget er påstått når start bit er oppdaget.
Klokken som benyttes er 50MHz og baudhastighet er 9600.
Derfor har jeg brukt en forsinkelse på 50000000/9600 = 5208 klokken sykluser.
For start bit, forsinkelsen er 7812 så å komme midt på bit.