我正在使用Altera大学LABS,但我使用的是一个略有不同设计的电路板,因此我不得不模仿实验室中使用的电路板显示为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组段驱动程序。
上面的代码除了讨厌的&#34; ghost&#34;字符。似乎正在发生的情况是,在发生字符更改时,启用可能保持较低,因此以下显示在第十五次启用时间内点亮。
从代码中可以看出,我正在拍摄4个7段显示输入并生成扫描,并且鬼魂总是在最后一次启用后的数字上 - 因此它也将从第4个显示到第1个显示。显然,当显示消隐时,这一点最为明显。
出于实验目的,此代码很好。但是,我希望能够更好地理解我所做的是为了让我能够更好地理解VHDL设计的理解。
有人可以建议我在这里需要掌握什么原则,或者至少如何对启用进行编码以使其在数字更改后下降?
注意我尝试过一个默认情况(都使用NULL并将DISPn设置为&#34; 1111&#34;)。我怀疑一种方法是扩展case语句,或者设置HEX,然后在连续的case语句中设置DISPn。但是否有其他可能有效的VHDL技巧?
干杯, 甲
答案 0 :(得分:0)
您的诊断可能有些错误。
检查电路板的原理图:Enables(称为Disp
)可能会驱动双极晶体管的基极进入饱和状态。然后 - 即使Hex
和Disp
在相同的增量周期中发生变化,外部晶体管中的电荷存储也会保持启用足够长的时间以查看重影。
修复是提供死区时间,将Enables关闭一会儿,直到启用晶体管完全关闭 - 可能是10微秒 - 然后你可以更改数字并重新启用时间。
您的解决方案可以简单地完成此任务,但代价是潜在亮度的一半。