7段显示和启用

时间:2015-07-12 01:59:24

标签: vhdl fpga intel-fpga

我正在使用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技巧?

干杯, 甲

1 个答案:

答案 0 :(得分:0)

您的诊断可能有些错误。

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

修复是提供死区时间,将Enables关闭一会儿,直到启用晶体管完全关闭 - 可能是10微秒 - 然后你可以更改数字并重新启用时间。

您的解决方案可以简单地完成此任务,但代价是潜在亮度的一半。