微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 紧急求助关于移位以及接收数据的问题!

紧急求助关于移位以及接收数据的问题!

时间:10-02 整理:3721RD 点击:
问题:我现在想要FSX1_NB信号的第一个下降沿开始时才对发送过来的每一位数据DX1_NB进行左移操作(依次填充一个32位的buf数组中),该如何操作呢?
目前的情况是DX1_NB的默认初始值全是高电平,因为发送时钟一直存在,所以在FSX1_NB信号的第一个下降沿开始之前就已经把这些默认值1进行了移位,即buf数组里面最开始是FFFFFFFF,而不是把发送来的第一个数据进行移位,所以求助大家帮忙解决一下!
最初实现移位操作代码:
if(CLKX_rr ='1' and  CLKR_r = '0')then       
rcv_buf(0) <= DX;
rcv_buf(31 downto 1) <= rcv_buf(30 downto 0);这个是最初的移位代码,因为发送时钟始终存在,所以就把DX1_NB的默认初始值1在FSX1_NB第一个下降沿之前就进行了32次移位,但这并不是我想要的结果。

补充:说说我现在做的东西,目前是想要从DSP通过Mcbsp接口发送32位数据给FPGA接收,每个数据32位,先将DSP发来的每一位DX通过移位操作打包给32位的buf数组,然后一个帧同步FSX1_NB下降沿来一次就将一个32位数据buf给总线Mcbsp_Data,然后我要根据帧同步下降沿作为总线外面RAM的写请求,把对应的每一个32位数据写进RAM中。
          现在问题是第一个帧同步下降沿对应总线上接收的数据的总是FFFFFFFF,第二个下降沿对应的才是DSP发送的第一个数据,所以我想把FFFFFFFF去掉,如果去不掉就想着把帧同步往右移一个帧同步周期,让新的帧同步FSX_1第一个下降沿对应总线接收来自DSP发来的第一个数据,最终目的都是不要把FFFFFFFF写进RAM中,只写DSP发来的数据。

主要实现代码如下:

------FPGA接收来自DSP发送的每一位数据,并进行32位移位打包成32位数据包rcv_buf-----------
rcv :process(clk)
        begin
                if(clk'event and clk = '1')then
                     if(CLKR_rr ='1' and  CLKR_r = '0')then
                             rcv_buf(0) <= DR;
                             rcv_buf(31 downto 1) <= rcv_buf(30 downto 0);
                     end if;
                end if;
   end process;

-----根据每个帧同步下降沿来把 rcv_buf的值给总线端口------------
Data_latch :process(clk)
        begin
        if(clk'event and clk = '1')then
              if(FSR_rr='1' and FSR_r = '0')then     --帧同步下降沿检测
                   Mcbsp_Data <= rcv_buf;              --移位后的32位数据送给端口
               end if;
        end if;
    end process;

写了这么多,就是想让大家集思广益一下,项目急,只能来这寻求帮助了,写的啰嗦,不清楚的可以提一下,我再做解释,谢谢大家!




上面是两张图片

让移位时钟在帧同步前屏蔽呗

移位时钟就是Mcbsp的发送时钟,这个时钟是一直有的啊,怎么屏蔽?

让他经过一个开关再送给移位部分呗,然后你可以根据帧同步控制这个开关打开,然后你还可以对时钟计数32次后关闭这个开关;
这个FPGA应该能做到吧?

我在想如果做一个移位计数器,当FSX下降沿来了之后开始计数,计数到32,然后清0,只有在计数器为非0的情况下才进行移位操作就可以了。
问题是:我只需让检测到第一个帧同步FSX的下降沿后才开始进行移位就可以了,所以就不知道那个计数条件该怎么添加;
进程1:--计数部分,但计数条件不好设置
process(clk)
begin
if(clk'event and clk = '1')then
if(FSX_rr ='1' and  FSX_r = '0')then
  if(?) then --这里面的计数条件是什么?
      counter = counter + 1;
   if(counter = 32) then
      counter = 0;
   end if;
   end if;
   end if;
end if;
end process;
进程2:--移位操作
        rcv :process(clk)
        begin
        if(clk'event and clk = '1')then
        if(CLKR_rr ='1' and  CLKR_r = '0')then
                if(counter /= 0) then
                rcv_buf(0) <= DR;
                rcv_buf(31 downto 1) <= rcv_buf(30 downto 0);
               
         end if;
         end if;                        
        end process;

计数条件C=FSX下降沿 && !计数器值count
计数器清零=32+停止位长度
移位时钟=C && count<32

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

网站地图

Top