如何在VHDL中的同一进程中使用多个延迟计数器

时间:2013-04-01 17:10:24

标签: vhdl

需要实现多个延迟计数器以跟随等待时钟周期,可合成。

    if(clk'event and clk='1')then           
           if (StartTX = 1)then
                    TxBusy <= '1';
                    StartTxp <= '1';
                    Wait for 1 clock cycles;
                    StartTxp <= '0';
           End IF;

           IF (StartTX = 1)then
                    Wait x clock cycles  ;
                    StartTxM <= '1';
                    Wait 1 clock cycles;
                    StartTxM<= '0';
           End IF ;  

           IF (StartCal = 1) AND (StartInut =1 ) AND (IValid = 1)then
                    Wait 78 ns   ;
                   Interrupt <= '1'   ;  
                    Wait 1 clock cycle
                    Interrupt = 0
           End IF

2 个答案:

答案 0 :(得分:0)

重写为三个独立的状态机。如果必须,可以将这些组合成一个过程,但每个过程可能更简单,更清晰。

使用一个“等待X周期”的计数器:当你看到StartTX时,用X在空闲状态下加载它;在等待状态下递减,并在达到0时转换回空闲状态。

将78ns转换为第三个状态机的适当循环次数,并以与第二个状态机相同的方式实现。

答案 1 :(得分:0)

您可以对控制信号的状态变化事件做出反应作为起点。例如:

if(clk'event and clk='1')then 
      StartTx_Last<=StartTx; -- 1 clock cycle delayed copy of control signal
      StartTxp <= '0'; -- default value

       if (StartTX = 1 AND StartTx_Last=0) then -- activate signals only for one clock
                TxBusy <= '1';
                StartTxp <= '1';
                DelayCounter <= X; -- start delay counter
       End IF;

       -- set StartTxM after X clocks for 1 cycle
       case DelayCounter is
       when 1 => -- activity state
          StartTxM <= '1';
          DelayCounter<=0;
       when 0 => -- idle state
           StartTxM <='0';
       when others => -- delay states
          DelayCounter<=DelayCounter - 1;
       end case;
       ....

对于78ns延迟,你需要一个周期为t的时钟和一个n计数器,其中n * t = 78ns