wangjun403 发表于 2013-11-27 11:08:53

如何在这个下降沿抓住数据


我要在DIOW下降沿的时候抓住这个数据,然后写到FIFO
但我现在的主clk只有100M,等用常规方法抓到DIOW的下降沿时,数据可以就没有了

reg                         RegDelay0 , RegDelay1 ;
wire                        RegRise ;
wire                        RegFall ;

assign          RegRise = (~RegDelay1) & RegDelay0 ;
assign          RegFall = ~RegDelay1 & (~RegDelay0) ;
always @ (posedge Clk or negedge RSTn)
begin
    if(~RSTn)
      {RegDelay0,RegDelay1}    <=#`DELAY 2'b00 ;
    else
      {RegDelay1,RegDelay0}    <=#`DELAY {RegDelay0,Reg} ;
end


我要怎么办,才能及时抓住这个数据

t4的最小时间为10ns,我现在就按照这个数据来写程序

sme 发表于 2013-11-27 11:26:09

你这样做肯定不行啊,先用DIOW的下降沿去抓数据。之后再用你的CLK采样DIOW的下降沿,有下降沿发生时表示数据已经锁存好。

lans0625 发表于 2013-11-27 11:41:31

我用的VHDL,看不懂你的代码。。。。如果DIOR的“1”是固定的时长,如T,可以在DIOR的上升沿启动一个计数t,在 t>T-t3 后抓数据。。。。

wangjun403 发表于 2013-11-27 11:41:37

sme 发表于 2013-11-27 11:26
你这样做肯定不行啊,先用DIOW的下降沿去抓数据。之后再用你的CLK采样DIOW的下降沿,有下降沿发生时表示数 ...

这是不是意味着要使用这样的语句?

always @ (negedge DIOW)
begin
    /*code*/
end

sme 发表于 2013-11-27 11:44:02

wangjun403 发表于 2013-11-27 11:41
这是不是意味着要使用这样的语句?

是的{:smile:}

wangjun403 发表于 2013-11-27 11:50:53

sme 发表于 2013-11-27 11:44
是的

我是要把这个数据写入到FIFO中去的

如果用DIOW作为时钟,写FIFO是会有问题的

因为FIFO的时钟在enable前就要有的

sme 发表于 2013-11-27 12:01:34

wangjun403 发表于 2013-11-27 11:50
我是要把这个数据写入到FIFO中去的

如果用DIOW作为时钟,写FIFO是会有问题的


不是用DIOW作时钟操作FIFO!

always @(negedge DIOW)
begin
        tmp_data        <=        DD;
end

利用DIOW只是把数据临时锁存起来。

你后续去操作FIFO,是把tmp_data去往fifo里写,如果你用本地时钟clk对DIOW作了下降沿检测的话,检测到下降沿时tmp_data早已经稳定了。

wangjun403 发表于 2013-11-27 12:23:20

sme 发表于 2013-11-27 12:01
不是用DIOW作时钟操作FIFO!

always @(negedge DIOW)


谢谢,你说的这个办法可行

蓝色风暴@FPGA 发表于 2013-11-27 12:27:49

你用100M的时钟同时锁存DIOW和DD怎么不行?

wangjun403 发表于 2013-11-27 13:28:15

蓝色风暴@FPGA 发表于 2013-11-27 12:27
你用100M的时钟同时锁存DIOW和DD怎么不行?

DIOW要锁存2次,才能得到下降沿

如果也同时锁存DD,也挺麻烦的

y595906642 发表于 2013-11-27 13:44:42

clk 同时锁存DIOW和DD
把DIOW下降沿作为写FIFO使能,当DIOW下降沿时把锁存的DD写入FIFO。

lyz1900 发表于 2013-11-27 13:52:37

直接上逻辑分析仪吧,多采样一段时间,再分析数据

sme 发表于 2013-11-27 15:40:17

y595906642 发表于 2013-11-27 13:44
clk 同时锁存DIOW和DD
把DIOW下降沿作为写FIFO使能,当DIOW下降沿时把锁存的DD写入FIFO。 ...

你这方法行不能的。

CLK是100MHz,t4=10ns,所以在t4的时间里,100MHz的CLK能不能采到都是个问题。

另外,你用CLK去采DD,别忘了DD是16位的并行数据,经过CLK采样后,要是采到DD变化的时候,采出来的数据可能互相之间相差10ns。另外DD和DIOW采样后也不是同步了。

至少在本案中是行不通的,除非CLK频率比T4快几倍。

y595906642 发表于 2013-11-27 16:00:49

entity data_sample_top is
    Port ( clk : inSTD_LOGIC;
         dior : inSTD_LOGIC;
         dd : inSTD_LOGIC_VECTOR (15 downto 0);
         dd_fifo : outSTD_LOGIC_VECTOR (15 downto 0);
         dd_en_fifo : outSTD_LOGIC);
end data_sample_top;

architecture Behavioral of data_sample_top is

signal dior_dl_1, dior_dl_2: STD_LOGIC;
signal dd_dl_1, dd_dl_2 :STD_LOGIC_VECTOR (15 downto 0);

begin

process(clk)
begin
        if clk'event and clk = '1' then
                dior_dl_1 <= dior;
                dd_dl_1 <= dd;
        end if;
end process;

process(clk)
begin
        if clk'event and clk = '1' then
                dior_dl_2 <= dior_dl_1;
                dd_dl_2 <= dd_dl_1;
        end if;
end process;

dd_en_fifo <= '1' when (dior_dl_2 = '1' and dior_dl_1 = '0') else '0';
dd_fifo <= dd_dl_2;

end Behavioral;

当dd_en_fifo <= '1' 发生时,采样点一个在t3内,一个在t4内(前提是t3大于t4,t4为10ns,clk为100MHz)
那么此时 dd_dl_2中存储的是t3点采集到的dd值,dd_dl_1中存储的是t4点采集到的dd值。

sme 发表于 2013-11-27 16:42:12

本帖最后由 sme 于 2013-11-27 16:44 编辑

y595906642 发表于 2013-11-27 16:00
entity data_sample_top is
    Port ( clk : inSTD_LOGIC;
         dior : inSTD_LOGIC;


你这个太理想化了。

T4 是10ns,CLK 也是10ns

1. 你用CLK来采,假设采样刚好发生在T3的结束,T4的开始,会怎样?
结果:
   A. DIOW有一个CLK的误差
   B. DD采样后位与位之间有1个CLK的误差(第一次采样如果发生在T4开始,第2次采样刚好发生在T4结束,此时数据在变化)
此时只有用第二级的结果是对的(因为在T3末的采样,DD是稳定的,在T4时的CLK来了之后,稳定数据移到了第2级)。
但你是用对DIOW信号采样的结果来确定是用第一级还是第二级,而T3结束的时候采到的DIOW刚好在变化

2. 用DIOW的下降沿锁存DD,只要一组寄存器,用你的方法,要2组
页: [1]
查看完整版本: 如何在这个下降沿抓住数据