2015-12-11 2 views
0

Я пишу указанный компонент UART в VHDL.Как я могу создать «тик» внутри процесса в VHDL?

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?

ответ

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;