gaominjie 发表于 2021-12-23 09:53

新手请教VHDL延迟的问题

CLK和IN是输入,OUT是要延迟输出的信号。
我想要在IN的上升沿使OUT输出高电平保持4个CLK后再恢复为低电平
我是新手,写来写去,折腾了好久,都仿真出不了图上预期的效果
希望得到大家的指点,谢谢!

雪夜虫子 发表于 2021-12-23 10:41

本帖最后由 雪夜虫子 于 2021-12-23 10:43 编辑

先取IN的上升沿(IN AND (NOT IN_dly1)),再把上升沿延迟3个周期,最后把上升沿和它的延迟1周期、2周期、3周期的三个版本OR一下。

也可以先取IN的上升沿,用上升沿将一个信号(OUT_A)拉高,同时启动一个模三的计数器,在计数器计数3个周期时把信号(OUT_A)拉低,最后用OUT_A和上升沿OR一下。这个可以满足任意周期长度的需要,且只有1个OR,时序会更好。

gaominjie 发表于 2021-12-23 13:31

本帖最后由 gaominjie 于 2021-12-23 13:36 编辑

雪夜虫子 发表于 2021-12-23 10:41
先取IN的上升沿(IN AND (NOT IN_dly1)),再把上升沿延迟3个周期,最后把上升沿和它的延迟1周期、2周期、 ...
谢谢您的耐心指导!我试着用第2种方法,可我没有准确理解您的意思,而且代码也不一定对,等您有空了再指点我一下。谢谢!

signal OUT_A: std_logic;
signal INBUF: std_logic_vector(0 to 1);

      process(CLK)
      begin
                if CLK'event and CLK = '1' then
                        INBUF(0) <= IN_PIN;
                        INBUF(1) <= INBUF(0);
                end if;
      end process;

      process(CLK)
      variable CNT3: integer range 0 to 3;
      begin
                if CLK'event and CLK = '1' then
                        if INBUF(0) = '1' and INBUF(1) = '0' then --IN上升沿
                              OUT_A <= '1';
                              CNT3 := CNT3 + 1;
                        end if;
                        if CNT3 = 3 then
                              CNT3 := 0;
                              OUT_A <= '0';
                        end if;
                        OUT_PIN <= OUT_A or INBUF(0);
                end if;
      end process;

gaominjie 发表于 2021-12-23 13:43

您说的计数器 我的代码整错了 我再想想
页: [1]
查看完整版本: 新手请教VHDL延迟的问题