2015-04-29 2 views
0

Последние два дня я боролся с этой проблемой. Я хочу, чтобы data_out отправил «111» в этом случае, увидев, как вся память заполнена «1». Я покажу код, а затем сделать вопрос более точно:VHDL: преобразование std_logic_vector в целое число (работает в симуляции, а не на практике)

entity tile_library is 
    Port (
    data_out : out std_logic_vector(2 downto 0); 
    data_in : in std_logic_vector(5 downto 0); 
    clk : in std_logic); 

end tile_library; 

architecture Behavioral of tile_library is 

type memory_type is array (0 to 63) of std_logic_vector(255 downto 0); 
signal memory : memory_type := (others=> (others=>'1')); 
signal something_to_convert : std_logic_vector(5 downto 0) := "000000"; 


begin 
    process(clk) begin 
    if rising_edge(clk) then 
    if memory(to_integer(unsigned(data_in)))(5) = '1' then 
     data_out <= "111"; 
    else 
     data_out <= "000"; 
    end if; 

    end if; 
end process; 


end Behavioral; 

Если я заменяю

if memory(to_integer(unsigned(data_in)))(5) = '1' then 

с

if memory(to_integer(unsigned(something_to_convert)))(5) = '1' then 

я получаю "111" в качестве выходного сигнала на моей NEXYS 3 карты ,

Это заставляет меня думать, что data_in не то, что должно быть.

Поэтому я покажу вам код, дающий data_in к tile_library в моих тестах:

entity tile_memory is 
    Port (
    data_out : out std_logic_vector(5 downto 0); 
    clk : in std_logic); 

end tile_memory; 

architecture Behavioral of tile_memory is 

begin 
    process(clk) 
    begin 
    if rising_edge(clk) then 
    data_out <= "000000"; 

    end if; 
    end process; 

end Behavioral; 

Для дальнейшей путаницы, я мог бы добавить, что в соответствии с моделирования, я точно так же и из сигналы (которые также являются правильными, «111») с обоими if memory(to_integer(unsigned(data_in)))(5) = '1' then и if memory(to_integer(unsigned(something_to_convert)))(5) = '1' then. Когда я запускаю его на своей карте Nexys 3; однако они дают разные результаты.

Что я здесь делаю неправильно?

+1

Эта строка: 'память сигнала: memory_type: = (другие => (другие => '1'));' содержит предварительную инициализацию памяти, которая может не поддерживаться в синтезе. Для диагностических целей, почему бы не передать 'data_in' напрямую, а не беспокоиться о том, что это может * быть? –

+2

Вы не указали, какой результат был, если вы не замените. Еще хуже, что указывает @BrianDrummond. Тип памяти memory_type инициализируется всеми 256 элементами std_logic_vector, которые являются типом элемента всех 64 позиций. Его можно оптимизировать, если у вас нет способа записать в память разные значения. Это буквально неважно, был ли data_in, и это, вероятно, может быть оптимизировано и в синтезе, это всегда все «0». – user1155120

ответ

0

Там нет ничего плохого с

signal memory : memory_type := (others=> (others=>'1')); 

В программе Xilinx это работает для меня все время.

Я бы предложил использовать chipcope и поместить атрибут keep/mark_debug на сигналы, которые вы хотите просмотреть, поскольку, как указывают другие, он будет оптимизирован. Но это не значит, что вы должны получить неправильный результат.

data_out должно быть «000» (из-за предположения синтеза Xilinx) для первого тактового цикла, тогда «111» для последовательных тактов.

Если синтез наполняет его, я предполагаю, что ему не нравится операция ram как часть инструкции if (я лично ее никогда не видел раньше). Попробуйте извлечь его из оператора if (как показано ниже). Это не должно требоваться, но XST может быть довольно чувствительным, когда дело доходит до распознавания памяти/множителей и т. Д.

Вы также можете взглянуть на схему синтеза публикаций или моделирование, но сначала предлагаю чипсеты.

entity tile_library is 
    Port (
    data_out : out std_logic_vector(2 downto 0); 
    data_in : in std_logic_vector(5 downto 0); 
    clk : in std_logic); 

end tile_library; 

architecture Behavioral of tile_library is 

type memory_type is array (0 to 63) of std_logic_vector(255 downto 0); 
signal memory : memory_type := (others=> (others=>'1')); 
signal something_to_convert : std_logic_vector(5 downto 0) := "000000"; 
signal memory_read_data : std_logic_vector(255 downto 0); 

begin 
    memory_read_data <= memory(to_integer(unsigned(data_in))); 
    process(clk) begin 
    if rising_edge(clk) then 
    if memory_read_data(5) = '1' then 
     data_out <= "111"; 
    else 
     data_out <= "000"; 
    end if; 

    end if; 
end process; 


end Behavioral; 
Смежные вопросы