2015-08-24 2 views
0

У меня есть двумерный массив, я называю его памятью.VHDL: ошибка при работе с двумерным массивом

type mem is array (0 to 79) of integer range 0 to 255;  -- 80 times by 8 bit 
type dataArray is array (0 to 7) of mem;     -- 8 arrays of 640bit 
variable Memory: dataArray;         -- Here they are 

И у меня SLV, отвечая на некоторых запросов, и представлены целыми числами в этом массиве

inAnsw : in STD_LOGIC_VECTOR(7 downto 0);  -- the incoming bus 
inVALID : in STD_LOGIC       -- the signal 

на некотором входящий сигнал, что указывает на то, что у меня 14 новых байт данных, я необходимо собрать входящие 12 байтов этих данных в моем массиве в специальном порядке. Код выглядит следующим образом:

if falling_edge(inVALID) then -- 14 signals will come   
     bytenum := bytenum + 1;  -- count them to know we 
     if (bytenum = 14) then  -- start every new session with 
      bytenum := 0;   -- a zero position 
      answmem := answmem + 1; -- increment the array position for 
      if (answmem = 8) then answmem := 0; end if;  -- the next answer 
     end if; 

-- And here comes the huge problem. i am working with this 
-- huge CASE, that puts a significant answer to the needed place 
-- of my array. it works fine, but it takes more than 1500 logic 
-- cells of my FPGA. 

     case bytenum is 
      when 0 => Memory(answmem)(0) := TO_INTEGER(unsigned(inAnsw));    
      when 1 => Memory(answmem)(7) := TO_INTEGER(unsigned(inAnsw)); 
      when 2 => Memory(answmem)(9) := TO_INTEGER(unsigned(inAnsw)); 
      when 3 => Memory(answmem)(10) := TO_INTEGER(unsigned(inAnsw)); 
      when 4 => Memory(answmem)(17) := TO_INTEGER(unsigned(inAnsw)); 
      when 5 => Memory(answmem)(19) := TO_INTEGER(unsigned(inAnsw)); 
      when 6 => Memory(answmem)(20) := TO_INTEGER(unsigned(inAnsw)); 
      when 7 => Memory(answmem)(27) := TO_INTEGER(unsigned(inAnsw)); 
      when 8 => Memory(answmem)(30) := TO_INTEGER(unsigned(inAnsw)); 
      when 9 => Memory(answmem)(37) := TO_INTEGER(unsigned(inAnsw)); 
      when 10 => Memory(answmem)(40) := TO_INTEGER(unsigned(inAnsw)); 
      when 11 => Memory(answmem)(47) := TO_INTEGER(unsigned(inAnsw)); 
      when others => Memory(answmem)(67) := TO_INTEGER(unsigned(inAnsw)); 
     end case; 
    end if; 

Так что, если я пытаюсь заменить код, который записывает данные с некоторыми другими конструкциями, как следующий или любой другой, с помощью IF/заявления ELSIF

if (bytenum <12) then 
    Memory (answmem)(bytenum+whatever) := TO_INTEGER(UNSIGNED(inAnsw)); 
end if; 

символ сборник работает отлично, и он принимает около 100-200 логических ячеек, но когда я начинаю составить полный проект, у меня есть огромный список ошибок компиляции

Error (10821): HDL error at MyModule.vhd(217): can't infer register for "Memory[7][25][0]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(199): can't infer register for "Memory[7][25][0]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(217): can't infer register for "Memory[7][25][1]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(199): can't infer register for "Memory[7][25][1]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(217): can't infer register for "Memory[7][25][2]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(199): can't infer register for "Memory[7][25][2]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(217): can't infer register for "Memory[7][25][3]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(199): can't infer register for "Memory[7][25][3]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(217): can't infer register for "Memory[7][25][4]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(199): can't infer register for "Memory[7][25][4]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(217): can't infer register for "Memory[7][25][5]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(199): can't infer register for "Memory[7][25][5]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(217): can't infer register for "Memory[7][25][6]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(199): can't infer register for "Memory[7][25][6]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(217): can't infer register for "Memory[7][25][7]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(199): can't infer register for "Memory[7][25][7]" because its behavior does not match any supported register model 
Error (10821): HDL error at MyModule.vhd(203): can't infer register for "Memory[7][18][0]" because its behavior does not match any supported register model 
Error (10820): Netlist error at MyModule.vhd(199): can't infer register for Memory[7][18][0] because its behavior depends on the edges of multiple distinct clocks 
Error (10821): HDL error at MyModule.vhd(203): can't infer register for "Memory[7][18][1]" because its behavior does not match any supported register model 

и список всегда является то же самое, несколько ошибок в поведении и один о разных часовых поясах

+0

Как называется цепочка инструментов? Каково ваше целевое устройство? Кстати: вы не используете истинный n-мерный массив. Это 1-мерная аранжировка, вложенная в другой 1-мерный массив, вложенный в другой 1-мерный массив. Поэтому на самом деле вы обращаетесь к 3-х мерным искажениям.(Целое число уже 1 dimmension) Поддерживает ли ваше целевое устройство отстающие часы? – Paebbels

+0

@Paebbels Quartus II, Altera FLEX10K, да, это 1dim из 1 dim of 1 dim array, но все же он не работает без этого чудовищного случая. Да, мое устройство поддерживает падение фронта, я делаю много вещей на падающих фронтах других часов. – Vanechka

+0

Вы пытались использовать полномочия для ваших размерных размеров: 'type mem is array (от 0 до 127) целочисленного диапазона от 0 до 255 ; '? Возможно, у Quartus есть некоторые проблемы, распознающие вычисления адресов памяти, если это не сила 2. – Paebbels

ответ

2

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

...because its behavior does not match any supported register model 

говорит, что инструмент синтеза распознает какой-то регистр, но не тот, который он может реализовать.

...because its behavior depends on the edges of multiple distinct clocks 

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

process(clk,inVALID) 
begin 
    if rising_edge(clk) then 
    if falling_edge(inVALID) then -- 14 signals will come 
     ... your code ... 
    end if; 
    end if; 
end process; 

то у вас есть два часы для вашего Memory регистрового банка: clk и inVALID и каждый бит Memory должен быть обновлен, когда имеется нарастающий фронт clk и , одновременно, падающий фронт inVALID.

Это может быть также код до или после вашего кода, все еще в том же процессе. Например, если ваш код предшествует или что-то вроде:

if rising_edge(another_signal) then 
    ... 
    Memory(x)(y) := value; 
    ... 
    end if; 
    if falling_edge(inVALID) then -- 14 signals will come 
    ... your code ... 
    end if; 

тогда, у вас есть два часы для вашего Memory регистрового банка: another_signal и inVALID и каждый бит Memory должен обновляться либо когда есть передний фронт another_signal или/и задний фронт inVALID, с наивысшим приоритетом - inVALID.

Это слишком много для всех синтезаторов, которые я знаю.

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