2015-05-28 49 views
1

对矢量中的每个位执行端口映射的最佳方式是什么?假设我有一个代表一系列按钮的向量,并且希望使用一个跳动模块来消除每个按钮,我应该怎么做?矢量中每个位的VHDL映射

现在我有以下的,但我相信应该有更好的方式

entity ButtonDebouncer is 
    Port (
     clock : in std_logic; 
     buttons : in std_logic_vector(0 to 5); 
     --{ more stuff } 
    ); 
end ButtonDebouncer; 

architecture Behavioral of ButtonDebouncer is 
    signal bufferedButtons : std_logic_vector(0 to 5) := (others => '0'); 
begin 
    c1: entity debounce port map (Clock, buttons(0), bufferedButtons(0)); 
    c2: entity debounce port map (Clock, buttons(1), bufferedButtons(1)); 
    c3: entity debounce port map (Clock, buttons(2), bufferedButtons(2)); 
    c4: entity debounce port map (Clock, buttons(3), bufferedButtons(3)); 
    c5: entity debounce port map (Clock, buttons(4), bufferedButtons(4)); 
    c6: entity debounce port map (Clock, buttons(5), bufferedButtons(5)); 

    --{ Do stuff with debounced buttons } 
end Behavioral; 

回答

2

对于产生将是一个不错的人选建设在这里。

entity ButtonDebouncer is 
    Port (
     clock : in std_logic; 
     buttons : in std_logic_vector(0 to 5); 
     --{ more stuff } 
    ); 
end ButtonDebouncer; 

architecture Behavioral of ButtonDebouncer is 
    signal bufferedButtons : std_logic_vector(0 to 5) := (others => '0'); 
begin 
    debouncers: for i in 0 to 5 generate 
     c1: entity debounce port map (Clock, buttons(i), bufferedButtons(i)); 
    end generate; 
    --{ Do stuff with debounced buttons } 
end Behavioral; 
+2

你甚至可以用'buttons'range'更换'0〜5'架构,避免了神奇的硬编码值,使意图明显。 –

+0

太棒了,我不知道'生成' – Jableader

0

特拉维斯的解决方案是一个很好的起点。

我会更进一步,实现一个debounce模块多位。所以你可以传递一个完整的按钮矢量到这个模块。

entity debounce is 
    generic (
    BITS : POSITIVE 
); 
    port (
    Clock : STD_LOGIC; 
    Input : STD_LOGIC_VECTOR(BITS - 1 downto 0); 
    Output : STD_LOGIC_VECTOR(BITS - 1 downto 0) 
) 
end entity; 

architecture rtl of debounce is 
    -- define 'global' signals here (per instance) 
begin 
    genDebounce : for i in 0 to BITS - 1 generate 
    -- define 'local' signals here (per debounce circuit) 
    begin 
    -- debounce circuit 
    end generate; 
end architecture; 

用法:

debButtons : entity work.debounce 
    generic map (
    BITS => buttons'length 
) 
    port map (
    Clock => Clock, 
    Input => Buttons, 
    Output => bufferedButtons 
);