搜索
bottom↓
回复: 14

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

[复制链接]

出0入0汤圆

发表于 2013-11-27 11:08:53 | 显示全部楼层 |阅读模式

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

  1. reg                         RegDelay0 , RegDelay1 ;
  2. wire                        RegRise ;
  3. wire                        RegFall ;

  4. assign          RegRise = (~RegDelay1) & RegDelay0 ;
  5. assign          RegFall = ~RegDelay1 & (~RegDelay0) ;
  6. always @ (posedge Clk or negedge RSTn)
  7. begin
  8.     if(~RSTn)
  9.         {RegDelay0,RegDelay1}    <=#`DELAY 2'b00 ;
  10.     else
  11.         {RegDelay1,RegDelay0}    <=#`DELAY {RegDelay0,Reg} ;
  12. end
复制代码


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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-11-27 11:26:09 | 显示全部楼层
你这样做肯定不行啊,先用DIOW的下降沿去抓数据。之后再用你的CLK采样DIOW的下降沿,有下降沿发生时表示数据已经锁存好。

出0入0汤圆

发表于 2013-11-27 11:41:31 | 显示全部楼层
我用的VHDL,看不懂你的代码。。。。如果DIOR的“1”是固定的时长,如T,可以在DIOR的上升沿启动一个计数t,在 t>T-t3 后抓数据。。。。

出0入0汤圆

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

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

  1. always @ (negedge DIOW)
  2. begin
  3.     /*code*/
  4. end
复制代码

出0入0汤圆

发表于 2013-11-27 11:44:02 | 显示全部楼层
wangjun403 发表于 2013-11-27 11:41
这是不是意味着要使用这样的语句?

是的

出0入0汤圆

 楼主| 发表于 2013-11-27 11:50:53 | 显示全部楼层

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

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

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

出0入0汤圆

发表于 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早已经稳定了。

出0入0汤圆

 楼主| 发表于 2013-11-27 12:23:20 | 显示全部楼层
sme 发表于 2013-11-27 12:01
不是用DIOW作时钟操作FIFO!

always @(negedge DIOW)

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

出0入0汤圆

发表于 2013-11-27 12:27:49 | 显示全部楼层
你用100M的时钟同时锁存DIOW和DD怎么不行?

出0入0汤圆

 楼主| 发表于 2013-11-27 13:28:15 | 显示全部楼层
蓝色风暴@FPGA 发表于 2013-11-27 12:27
你用100M的时钟同时锁存DIOW和DD怎么不行?

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

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

出0入0汤圆

发表于 2013-11-27 13:44:42 | 显示全部楼层
clk 同时锁存DIOW和DD
把DIOW下降沿作为写FIFO使能,当DIOW下降沿时把锁存的DD写入FIFO。

出0入0汤圆

发表于 2013-11-27 13:52:37 | 显示全部楼层
直接上逻辑分析仪吧,多采样一段时间,再分析数据

出0入0汤圆

发表于 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快几倍。

出0入0汤圆

发表于 2013-11-27 16:00:49 | 显示全部楼层
entity data_sample_top is
    Port ( clk : in  STD_LOGIC;
           dior : in  STD_LOGIC;
           dd : in  STD_LOGIC_VECTOR (15 downto 0);
           dd_fifo : out  STD_LOGIC_VECTOR (15 downto 0);
           dd_en_fifo : out  STD_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值。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 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 : in  STD_LOGIC;
           dior : in  STD_LOGIC;


你这个太理想化了。

T4 是10ns,CLK 也是10ns

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

2. 用DIOW的下降沿锁存DD,只要一组寄存器,用你的方法,要2组
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表