У меня есть двумерный массив, я называю его памятью.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
и список всегда является то же самое, несколько ошибок в поведении и один о разных часовых поясах
Как называется цепочка инструментов? Каково ваше целевое устройство? Кстати: вы не используете истинный n-мерный массив. Это 1-мерная аранжировка, вложенная в другой 1-мерный массив, вложенный в другой 1-мерный массив. Поэтому на самом деле вы обращаетесь к 3-х мерным искажениям.(Целое число уже 1 dimmension) Поддерживает ли ваше целевое устройство отстающие часы? – Paebbels
@Paebbels Quartus II, Altera FLEX10K, да, это 1dim из 1 dim of 1 dim array, но все же он не работает без этого чудовищного случая. Да, мое устройство поддерживает падение фронта, я делаю много вещей на падающих фронтах других часов. – Vanechka
Вы пытались использовать полномочия для ваших размерных размеров: 'type mem is array (от 0 до 127) целочисленного диапазона от 0 до 255 ; '? Возможно, у Quartus есть некоторые проблемы, распознающие вычисления адресов памяти, если это не сила 2. – Paebbels