2016-11-21 1 views
1

У меня есть массив в VHDL формы,Присвоить значения массиву частично в VHDL?

type CacheArray is array(0 to 15) of std_logic_vector(33 downto 0); 
signal cache_array: CacheArray := (others => (others => '0')); 

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

cache_array(15 downto 0)(33) <= (others => '0'); 

Но это дает следующее сообщение об ошибке: -

Cache.vhd:72:16: direction of the range mismatch 
Cache.vhd:72:30: static constant violates bounds 
Cache.vhd:72:37: can't match character literal '0' with type array type "std_logic_vector" 

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

ответ

2

Вы получаете первую и вторую ошибку, потому что ваш типа объявлен:

array(0 to 15) 

но ваше назначение сигнала, экземпляры этого типа с помощью:

cache_array(15 downto 0) 

Вы должны выбрать либо to или downto для обоих.

Последняя ошибка заключается в том, что вы назначаете (others => '0'), который применим только к векторам бит, к одному биту. Если вы хотите сделать этот конкретный бит '0', просто назначьте его '0'.

В целом, синтаксис cache_array(15 downto 0)(33) не имеет смысла.


Если на ваш комментарий и обновленный вопрос, вы хотите назначить один конкретный бит в каждом элементе массива, вам придется использовать цикл какой-то:

Внутри процесса:

for i in cache_array'range loop 
    cache_array(i)(33) <= '0'; 
end loop; 

Вне процесса в качестве параллельного присваивания:

GenerateLabel : for i in cache_array'range generate 
    cache_array(i)(33) <= '0'; 
end generate; 

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

+0

Я хочу сделать этот бит '' 0'' для всех индексов массива. Я попробовал эти сравнения (15 downto 0) (32) <= '0'; ', но я получаю сообщение об ошибке' Cache.vhd: 65: 28: static constant нарушает границы'. – martianwars

+0

@ KalpeshKrishna OK, я просто пытался объяснить, почему ваш код вызывает ошибки. См. Мое редактирование. –

+0

Я не знал об этих операторах 'generate'. Все это действительно дает синтезируемый код? Это выглядит действительно полезно! – martianwars

1

Предупреждение следует использовать в методе генерации цикла scary_jeff. параллельный оператор в цикле генерации приведет к отдельному процессу с отдельным драйвером в каждом сгенерированном блоке, что означает, что вы не можете назначить (33) для cache_array (i) из другого процесса без разрешения на метазначение.

Метод генерации цикла обычно не полезен без описания всей операции кеша в одном процессе.

Там также третий способ, использующий и маскирующий знакомо тем, с фоном программирования, который используется для установки cache_array (I), (33) к «0»:

library ieee; 
use ieee.std_logic_1164.all; 

entity cache is 
end entity; 

architecture foo of cache is 
    type CacheArray is array(0 to 15) of std_logic_vector(33 downto 0); 
    signal cache_array: CacheArray := (others => (others => '1')); 

    constant MASK33: CacheArray := (others => (33 => '0', others => '1')); 

    function "and" (l,r: CacheArray) return CacheArray is 
     variable retval: CacheArray; 
    begin 
     for i in l'range loop 
      retval(i) := l(i) and r(i); 
     end loop; 
     return retval; 
    end function; 

    function to_string (arg: CacheArray) return string is 
     variable retval: string (1 to CacheArray'length * 36); 
     variable retptr: natural range 1 to CacheArray'length * 36; 
    begin 
     retptr := 1; 
     for i in arg'range loop 
      for j in arg(i)'range loop 
       if j = arg(i)'left then 
        retval(retptr) := LF; 
        retptr := retptr + 1; 
        retval(retptr) := HT; 
        retptr := retptr + 1; 
       end if; 
       retval(retptr) := 
         character'VALUE(std_ulogic'IMAGE(arg(i)(j))); 
         if retptr < retval'length then 
          retptr := retptr + 1; 
         end if; 
      end loop; 
     end loop; 
     return retval; 
    end function; 

begin 

-- GenerateLabel: 
--  for i in cache_array'range generate 
--   cache_array(i)(33) <= '0'; 
--  end generate; 
-- 
-- Clear_33: 
--  process (cache_array) 
--  begin 
--   for i in cache_array'range loop 
--   cache_array(i)(33) <= '0'; 
--   end loop; 
--  end process; 
MASK: 
    process (cache_array) 
    begin 
     cache_array <= cache_array and MASK33; 
    end process; 
SHOW: 
    process (cache_array) 
    begin 
     report "cache_array = " & to_string(cache_array); 
    end process; 
end architecture; 

Поскольку требуется определение «и» оператор для типа CacheArray, это приведет к получению функции to_string для типа CacheArray, а также, что может сказать нам содержимое кэша:

ghdl -r cache 
cache.vhdl:67:9:@0ms:(report note): cache_array = 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
    1111111111111111111111111111111111 
cache.vhdl:67:9:@0ms:(report note): cache_array = 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 
    0111111111111111111111111111111111 

Первое значение кэша представляет собой первоначальное значение, то второй результат из "и" mask (обратите внимание, что я первоначально заполнял cache_array w с «1», чтобы показать «и» работал).

Вы можете добавить дополнительные разделители полей для своего кеш-слова, чтобы упростить их чтение и использовать такие вещи, как использование конкретного радикса, отметив, что вы отвечаете за правильную длину строки retval и управляете указателем retval (retptr) в to_string. Вы можете зайти так далеко, чтобы добавить выходной заголовок. Вы также можете организовать вывод на основе строки кэша. ...

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

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