我正在通过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
)驱动双极晶体管的基极进入饱和。然后-即使Hex
和Disp
在相同的增量周期中变化,外部晶体管中的电荷存储保持使能足够长的时间以看到幽灵。
解决方法是提供一个死区时间,将使能开关关闭一小段时间,直到使能晶体管完全关闭——可能是10微秒——然后你可以改变数字并同时重新使能。
您的解决方案简单而优雅地实现了这一点,但代价是潜在亮度降低了一半。