微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 串口数据发送遇到的问题

串口数据发送遇到的问题

时间:10-02 整理:3721RD 点击:
我对AD采集的数据进行1s统计,统计 完后直接由串口发往上位机,现在1s统计量也能正常统计(共6个字节),串口也能以1s间隔往上位机上传数据,但是发现串口往上位机传输的一直都是6个字节的00,也就是说统计量没有正确地输送给串口模块。我把统计量传递给串口模块的程序贴上,还有SignalTap II上看到的1s统计量截图贴上。截图上Dataout数据就是1s统计量 2B0H,可以看到在1s定时(timer1s信号)到来时,统计量也相应出现了数据,但是Dataout传递给串口的数据rData可以看到却是00,也就是没传递过来,为什么?另外,从RTL电路图上看,数据之间的传输线是连接上的,因此,问题有点疑惑。麻烦各位了!
module control_module
(
         clk_a,RSTn,
         TX_Done_Sig,
         timer1s,
         Data_out,
         TX_En_Sig,TX_Data
);
input clk_a;
input RSTn;
input TX_Done_Sig;
input timer1s;
input [47:0] Data_out;

output TX_En_Sig;
output [47:0] TX_Data;
reg isEn;
reg [47:0] rData;
always @ ( posedge clk_a or negedge RSTn )
         begin
         if ( !RSTn )
                 begin
                         isEn <= 1'b0;
                         rData <= 0;
                 end
     else if ( TX_Done_Sig )
                 begin
                         isEn <= 1'b0;
                 end
     else if ( timer1s )   //1s定时到,统计量Data_out传递给rData用于串口传输
            begin
                 rData <= Data_out;
                 isEn <= 1'b1;
                 end
         end
assign TX_Data = rData;
assign TX_En_Sig = isEn;
endmodule


else if ( TX_Done_Sig )
                 begin
                         isEn <= 1'b0;
                 end
没有抓取   其次跨时钟域看看



   如果 TX_Done_Sig 信号一直为1'b1的话,那是进不了下面的。

timer1s和Data_out没有重合的地方,你的data_out应该是用timer1s打出来的吧,你后面又用timer1s作为有效信号去采样data_out,当然采不到啊。
你可以把timer1s打一拍。
always @ ( posedge clk_a or negedge RSTn ) begin
if(!RSTn) timers1s_reg <= 'b0;
else timers1s_reg <= timers1s;
end
然后用timers1s_reg作为valid信号去采样data_out.
     else if ( timer1s_reg )   //1s定时到,统计量Data_out传递给rData用于串口传输
            begin
                 rData <= Data_out;
                 isEn <= 1'b1;
                 end
         end




Tx_Done信号已经抓取,不可能一直为正,因为我的串口是发送成功的!而且是每秒发送1次,没问题的这点!


感谢回复,按照您的方法进行修改验证,发现问题依旧,我把SignalTap II看到的信号截图上传上来。




   放大timer_1s那个点的波形,我初略看,在timer_1s那个周期,data_out的数据好像就是 0,你check一下



    Data_out刚好是在timer1s从高转低时刻,出现数据!所出数据具体数值即为number5_8这个数值。



   那你觉得这样 rData 能采到 Data_out 的数据吗?
这样是采不到的啊!Data_out 在 time_1s 后面1个周期,这怎么采。


那我应该怎么样才能采到?延迟半个周期再采集?



   你应该延时time_1s一个周期采样才行吧。
你要确保time_1s和你要采样的数据时对其的啊,也就是同一个cycle里面,两者都有效!


你好!很感谢回复。我后来引入tiemr1s_reg作为变量传递的有效信号(根据3楼的回复),可是即使引入这个触发信号,相当于延时一个时钟,可是结果依旧没变化啊?为什么?
用timers1s_reg作为valid信号去采样data_out.
      else if ( timer1s_reg )   //1s定时到,统计量Data_out传递给rData用于串口传输
            begin
                  rData <= Data_out;
                  isEn <= 1'b1;
                  end
          end



   你能把你模块的时钟clka和复位都拉出来看看么。然后再把timer_1s有效的地方放大看看,参照时钟信号看看时序

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top