打印
[技术讨论]

新手请教VHDL延迟的问题

[复制链接]
934|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaominjie|  楼主 | 2021-12-23 09:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
雪夜虫子| | 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 | 只看该作者
您说的计数器 我的代码整错了 我再想想

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

0

粉丝