FPGA串口接收死机

2019-07-15 23:12发布

上位机使用labview与下位机FPGA进行双向通讯,波特率128000。程序运行十来秒后,上位机可以正常接收下位机发来的信号,但是下位机无法接收到上位机发来的信号,用示波器测了一下,串口线路中是有信号,所以本人分析是下位机串口接受程序出现了问题,或者有其他解决方法,求大神指点!
附下位机串口接受程序(借鉴的):
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity reciever is
--generic(framlenr:integer:=8);        --传送的数据位为8位   
   Port ( bclkr,rxdr:in std_logic;   --定义输入输出信号  
           r_ready:out std_logic;
            rbuf:out std_logic_vector(7 downto 0) );
end;
architecture Behavioral of reciever is
type states is (r_start,r_center,r_wait,r_sample,r_stop);--定义各子状态        
signal state:states:=r_start;
signal rxd_sync:std_logic;    -- rxd_sync内部信号,接受rxd输入
signal resetr:std_logic:='0';
begin

pro1:process(rxdr)      
begin
    if rxdr='0' then rxd_sync<='0';           
    else rxd_sync<='1';           
    end if;
end process;
pro2:process(bclkr,resetr,rxd_sync)            --主控时序、组合进程
variable count:std_logic_vector(3 downto 0); --定义中间变量
variable rcnt:integer:=0;                 -- rcnt为接收的数据位数计数               
variable rbufs:std_logic_vector(7 downto 0);      
begin
   if resetr='1' then
      state<=r_start;
      count:="0000";  --复位
   elsif rising_edge(bclkr) then               --波特率信号的上升沿   --状态机
      case state is         
         when r_start=>                   --状态1,等待起始位                  
              if rxd_sync='0' then
                 state<=r_center;            
                 r_ready<='0';            
                 rcnt:=0;  
              else
                 state<=r_start;
                 r_ready<='0';
              end if;   
         when r_center=>                --状态2,求出每位的中点
              if rxd_sync='0' then       --每个数据位被分为16等分,中点为8  
                 if count="0110" then
                    state<=r_wait;
                    count:="0000";                     
                 else
                    count:=count+1;
                    state<=r_center;                     
                 end if;         
              else
                 state<=r_start;
              end if;  
         when r_wait=>                  --状态3,等待状态                  
              if count>="1110" then        
                 if rcnt=8 then
                    state<=r_stop; -- rcnt=framlenr表示数据接收够8位              
                 else
                    state<=r_sample;            
                 end If;   
                 count:="0000";
              else
                 count:=count+1;
                 state<=r_wait;  
              end if;
         when r_sample=>rbufs(rcnt):=rxd_sync;  --状态4,数据位采样检测         
              rcnt:=rcnt+1;         
              state<=r_wait;
         when r_stop=>r_ready<='1';
              rbuf<=rbufs; --状态5,输出帧接收完毕信号  
              state<=r_start;
         when others=>state<=r_start;         
       end case;        
     end if;   
  end process;
end Behavioral;


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
879973578
1楼-- · 2019-07-16 02:12
我用led显示r_ready端口,正常时是闪烁的,异样后就保持不变了
南盗
2楼-- · 2019-07-16 06:10
vhdl不懂,看着费劲。。
南盗
3楼-- · 2019-07-16 08:17
只能建议lz用signaltap来观察相关的信号了。

一周热门 更多>