紧急求助关于移位以及接收数据的问题!
目前的情况是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