|
本来以为写一个只发送的串口程序不难(实际感觉确实不难),可没想到出了个小问题把我难倒了。下面的程序烧录完后,串口就立刻处于发送状态,pc接到1个字节为0x00,按键没反应,大概过了半分钟(这是重点!!!)恢复正常,按键按下就发送,发送数据没错,一切正常。查了半天查不出哪里出错,故求救!
--顶层,50MHz,9600波特率
library ieee;
use ieee.std_logic_1164.all;
entity transfer is
port(clk : in std_logic;
TXD_START : in std_logic; --测试时外接按键
TXD_DATA_IN : in std_logic_vector(7 downto 0);
TXD_OUT : out std_logic; --串口发送位
TXD_DONE : out std_logic);
end transfer;
architecture behave of transfer is
component baud
port(clk : in std_logic;
bclk : out std_logic);
end component;
component txdmit
port(bclk : in std_logic;
TXD_START : in std_logic;
TXD_BUFFER : in std_logic_vector(7 downto 0);
TXD : out std_logic;
TXD_DONE : out std_logic);
end component;
signal bclk : std_logic;
begin
U1: baud port map(clk,bclk);
U2: txdmit port map(bclk,TXD_START,TXD_DATA_IN,TXD_OUT,TXD_DONE);
end behave;
--波特率产生
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity baud is
port(clk : in std_logic;
bclk : out std_logic);
end baud;
architecture behave of baud is
signal count : integer;
begin
process(clk)
begin
if(clk'event and clk='1')then
if(count<5208)then
count <= count + 1;
else
count <= 0;
end if;
if(count<2604)then
bclk <= '0';
else
bclk <= '1';
end if;
end if;
end process;
end behave;
--发送
library ieee;
use ieee.std_logic_1164.all;
entity txdmit is
port(bclk : in std_logic;
TXD_START : in std_logic;
TXD_BUFFER : in std_logic_vector(7 downto 0);
TXD : out std_logic;
TXD_DONE : out std_logic);
end txdmit;
architecture behave of txdmit is
signal state : std_logic_vector(3 downto 0):="0000";
begin
process(bclk,TXD_START)
begin
if(bclk'event and bclk='1')then
case state is
when"0000" => if(TXD_START='0')then state <= "0001";end if;
when"0001" => state <= "0010";--start
when"0010" => state <= "0011";--0
when"0011" => state <= "0100";--1
when"0100" => state <= "0101";--2
when"0101" => state <= "0110";--3
when"0110" => state <= "0111";--4
when"0111" => state <= "1000";--5
when"1000" => state <= "1001";--6
when"1001" => state <= "1010";--7
when"1010" => state <= "0000";--stop
when others => state <= "0000";
end case;
end if;
end process;
process(bclk)
begin
if(bclk'event and bclk='1')then
case state is
when"0000" => TXD <= '1';TXD_DONE <= '1';
when"0001" => TXD <= '0';TXD_DONE <= '0';--start
when"0010" => TXD <= TXD_BUFFER(0);TXD_DONE <= '0';--0
when"0011" => TXD <= TXD_BUFFER(1);TXD_DONE <= '0';--1
when"0100" => TXD <= TXD_BUFFER(2);TXD_DONE <= '0';--2
when"0101" => TXD <= TXD_BUFFER(3);TXD_DONE <= '0';--3
when"0110" => TXD <= TXD_BUFFER(4);TXD_DONE <= '0';--4
when"0111" => TXD <= TXD_BUFFER(5);TXD_DONE <= '0';--5
when"1000" => TXD <= TXD_BUFFER(6);TXD_DONE <= '0';--6
when"1001" => TXD <= TXD_BUFFER(7);TXD_DONE <= '0';--7
when"1010" => TXD <= '1';TXD_DONE <= '0';--stop
when others => TXD <= '1';TXD_DONE <= '1';
end case;
end if;
end process;
end behave; |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|