VHDL代码在Nexys2上未正确运行

VHDL代码在Nexys2上未正确运行,vhdl,fpga,Vhdl,Fpga,该代码选择LED或7段显示,以显示我通过开关输入的8位数据。我通过按钮选择led或7段。当我尝试在我的nexys2板上运行它时,led部分工作正常,但当我按下按钮时,所选的7segment会发光,并随着led发光而改变其值。另外,只有当我再次按下按钮时,7段才会改变它的值。我是一个新手,我想我很难做出一个好的逻辑或者问题是什么?任何帮助都将不胜感激 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; ent

该代码选择LED或7段显示,以显示我通过开关输入的8位数据。我通过按钮选择led或7段。当我尝试在我的nexys2板上运行它时,led部分工作正常,但当我按下按钮时,所选的7segment会发光,并随着led发光而改变其值。另外,只有当我再次按下按钮时,7段才会改变它的值。我是一个新手,我想我很难做出一个好的逻辑或者问题是什么?任何帮助都将不胜感激

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


entity selector is 
Port ( clk: in STD_LOGIC;
sel : in  STD_LOGIC;
comb : in STD_LOGIC_VECTOR (7 downto 0);
segment : out  STD_LOGIC_VECTOR (3 downto 0);
number : out  STD_LOGIC_VECTOR (6 downto 0);
led: out STD_LOGIC_VECTOR (7 downto 0));
end selector;

architecture Behavioral of selector is

begin
process (clk, comb, sel) begin
    if (clk'event and clk = '1') then
        if sel = '1' then
            segment <= "1110";
                case (comb) is 
            when "00000000" => number <= "0000001"; --0
            when "00000001" => number <= "1001111"; --1
            when "00000010" => number <= "0010010"; --2
            when "00000011" => number <= "0000110"; --3
            when "00000100" => number <= "1001100"; --4
            when "00000101" => number <= "0100100"; --5
            when "00000110" => number <= "0100000"; --6
            when "00000111" => number <= "0001111"; --7
            when "00001000" => number <= "0000000"; --8
            when "00001001" => number <= "0000100"; --9
            when others => number <= "1111111"; -- off
        end case;
    elsif sel = '0' then 
                case (comb) is 
            when "00000000" => led <= "00000000"; --0
            when "00000001" => led <= "00000001"; --1
            when "00000010" => led <= "00000011"; --2
            when "00000011" => led <= "00000111"; --3
            when "00000100" => led <= "00001111"; --4
            when "00000101" => led <= "00011111"; --5
            when "00000110" => led <= "00111111"; --6
            when "00000111" => led <= "01111111"; --7
            when "00001000" => led <= "11111111"; --8
            when others => led <= "00000000"; -- off
                end case;
    end if;
end if;
end process;

end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体选择器是
端口(时钟:在标准逻辑中;
sel:标准逻辑中;
梳:标准逻辑向量中(7到0);
段:输出标准逻辑向量(3到0);
编号:输出标准逻辑向量(6至0);
led:输出标准逻辑向量(7到0);
末端选择器;
选择器的体系结构是
开始
过程(时钟、梳状、sel)开始
如果(clk'事件和clk='1'),则
如果sel='1',则

段号编号led led led您没有更改未选择的输出值,因此它保持上次分配的状态


此外,您的代码您的代码只会对时钟的上升沿产生影响,因此灵敏度列表可以减少到
(clk)
(此时,暗示
clk'事件)。

是的,我需要清除以前的状态。但是你确定第二部分吗?代码取决于具体情况,我需要把它的值放在过程中,不是吗?另外,如何清除以前的输入?有什么线索吗?灵敏度列表不是所有输入的列表,只是那些值的变化会瞬间改变过程输出的输入。如果
comb
sel
发生变化,但没有时钟上升沿,则该过程不会执行任何操作。您可以通过重置可能仍具有先前状态的任何输出来清除先前状态。在您的情况下,在设置
number
number'1')之后分配
led'1')
led
后,code>应该可以起作用。现在可以正常工作了。你是对的。但我在道格拉斯杂志上读到,如果你有一个组合电路,你需要把所有的输入放在灵敏度列表中!组合电路没有时钟,因此输入的变化会立即传播,使过程输出对所有输入都敏感。