需要实现多个延迟计数器以跟随等待时钟周期,可合成。
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
答案 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