新手问题:VHDL最佳实践/效率

时间:2020-01-17 20:56:02

标签: vhdl

我最近开始自学VHDL。作为嵌入式系统程序员,语言本身及其构造不是什么大问题。我的问题是直观知识的发展,如何将我的代码映射到芯片上。当我为嵌入式处理器编写C代码时,我对如何转换(编译)代码以及如何在处理器中运行代码有一个很好的了解。这就是我要为VHDL创作开发的内容。 我正在阅读示例程序(我发现这通常不是一个好主意,因为它只会向您显示可以完成的事情,而不一定向您说明应该如何做)

在此,我呈现了一个示例程序的代码段,并在我的C大脑将其模制成更好理解的代码后,给出了相同的代码段。

我的问题是; “我所做的事情是否转化为在硅上或多或少有效的实施。我是否违反了最佳实践。”

示例

    -- Create a delay pulse of 16us when a key is pressed
    PROCESS( clk, rst )
    BEGIN
        IF( NOT rst = '1' ) THEN
            cnt_delay <= "00000000000000000000";
            start_delaycnt <= '0';
        ELSIF( clk'EVENT AND clk='1' ) THEN
            IF( start_delaycnt = '1' ) THEN
                IF (cnt_delay /= "11000011010100000000") THEN   -- 800.000 -> cnt_delay pulse is 16us long
                    cnt_delay <= cnt_delay + "00000000000000000001";
                ELSE
                    cnt_delay <= "00000000000000000000";
                    start_delaycnt <= '0';
                END IF;
            ELSE
                IF( (NOT key_input='1') AND (cnt_delay = "00000000000000000000") ) THEN
                    start_delaycnt <= '1';
                END IF;
            END IF;
        END IF;
    END PROCESS;

我的尝试:

    -- Create a delay pulse of 16us when a key is pressed
    PROCESS( clk, rst )
    BEGIN
        -- in reset -> reset our output signal and reset the counter
        IF( NOT rst = '1' ) THEN
            cnt_delay <= "00000000000000000000";
            start_delaycnt <= '0';
-- Edit Fixed bug. Cannot invert EVENT attribute
--      -- No clock transition -> do nothing
--      ELSIF( NOT( clk'EVENT AND clk='1' ) ) THEN

--      -- Key pressed and not currently in a delay -> start the delay
--      ELSIF( (NOT key_input='1') AND (start_delaycnt = '0') ) THEN

        -- On positive clock edge -> do work
        ELSIF( clk'EVENT AND clk='1' ) THEN

            -- Key pressed and not currently in a delay -> start the delay
            IF( (NOT key_input='1') AND (start_delaycnt = '0') ) THEN

            start_delaycnt <= '1';

        -- If we are currently in a delay and we have not reached the end it yet -> increase the counter
        ELSIF( (start_delaycnt = '1') AND (cnt_delay /= "11000011010100000000") ) THEN  -- 800.000 -> cnt_delay pulse is 16ms long
            cnt_delay <= cnt_delay + "00000000000000000001";

        -- If we are currently in a delay and we have reached the end -> reset our output signal and reset the counter
        ELSIF( start_delaycnt = '1' ) THEN
            cnt_delay <= "00000000000000000000";
            start_delaycnt <= '0';
        END IF;

        END IF;

    END PROCESS;

我知道一串elsifs并不是很理想,但是正如我所说,我仍在学习VHDL,我需要对结构有一些更好的了解以摆脱这些烦恼。但是,也许这是最有效/最佳的实践方法。

我期待对此片段的任何批评。

预先感谢您抽出宝贵的时间阅读和回复。

edit:修复了计算错误。延迟是16us而不是16ms。 第2次修改:修复了错误。无法反转EVENT属性。

附录: 这是我关于堆栈溢出的第一个问题,我注意到它已被否决。有人可以告诉我我做错了什么,以便在以后的问题中避免。

好的,好的。只要读好主观,不好主观,我意识到我应该把这个问题提出到别的地方。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:-1)

将时钟处理的过程视为中央处理单元。现在,将“中央”替换为“分布式并行”,即类似于多个并行核心。

在您给出的示例中,通过计数时钟周期(在这种情况下为800)来实现延迟。

条件测试IF(clk'EVENT AND clk ='1')在硅片中创建一个上升沿检测电路。在这种情况下,它会寻找clk信号的上升沿。然后,您需要决定在那些上升沿上做什么,以实现您的计时过程。

注意:负边缘检测是通过IF(clk'EVENT AND clk ='0')实现的