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



我最近开始自学VHDL。作为一个嵌入式系统程序员,语言本身及其结构不是什么大问题。我的问题是开发直观知识如何将我的代码映射到芯片上。当我为嵌入式处理器编写 C 代码时,我非常清楚代码是如何翻译(编译(的,以及如何在处理器中运行。这就是我想为 VHDL 创作开发的内容。 我正在阅读示例程序(我发现这通常不是一个好主意,因为它只显示您可以做什么,而不一定是应该如何做(

我特此提供一个示例程序的片段,以及在我的C-brain将其塑造成我可以更好地理解的东西之后的相同片段。

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

-- 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,我需要更好地了解结构以摆脱这些碍眼的东西。但是,也许这是最有效/最佳实践的方法。

我期待着对这个片段的任何批评。

提前感谢您抽出宝贵时间阅读和回复。

编辑:修复了计算错误。延迟是 16 毫秒而不是 16 毫秒。 第二次编辑:修复了错误。无法反转事件属性。

补遗: 这是我关于堆栈溢出的第一个问题,我注意到它已经被大量投票了。有人可以告诉我我做错了什么,这样我就可以在以后的问题中避免它。

好的,好的。只要读好主观,坏主观,我意识到我应该在其他地方提出这个问题。如何关闭此问题?

将时钟进程视为中央进程单元。现在将"中央"替换为"分布式并行",即类似于多个并行内核。

在您给出的示例中,延迟是通过计算时钟周期(在本例中为 800(来实现的。

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

注意:负边缘检测由 IF 实现(clk'EVENT AND clk='0'(

最新更新