[MC613] Ajuda com matriz e inferência de latches

11 views
Skip to first unread message

Henrique Baggio

unread,
Jun 27, 2010, 5:47:58 AM6/27/10
to mc613_duvidas_2010s1, rafael.auler
No nosso projeto, temos que armazenar o tabuleiro do jogo no formato de uma matriz. Implementamos como um array bidimensional de sinais std_logic.

Acontece que, quando colocamos o código que altera apenas um determinado elemento por vez dentro de um processo, há inferência de latches para todas as outras posições que não são alteradas. Isso torna o comportamento do circuito inconstante e ele não opera direito. Ai a matriz não é mais desenhada na tela corretamente.

Como devemos fazer para armazenar esses valores sem causar essa inferência de latches? Testamos diversas maneiras mas, não tem como atribuir valores pra todos os elemento da matriz o tempo todo, por que o que se precisa é alterar os valores dos elementos aos poucos.

--
Henrique F. Baggio
Computer Engineering - Unicamp

Microsoft Innovation Center - Unicamp
Software Engineer
http://www.lms.ic.unicamp.br
http://lmsu.codeplex.com

Túlio Angeiras

unread,
Jun 27, 2010, 10:14:42 AM6/27/10
to mc613_duvi...@googlegroups.com
Você está fazendo essas alterações de forma síncrona? Se não, talvez transformar todos os latches em flip-flops corrija esse problema, e dependendo do teu código, basta um if rising edge pra fazer isso.

Dá um toque se for esse o caso.
--
Túlio Angeiras

Rafael Auler

unread,
Jun 27, 2010, 12:16:10 PM6/27/10
to mc613_duvi...@googlegroups.com
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.

2010/6/27 Túlio Angeiras <tulio.a...@gmail.com>



--
Rafael Auler
Computer Engineer
MSc Student
Computer Systems Laboratory (LSC)
IC - UNICAMP

Henrique Baggio

unread,
Jun 27, 2010, 8:22:20 PM6/27/10
to mc613_duvi...@googlegroups.com
2010/6/27 Túlio Angeiras <tulio.a...@gmail.com>

Você está fazendo essas alterações de forma síncrona? Se não, talvez transformar todos os latches em flip-flops corrija esse problema, e dependendo do teu código, basta um if rising edge pra fazer isso.

Dá um toque se for esse o caso.

Então, Tulio, na verdade eu não uso nenhum latch no meu código. Eles são inferidos pelo quartus na hora de sintetizar o circuito. Assim, não tem como eu trocá-los por flip-flops. =/

De todo jeito, valeu pela idéia.

Henrique Baggio

unread,
Jun 27, 2010, 8:40:46 PM6/27/10
to mc613_duvi...@googlegroups.com
2010/6/27 Rafael Auler <rafae...@gmail.com>

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.).

Exato. Confesso que pra gente ainda tá difícil de implementar uma lógica assim sem usar uma estrutura de dados, como estamos acostumados. Pra ter uma idéia, um dos principais problemas que estamos tendo, é como estruturar nossos processos de forma a não alterar o mesmos sinal em dois lugares diferentes, o que não é permitido pelo quartus.

No caso da memória, cheguei a tentar usar a memória SRAM da placa, mas ainda não tivemos sucesso. =/
 
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.

Bem, se ajudar, o código tá disponível em:

Temos uma máquina de estados implementada através de dois processos, um para controlar as saídas e outro para controlar a troca de estados. É no que altera as saídas que está o trecho que acessa a matriz do tabuleiro e a altera (linhas 205 e 225). É só eu comentar umas linhas e tudo corre bem, mas se alterar uma posição, o quartus infere latch pra matriz toda e o funcionamento desanda.

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.

OK, vou dar uma olhada e ver se avanço nesse problema. É basicamente isso que tá travando o nosso projeto, se isso sair, ai vai ficar bem mais fácil.

Henrique Baggio

unread,
Jun 28, 2010, 12:12:46 AM6/28/10
to mc613_duvi...@googlegroups.com
2010/6/27 Túlio Angeiras <tulio.a...@gmail.com>

Você está fazendo essas alterações de forma síncrona? Se não, talvez transformar todos os latches em flip-flops corrija esse problema, e dependendo do teu código, basta um if rising edge pra fazer isso.

Realmente, foi só colocar o processo 2 da FSM sincronizado com o clock principal e então não tem mais nenhum latch.
Pra mim bastava que ele dependesse das mudanças de estado, mas pelo visto ele tem que rodar junto com o clock.
Reply all
Reply to author
Forward
0 new messages