2017-06-06 1 views
-1

Je suis en train d'écrire quelque chose comme ceci:Comment attendre les bords toujours bloqués?

[email protected](posedge bus_start) 
begin 
    @(posedge scl) buffer[7] = sda; 
    @(posedge scl) buffer[6] = sda; 
    @(posedge scl) buffer[5] = sda; 
    @(posedge scl) buffer[4] = sda; 
    @(posedge scl) buffer[3] = sda; 
    @(posedge scl) buffer[2] = sda; 
    @(posedge scl) buffer[1] = sda; 
    @(posedge scl) buffer[0] = sda; 
end 

Mais ce n'est pas synthétisable selon l'erreur que je suis arrivé.

Je peux utiliser FSM pour résoudre cela, mais cela pourrait compliquer la situation, est-il possible de la rendre synthétisable?

+1

Non. Il s'agit d'un Verilog comportemental de haut niveau. Cela ferait un bon modèle de référence pour un banc d'essai, mais il n'est pas suffisamment détaillé pour être synthétisable. Le niveau d'abstraction (niveau de détail) auquel vous devez écrire du code synthétisable s'appelle RTL (Register Transfer Level), dans lequel vous décidez presque manuellement où se trouvent les bascules et où le synthétiseur remplit la logique combinatoire. Pour cette interface I2C, vous aurez besoin d'un registre de décalage, vous aurez besoin d'un FSM, vous aurez probablement besoin d'un compteur. Voir [le site Web de mon entreprise] (https://www.doulos.com/knowhow/verilog_designers_guide/). –

Répondre

0

Il semble que vous essayez de capturer des données à partir d'une interface I2C. Voici une solution simple pour capturer 8 bits de données de sda et de stocker cela dans un registre appelé buffer.

// starts on rising edge of scl or bus_start 
[email protected](posedge bus_start or posedge scl) 
begin 
    buffer[0] <= sda; // loads sda into the lowest bit of buffer 
    buffer[7:1] <= buffer[6:0]; // shifts the lower 6 bits one to 
           // the left, acting as a shift register 
end 

Plus d'informations sur I2C dans Verilog se trouve here En outre, un esclave I2C de base se trouvent here (vous devez vous inscrire et vous connecter pour voir le code source).

1

Vous ne donnez pas suffisamment d'informations.

La réponse de @ Krabby127 n'est pas non plus synonyme de synthèse.

Je pense que vous avez encore beaucoup de travail à faire. Vous devriez apprendre la différence entre Verilog et C, d'abord. Le code RTL est de décrire le matériel dans FPGA. Le concept de synthétisable est donc très important pour vous.

Et vous devez prendre soin de l'anti-rebond du signal I2C.Prendre soin du signal à trois états. Après tout, je vous suggère d'obtenir un projet I2C d'opencores.org à étudier. Pardonnez mon pauvre anglais.

0

Les esclaves I2C utilisent principalement une horloge d'échantillonnage autre que SCL. Je ne veux pas dire que c'est impossible autrement, mais la pratique courante consiste à utiliser une horloge plus rapide pour échantillonner les signaux SCL et SDA.

Je recommande vivement de commencer la conception avec les ports ci-dessous au minimum. Puisque SDA est un signal de trois états, je recommande également de ne pas le traiter à ce stade. Vous pouvez supposer que cela est fait à partir de votre module et peut continuer avec des ports d'entrée et de sortie séparés.

input clk;  // system clock 
input rst;  // system reset 

input scl;  // i2c clock 
input sda_in; // i2c input data 
output sda_out; // i2c output data 

Pour être honnête, I2C est pas un bon choix pour apprendre un HDL (Verilog/SV/VHDL) et la conception numérique. Cela va apporter des problèmes complexes.