如何在 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;
我正在用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;