我在FPGA上开发控制算法,但我不能声称自己具有VHDL经验。我需要的一个功能是一种“触发器”,所以我想提高触发频率而不是降低触发频率。
以下是解释:
我得到了一个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滴答答案 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
。