2013-10-13 6 views
3

У меня есть вектор переменной длины std_logic_vector(X downto 0). Теперь я пытаюсь определить константу в моем пакете для сброса, так что нижние бит X/2 являются единицами, а остальные равны нулю.Переменная длина std_logic_vector инициализация в VHDL

Например, 3-битовый вектор (X=3) сделает константу "011", а 4-битный вектор даст константу "0011".

Как это сделать в пакете VHDL? В приведенном ниже коде объясняется, что я пытаюсь сделать.

type Entry_Type is record 
    state : std_logic_vector(X-1 downto 0); 
end record; 
constant Entry_Constant : Entry_Type := <???>; 

ответ

5

Существует как минимум два варианта инициализации типа записи, как вы хотите. Один использует функцию инициализации, а другой использует значение N в совокупности.

Функции являются хорошим способом инициализации пользовательских типов данных. В вашем случае, вы могли бы создать функцию default_entry_from_width(n), возвращая entry_type значение:

type entry_type is record 
    state: std_logic_vector; 
end record; 

function default_entry_from_width(width: natural) return entry_type is 
    variable return_vector: std_logic_vector(width-1 downto 0); 
begin 
    for i in return_vector'range loop 
     return_vector(i) := '1' when i <= width/2 else '0'; 
    end loop; 
    return (state => return_vector); 
end; 

constant ENTRY_1: entry_type := default_entry_from_width(3); -- return 011 
constant ENTRY_2: entry_type := default_entry_from_width(4); -- return 0011 

Другой альтернативой является инициализировать константу с агрегатом, используя previsouly определенное значение N:

constant N: natural := 4; 
constant ENTRY_3: entry_type := (
    state => (
     N-1 downto N/2 => '1', 
     N/2-1 downto 0 => '0' 
    ) 
); 
2

Вы имеете в виду что-то вроде этого:

library ieee; 
use ieee.std_logic_1164.all; 
package vector_length is 
    constant X: natural := 3; -- Entry_Type.state length 
    type Entry_Type is 
     record 
      state : std_logic_vector(X-1 downto 0); 
     end record; 
    constant entry_default: Entry_Type := 
      (state => 
       (X-1 downto NATURAL(REAL((X-1)/2) + 0.5) =>'0', others => '1') 
      ); 
end package vector_length; 

library ieee; 
use ieee.std_logic_1164.all; 
use work.vector_length.all; 

entity fum is 
end entity; 

architecture foo of fum is 
    signal entry: Entry_Type := entry_default; 
    signal default: std_logic_vector (X-1 downto 0); 
begin 
TEST: 
    process 
    begin 
     default <= entry.state; 
     wait for 100 ns; -- so it will show up in a waveform display 
     wait; 
    end process; 
end architecture; 

который выполняет свои условия для значения X = 3 по умолчанию является «011», для X = 4 значения по умолчанию «0011».

Обратите внимание, что значение по умолчанию назначается там, где объявлен подтип (запись), а не в объявлении типа.

(Это была боль, чтобы округлить).

+0

И если вы добавите дополнительные элементы в тип записи Entry_Type, любые значения по умолчанию для этих элементов должны быть добавлены в entry_default, значение по умолчанию которого является агрегатом. – user1155120

Смежные вопросы