搜索
bottom↓
回复: 3

请教大大大虾们 -- fpga串口发送程序的小小小问题

[复制链接]

出0入55汤圆

发表于 2011-5-28 09:30:08 | 显示全部楼层 |阅读模式
本来以为写一个只发送的串口程序不难(实际感觉确实不难),可没想到出了个小问题把我难倒了。下面的程序烧录完后,串口就立刻处于发送状态,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;

出0入0汤圆

发表于 2011-5-28 10:16:27 | 显示全部楼层
count要有个复位位0的状态,否则第一次上电数据不一定为0,你程序问题就是上了个RESET的控制

出0入55汤圆

 楼主| 发表于 2011-5-28 10:35:18 | 显示全部楼层
真是这样!!!楼上高手!

出0入55汤圆

 楼主| 发表于 2011-5-28 10:43:03 | 显示全部楼层
把signal count : integer;改为signal count : integer:=0;即可
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 13:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表