VHDL时钟或触发器Upscaler延迟

时间:2015-03-13 11:01:06

标签: vhdl

我在FPGA上开发控制算法,但我不能声称自己具有VHDL经验。我需要的一个功能是一种“触发器”,所以我想提高触发频率而不是降低触发频率。

以下是解释:

enter image description here 我得到了一个50 MHz的系统clk,并获得了1个clk周期的触发脉冲,频率为1 kHz,因此每个ms一个。这个触发器是某些微积分的开始,它必须运行得比这快。所以我想知道我是否可以生成10 kHz的新触发器。这是我到目前为止的基本代码:

  calc_prescaler: process

 begin
  wait until rising_edge(clk);

  -- When a new trig appears, send 1 tick and reset counters
  if trig_in = '1' then
     cnt_clk    <= (others => '0');
     cnt_active <= '1';
     trig_out <= '1';
     trig_count <= (others => '0');
  else 
     trig_out <= '0';

     -- Safety feature: Do not send more ticks than estimated
     -- Useful in case trig_in freezes
     if trig_count > par_max - 1 then
        cnt_active <= '0';
        trig_count <= (others => '0');
     end if; 

     if cnt_active = '1' then
        cnt_clk <= cnt_clk + 1; 
     end if;

     -- If Counter reaches desired values, send 1 tick and increase tick counter
     if cnt_clk = par_fac - 1 then
        trig_count <= trig_count + 1;
        trig_out <= '1';
        cnt_clk <= (others => '0');
     end if; 
  end if; 


  -- Reset
  if res_n = '0' then   

    trig_out        <= '0';

    cnt_clk         <= (others => '0');
    trig_count      <= (others => '0');
    cnt_active      <= '0';                 

  end if;

有两个变量par_fac with是所需(较高)触发频率与系统clk之间的比率,par_max是trig_out上的滴答数,如果没有新的trig_in。

目前为我工作,但问题是两个触发器不同步,延迟时间为1 clk。

您对如何修改我的方法有任何建议吗?任何实施方式都是受欢迎的,我唯一的要求是: - trig_in和trig_out之间没有延迟 - 如果trig_in滴答停止

,则没有trig_out滴答

1 个答案:

答案 0 :(得分:0)

在任何顺序逻辑中,输出始终相对于输入延迟一个时钟周期。这意味着您无法为流程中的每个触发器输入生成第一个滴答。

if trig_in = '1' then
    cnt_clk    <= (others => '0');
    cnt_active <= '1';
    --trig_out <= '1'; don't do this
    trig_count <= (others => '0');

对于剩余的滴答,只需使用较低的计数器值在一个时钟周期生成它们:

if cnt_clk = par_fac - 1 then
   trig_count <= trig_count + 1;
   --trig_out <= '1'; don't do this
   cnt_clk <= (others => '0');
end if;
-- instead:
if cnt_clk = par_fac - 2 then
    trig_out <= '1';
end if;

然后,在此过程之外,无论您以前使用过哪里trig_out,现在都使用trig_in or trig_out