如何用VHDL中的8MHz时钟计算4us?

时间:2011-05-24 05:10:43

标签: vhdl

我需要检查公共汽车活动直到4us。所以我需要数数吧。时钟是8MHz。请帮助我。

以下代码是否有效?

process(sync_dw_reg,data_edge) 
begin 
 if(rst_n='1' or data_edge='1' )then 
    gapen<='0'; 
 elsif(falling_edge(sync_dw_reg))then 
    gapen<='1'; 
 end if; 
 end process; 

 process(dec_clk,sync_dw_reg,rst_n,gapen) 
 begin 
 if(rst_n='1')then 
    gapcnt<="000000"; 
 elsif(gapen='1')then 
  if(dec_clk'event and dec_clk='1')then
     if(gapcnt="111111")then 
        gaperr_bit<='1'; 
     elsif(data_edge='1')then --if this condition comes within 4us then no setting of error 
        gaperr_bit<='0'; 
        gapcnt<="000000"; 
     else gapcnt<=gapcnt+'1';
     end if; 
  end if; 
 end if;

结束过程;

1 个答案:

答案 0 :(得分:3)

一般情况下,计算出时钟频率为4us的时钟周期数。

更好的是,让VHDL为您完成工作。如果你的设计有一个全局包,其中有一个常量,它是时钟周期:

constant clock_period : time := 125 ns;
然后你可以这样做:

constant bus_timeout_for_example : natural := 4 us / clock_period;

然后,在您的流程中创建一个整数变量。每个时钟周期递增一次。当它达到你上面计算的数字时,那就是4 us的结束。

编辑: 现在你已经发布了一些代码:

  • 请勿将std_logic_vectors用于算术 - http://parallelpoints.com/node/3
  • 使整个事物与一个clk信号同步(即,你在灵敏度列表中只有dec_clk) - 如果你需要检测其他信号的“边缘”,则存储它们并在下一个时钟周期中对它们进行co,以查看它们是否存在改变了。让* _edge在你的整个设计中调用多个信号就是在寻找麻烦(作为一个新手)。然后gapen可以是一个进程中的变量。并查看“计时”部分内的gapen
  • 使用按我描述的方式计算的变量和整数类型 - 然后您可以与数字进行比较:if gapcnt = bus_timeout then