我正在制作一个MIDI接口。UART 工作正常,它将 8 位消息和标志一起发送到控制单元。当标志变高时,单元会将消息存储在一个寄存器中,并使 clr_flag 为高,以便再次将 UART 的标志设置为低。问题是我不能让这个 clr_flag 长一个时期。我需要它是一个周期长,因为这个信号还控制一个状态机,指示正在存储什么样的消息(例如,note_on -> key_note -> velocity)。
我的问题是,信号(在这种情况下为标志)如何仅在一个 clk 周期内触发脉冲?我现在所拥有的几乎在一个时钟周期内产生了一个脉冲,但我做了两次,因为标志还没有变成 0。我尝试了很多方法,现在我有了这个:
get_data:process(clk, flag)
begin
if reset = '1' then
midi <= (others => '0');
clr_flag <= '0';
control_flag <= '0';
elsif ((clk'event and clk='1') and flag = '1') then
midi <= data_in;
clr_flag <= '1';
control_flag <= '1';
elsif((clk'event and clk='0') and control_flag = '1') then
control_flag <= '0';
elsif((clk'event and clk='1') and control_flag = '0') then
clr_flag <= '0';
end if;
end process;
这个双脉冲或长于一个周期脉冲的问题(在此之前,我有一些东西使 clr_flag 成为两个周期的 clk 脉冲),是系统将通过两种状态而不是每个标志一个状态。
简而言之:当一个信号变高时(与它何时变低无关),应该在一个时钟周期内产生一个脉冲。
谢谢你的帮助。