我最近开始自学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属性。
附录: 这是我关于堆栈溢出的第一个问题,我注意到它已被否决。有人可以告诉我我做错了什么,以便在以后的问题中避免。
好的,好的。只要读好主观,不好主观,我意识到我应该把这个问题提出到别的地方。我该如何解决这个问题?
答案 0 :(得分:-1)
将时钟处理的过程视为中央处理单元。现在,将“中央”替换为“分布式并行”,即类似于多个并行核心。
在您给出的示例中,通过计数时钟周期(在这种情况下为800)来实现延迟。
条件测试IF(clk'EVENT AND clk ='1')在硅片中创建一个上升沿检测电路。在这种情况下,它会寻找clk信号的上升沿。然后,您需要决定在那些上升沿上做什么,以实现您的计时过程。
注意:负边缘检测是通过IF(clk'EVENT AND clk ='0')实现的