我正在用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
时生成下降边缘吗?
答案 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;