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

时间:2015-12-11 01:31:39

标签: vhdl fpga hdl

我正在用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信号的下降沿触发子组件运行。我想触发它​​两次,但我不知道如何产生第二个下降沿。

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

我有什么方法可以在bit_index = 1时生成下降边缘吗?

1 个答案:

答案 0 :(得分:3)

FPGA器件和相关综合工具针对同步逻辑进行了优化, 因此VHDL是时钟触发进程执行的地方。使用特定信号 触发流程执行,如在问题代码中,因此不符合 缩进的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;