如何在这个下降沿抓住数据
我要在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,我现在就按照这个数据来写程序 你这样做肯定不行啊,先用DIOW的下降沿去抓数据。之后再用你的CLK采样DIOW的下降沿,有下降沿发生时表示数据已经锁存好。 我用的VHDL,看不懂你的代码。。。。如果DIOR的“1”是固定的时长,如T,可以在DIOR的上升沿启动一个计数t,在 t>T-t3 后抓数据。。。。 sme 发表于 2013-11-27 11:26
你这样做肯定不行啊,先用DIOW的下降沿去抓数据。之后再用你的CLK采样DIOW的下降沿,有下降沿发生时表示数 ...
这是不是意味着要使用这样的语句?
always @ (negedge DIOW)
begin
/*code*/
end
wangjun403 发表于 2013-11-27 11:41
这是不是意味着要使用这样的语句?
是的{:smile:} sme 发表于 2013-11-27 11:44
是的
我是要把这个数据写入到FIFO中去的
如果用DIOW作为时钟,写FIFO是会有问题的
因为FIFO的时钟在enable前就要有的 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早已经稳定了。 sme 发表于 2013-11-27 12:01
不是用DIOW作时钟操作FIFO!
always @(negedge DIOW)
谢谢,你说的这个办法可行 你用100M的时钟同时锁存DIOW和DD怎么不行? 蓝色风暴@FPGA 发表于 2013-11-27 12:27
你用100M的时钟同时锁存DIOW和DD怎么不行?
DIOW要锁存2次,才能得到下降沿
如果也同时锁存DD,也挺麻烦的 clk 同时锁存DIOW和DD
把DIOW下降沿作为写FIFO使能,当DIOW下降沿时把锁存的DD写入FIFO。 直接上逻辑分析仪吧,多采样一段时间,再分析数据 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快几倍。 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: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]