FPGA與單片機(jī)實(shí)現(xiàn)數(shù)據(jù)RS232串口通信的設(shè)計(jì)
begin
if reset='1' then
txcnt_r=(others=>'0');
sout1='1';
state=start1;
cou=0;
elsif txclk'event and txclk='1' then
case state is
when start1=>
if start='1' then
if cou=3 then
len=thr;
end if;
tsr:=thr(7 downto 0);
oddb1:=thr(7 downto 0);
sout1='0'; --起始位
txcnt_r=(others=>'0');
state=shift1;
else
state=start1;
end if;
when shift1=>
oddb=oddb1(7) xor oddb1(6) xor oddb1(5) xor oddb1(4) xor oddb1(3) xor oddb1(2) xor oddb1(1) xor oddb1(0);
sout1=tsr(0); --數(shù)據(jù)位
tsr(6 downto 0):=tsr(7 downto 1);
tsr(7):='0';
txcnt_r=txcnt_r 1;
if (txcnt_r=7) then
state=odd1;cou=cou 1;
end if;
when odd1=> --奇校驗(yàn)位
if oddb='1' then
sout1='0';state=stop1;
else
sout1='1';state=stop1;
end if;
when stop1=>
sout1='1'; --停止位
if cou4 then
state=start1;
else
state=start2;
end if;
when start2=>
tsr1:=thr(15 downto 8);
oddb2:=thr(15 downto 8);
sout1='0'; --起始位
txcnt_r=(others=>'0');
state=shift2;
when shift2=>
oddb=oddb2(7) xor oddb2(6) xor oddb2(5) xor oddb2(4) xor oddb2(3) xor oddb2(2) xor oddb2(1) xor oddb2(0);
sout1=tsr1(0);--數(shù)據(jù)位
tsr1(6 downto 0):=tsr1(7 downto 1);
tsr1(7):='0';
txcnt_r=txcnt_r 1;
if (txcnt_r=7) then
state=odd2;
end if;
when odd2=> --奇校驗(yàn)位
if oddb='1' then
sout1='0';state=stop2;
else
sout1='1';state=stop2;
end if;
when stop2=>
sout1='1'; --停止位
if len=0000000000000000 then
state=stop2;
else
state=start1;
len=len-1;
end if;
end case;
end if;
end process;
sout=sout1;
end behav;
評論