7段显示和使能之间的定时



我正在通过Altera大学实验室工作,但我使用的是一个稍微不同的设计板,所以我不得不模仿实验室显示到7段LED中使用的板的方式。

我用下面的代码对它进行了排序:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY DE1_disp IS
   PORT ( HEX0, HEX1, HEX2, HEX3: IN STD_LOGIC_VECTOR(6 DOWNTO 0);
             clk : IN STD_LOGIC;
             HEX : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
             DISPn: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END DE1_disp;
ARCHITECTURE Behavior OF DE1_disp IS
   COMPONENT sweep 
       Port ( mclk      : in  STD_LOGIC;
              sweep_out : out  std_logic_vector(1 downto 0));
   END COMPONENT;
   SIGNAL M : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN -- Behavior
    S0: sweep PORT MAP (clk,M); 
    DISPProcess: process (clk,M) is
    begin
       CASE M IS
            WHEN "00" => HEX <= HEX0; DISPn <= "1110"; 
            WHEN "01" => HEX <= HEX1; DISPn <= "1101";
            WHEN "10" => HEX <= HEX2; DISPn <= "1011";
            WHEN "11" => HEX <= HEX3; DISPn <= "0111"; 
        END CASE;
    end process DISPProcess;
END Behavior;

要点是我的板有很多段驱动程序,你必须扫描LED使能。而LAB板只有n组段驱动器。

上面的代码可以正常工作,除了一个讨厌的"鬼"字符。似乎正在发生的事情是,启用可能保持低,而一个字符的变化正在发生,所以下面的显示是点亮第十五个启用时间。

正如您从代码中看到的,我正在使用四个7段显示输入并生成扫描,并且鬼总是在最后启用后的数字上-因此它也将从第4次显示到第1次显示。显然,这在显示为空时最为明显。

对于实验的目的,这段代码是好的。然而,我很想更好地理解我做了什么来招致鬼的理解,这将有助于我更多地理解VHDL设计。

有谁能建议我在这里需要掌握什么原则,或者至少如何编码使能,使其在数字变化后下降?

注意我已经尝试了一个默认情况下(使用NULL和设置DISPn为"1111")。我怀疑这样做的一种方法是展开case语句,或者设置HEX,然后在连续的case语句上设置DISPn。但是还有其他的VHDL技巧可以工作吗?

欢呼,

你的诊断可能有一点错误。

检查电路板的原理图:很可能使能(称为Disp)驱动双极晶体管的基极进入饱和。然后-即使HexDisp在相同的增量周期中变化,外部晶体管中的电荷存储保持使能足够长的时间以看到幽灵。

解决方法是提供一个死区时间,将使能开关关闭一小段时间,直到使能晶体管完全关闭——可能是10微秒——然后你可以改变数字并同时重新使能。

您的解决方案简单而优雅地实现了这一点,但代价是潜在亮度降低了一半。

最新更新