我正在做一个MIDI接口。UART工作正常,它将8位消息以及标志发送到控制单元。当标志变高时,单元会将消息存储在寄存器中,并将clr_flag变高,以便再次将UART的标志设置为低。问题是我不能将此clr_flag设置为一个周期长。我需要将其设置为一个周期长,因为该信号还控制一个状态机,该状态机指示正在存储的消息类型(例如,note_on-> key_note->力度)。
我的问题是,信号(在这种情况下为标志)如何仅在一个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;
Run Code Online (Sandbox Code Playgroud)
这个双脉冲或长于一个周期脉冲的问题(在此之前,我使clr_flag成为两个周期的clk脉冲)是系统将经过两个状态而不是每个标志一个。
简而言之:当一个信号变高时(与何时变低无关),应在一个时钟周期内产生一个脉冲。
谢谢你的帮助。