如何在 VHDL 中的进程内生成 "tick"?

How can I generate a "tick" inside a process in VHDL?

我正在用VHDL编写指定的UART组件。

send: process(send_start)
    variable bit_index : integer range 0 to 2 := 0;
begin
    if (falling_edge(send_start)) then
        if (start = '0' and transceiver_start = '1') then
            bit_index := 0;
        end if;

        transceiver_start <= '1';
        if (bit_index = 0) then
            temp_data <= data.RE;
            bit_index := 1;
            transceiver_start <= '0';
            delay_counter <= 0;
        elsif (bit_index = 1) then
            temp_data <= data.IM;
            bit_index := 2;
            transceiver_start <= '0';
        end if;
    end if;
end process;

transceiver_start 信号的下降沿触发子组件到 运行。我想触发两次,但我不知道如何产生第二个下降沿。

我考虑过使用并发进程,它基本上会在 delay_counter 达到某个限制后将 transceiver_start 信号重置为高状态。因此,我可以再次将其降低到 send 过程中以生成下降沿。但是,这使我对 delay_counter 信号有两个驱动过程,并且我读到具有分辨率函数并不是综合的好做法(此代码需要可综合。)

有什么方法可以让我在 bit_index = 1 时生成下降沿?

FPGA 设备和相关综合工具针对同步逻辑进行了优化, 因此是 VHDL,其中时钟触发进程执行。使用特定信号 问题代码中的trigger流程执行,因此不符合 缩进的 FPGA 和 VHDL 设计方法。

而是使用内部时钟来触发进程执行,通常是上升沿 时钟的边缘。进程内部的实际更新可以是有条件的 检测控制信号的变化,可以是 send_start.

process (clock) is
begin
  if rising_edge(clock) then
    send_start_prev <= send_start;  -- Previous for edge detection
    if ((send_start = '0') and (send_start_prev = '1')) then  -- Falling edge of send_start
      ...  -- More code
    end if;
  end if;
end process;

对于条件流程代码的重新运行,例如基于bit_index = 1,流程内容可以更新为:

    send_start_prev <= send_start;  -- Previous for edge detection
    rerun_request   <= '0';  -- Default no rerun
    if ((send_start = '0') and (send_start_prev = '1')) or  -- Falling edge of send_start
       (rerun_request = '1') then  -- Rerun request
      if bit_index = 1 then
        rerun_request <= '1';
      end if;
      ...  -- More code
    end if;