Um ponto importante é que, quando você for fazer seu projeto, você procure trabalhar com elementos ("building blocks") de hardware, e não de software. Matriz é o jargão que usamos quando estamos projetando um software em C, por exemplo. O ideal é que você substitua a matriz por uma memória (com endereçamento, clk, datain, dataout, etc.). Talvez a sua dificuldade em fazer com que o sintetizador entenda o que você está querendo fazer seja por estar escrevendo código VHDL pensando em "building blocks" de software (você escreveu um array bidimensional de std_logic como faria uma matriz em C). Eu não vi o código, mas talvez não seja difícil fazer o código funcionar como está, desde que pensemos num nível de abstração mais baixo e como possivelmente o sintetizador está entendendo o seu código. Mas por exemplo, para projetarmos diretamente num nível de abstração RTL, pensando em hardware, se o objetivo é inferir memória, existe uma maneira específica para isso em VHDL com o Quartus, e está descrito nos design guidelines do Quartus (no handbook do Quartus). No handbook, é exposto especificamente o código que gera a memória e como você deve fazê-lo. Caso você não queira usar esse código, você pode também gerar automaticamente um código muito mais preciso com o wizard de MegaFunctions do Quartus, para não deixar margem para interpretação errada pelo sintetizador.
Você tem que pensar exatamente como você quer implementar essa matriz em hardware. Outra maneira é fazer com um banco de registradores. Neste caso, você a implementaria da mesma forma como você fez o banco de registradores do datapath do exercício 4 do último lab.
--
Rafael Auler
Computer Engineer
MSc Student
Computer Systems Laboratory (LSC)
IC - UNICAMP