-1

我最近一直在编写一些代码,试图在 vhdl 中制作自动售货机。开始出现一些奇怪的错误,并设法将其缩小到我正在更新的显示值。该代码基本上假设能够在 7 段显示的显示格式之间切换。我会说它可以正常工作,但似乎随机冻结我更改为代码,在下面找到,有点用于调试,并注意到 case 语句中的值卡在某个值上。其余代码继续完美运行,因此我可以重置,它会再次运行。下面是有问题的代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity display_switch is
Port (  clk : in STD_LOGIC;
    reset: in STD_LOGIC;
    number : in  STD_LOGIC_VECTOR (13 downto 0);-- unsigned binary number
    hexid   : in std_logic_vector(15 downto 0); -- hex representation
    sel : in std_logic;             
    an : out std_logic_vector(3 downto 0);      
    seg : out  STD_LOGIC_VECTOR (6 downto 0);   -- 7 segment display
    dp,Led,Led1,Led2 : out std_logic);
  end display_switch;

  architecture bhv of display_switch is


type button_state is(dec,hex,deb);  -- states for display formats                                                   
signal current_display,next_display : button_state; 


process(clk, reset)
begin

if reset = '1' then     -- asynchronous reset
current_display <= dec;
next_display <= hex;
decp <= '1';            -- decimal point


elsif rising_edge(clk) then
  segm_display <= hexid;

 case current_display is
when dec =>     Led2 <= '1';
            Led1 <= '0';
            Led <= '0';
            decp <= '0';

            next_display <= hex;
        if sel = '1' then
        current_display <= deb;
        end if;
when hex => Led2 <= '0';
        Led1 <= '1';
        Led <= '0';
        decp <= '1';

        next_display <= dec;
        if sel = '1' then
        current_display <= deb;
        end if;
when deb => Led2 <= '0';
        Led1 <= '0';
        Led <= '1';

        if sel /= '1' then
        current_display <= next_display;
        end if;
when others => current_display <= dec;
end case;   
 end if;
 end process;
 end bhv;

基本上发生的情况是 case 语句中的输出值要么全部卡在“1”,要么全部卡在“0”。

谢谢

4

2 回答 2

0

您对下一个州的计算是可疑的。如果您使用的是同步过程(正如您确实在做的那样),则不需要next_display信号。只需将下一个状态值分配给即可current_display

于 2013-07-01T21:10:54.147 回答
0

我发现了问题。这是“sel”输入变量的时间问题。

添加了一个信号以在时钟上升沿存储该值。

temp <= sel;

然后改用那个临时变量。

于 2013-07-01T21:24:21.943 回答