打印
[FPGA]

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

[复制链接]
756|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huawuque|  楼主 | 2014-10-22 20:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 huawuque 于 2014-10-22 20:04 编辑

问题:我现在想要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;


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

2.jpg (140.29 KB )

2.jpg

SA[VU{SCBQ}BTX[$NG2`MK4.jpg (73.5 KB )

SA[VU{SCBQ}BTX[$NG2`MK4.jpg

相关帖子

沙发
zhaojingzb| | 2014-10-23 10:41 | 只看该作者
用的是VHDL写的
上面的两张图看不清楚
搞得移位计数器,当FSX下降沿来了之后开始计数,计数到32,然后清0。
只有在计数器为非0的情况下才进行移位操作就可以了。

使用特权

评论回复
板凳
huawuque|  楼主 | 2014-10-23 20:04 | 只看该作者
zhaojingzb 发表于 2014-10-23 10:41
用的是VHDL写的
上面的两张图看不清楚
搞得移位计数器,当FSX下降沿来了之后开始计数,计数到32,然后清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;

使用特权

评论回复
地板
huawuque|  楼主 | 2014-10-23 20:11 | 只看该作者
zhaojingzb 发表于 2014-10-23 10:41
用的是VHDL写的
上面的两张图看不清楚
搞得移位计数器,当FSX下降沿来了之后开始计数,计数到32,然后清0。 ...

而且我只需让检测到第一个帧同步FSX的下降沿后才开始进行移位就可以了,所以就不知道那个计数条件该怎么添加、、、

使用特权

评论回复
5
zhaojingzb| | 2014-10-24 10:08 | 只看该作者
huawuque 发表于 2014-10-23 20:04
嗯,不过当FSX下降沿来了根据什么计数?比如:
进程1:--计数部分,但计数条件不好设置
process(clk)

当下降沿来了之后将count置为1,当count计数到32的时候清零,当count不为0的时候才进行计数器加1

使用特权

评论回复
6
zhaojingzb| | 2014-10-24 10:09 | 只看该作者
huawuque 发表于 2014-10-23 20:11
而且我只需让检测到第一个帧同步FSX的下降沿后才开始进行移位就可以了,所以就不知道那个计数条件该怎么 ...

只需要复位后的第一个下降沿?
那就再做一个信号指示一下就可以了。当指示信号有效的时候进行操作。

使用特权

评论回复
7
huawuque|  楼主 | 2014-10-24 14:12 | 只看该作者
zhaojingzb 发表于 2014-10-24 10:09
只需要复位后的第一个下降沿?
那就再做一个信号指示一下就可以了。当指示信号有效的时候进行操作。 ...

我都试了下,发现不能在移位那下功夫了,因为无论怎么设置都不能改变在第一个下降沿之前DX都已经默认为1的事实,即使在第一个下降沿开始后才给它移位,最终第一次还是移的是默认的全1值,因为移位是跟着发送时钟CLKX来的,在帧同步到来之前DX已经全为1了,即总线上的第一个值FFFFFFFF是去不掉的;

现在感觉只能产生一个新的帧同步FSX_1了,即把老的帧同步FSX1_NB往右delay一拍,让新的帧同步的第一个下降沿对应总线上全F之后的数值,不过不知道该如何更好的产生这个新的帧同步,还请大神指点一下、、、

使用特权

评论回复
8
huawuque|  楼主 | 2014-10-24 14:25 | 只看该作者
zhaojingzb 发表于 2014-10-24 10:09
只需要复位后的第一个下降沿?
那就再做一个信号指示一下就可以了。当指示信号有效的时候进行操作。 ...

就类似这张图一样,FSX_1是新产生的帧同步,它是老的帧同步FSX1_NB往右移一拍得到的,现在问题是这个新的帧同步总做不好,多发送几次数据时就会紊乱;
我是用检测帧同步下降沿计数来产生新的帧同步的,这种方法总是出问题,请大神指教哪错了?应该怎么改正呢?

--process1:检测帧同步下降沿,并对其进行计数
if(FSX_rr='1' and FSX_r = '0')then       
     FSR_cnt <= FSR_cnt + 1;

process2:产生新的帧同步FSX_1
if FSR_cnt = 1 then
FSX_2 <= FSR;
FSX_1 <= '1';
else
    if  FSR_cnt >= 2 then
       FSX_2 <= '1';
       FSX_1 <= FSR;
    end if;
end if;

最后产生的新的帧同步就是FSX_1,但这样做也会出现很多问题,不明白为什么???下图的FSX_1是理想情况时的新的帧同步

使用特权

评论回复
9
zhaojingzb| | 2014-10-24 14:51 | 只看该作者
huawuque 发表于 2014-10-24 14:25
就类似这张图一样,FSX_1是新产生的帧同步,它是老的帧同步FSX1_NB往右移一拍得到的,现在问题是这个新的 ...

明显是代码问题吧,和FSX应该没关系,不需要这么做

使用特权

评论回复
10
huawuque|  楼主 | 2014-10-24 14:57 | 只看该作者
zhaojingzb 发表于 2014-10-24 14:51
明显是代码问题吧,和FSX应该没关系,不需要这么做

那应该怎么把帧同步FSX往右delay一拍?

使用特权

评论回复
11
zhaojingzb| | 2014-10-24 15:10 | 只看该作者
huawuque 发表于 2014-10-24 14:57
那应该怎么把帧同步FSX往右delay一拍?

不好意思,现在都搞不清楚你的目的呢。
自己结合实际再想想吧,关键是如何解决根本问题,而不是想着解决自己创造出来的问题

使用特权

评论回复
12
huawuque|  楼主 | 2014-10-24 21:10 | 只看该作者
zhaojingzb 发表于 2014-10-24 15:10
不好意思,现在都搞不清楚你的目的呢。
自己结合实际再想想吧,关键是如何解决根本问题,而不是想着解决 ...

多谢了!又换了一种解决方法,暂时不用Mcbsp传输数据了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

1

粉丝