2017-06-06 1 views
-1

Ich versuche, so etwas zu schreiben: Ich habeWie auf Kanten in immer Block warten?

[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 

Aber es ist nicht nach dem Fehler synthetisierbaren.

Ich kann FSM verwenden, um dies zu lösen, aber das könnte es kompliziert machen, gibt es eine Möglichkeit, es synthetisierbar zu machen?

+1

Nein. Dies ist Verhalten Verilog auf hoher Ebene. Es würde ein gutes Referenzmodell für eine Testbench ergeben, ist aber nicht annähernd detailliert genug, um synthetisch zu sein. Der _level of abstraction_ (Detaillierungsgrad), mit dem synthetisierbarer Code geschrieben werden muss, heißt RTL (Register Transfer Level), bei dem Sie fast manuell entscheiden, wo sich die Flip-Flops befinden und der Synthesizer die kombinatorische Logik ausfüllt. Für diese I2C-Schnittstelle benötigen Sie ein Shift-Register, Sie benötigen eine FSM, Sie benötigen wahrscheinlich einen Zähler. Siehe [Website meines Unternehmens] (https://www.doulos.com/knowhow/verilog_designers_guide/). –

Antwort

0

Es sieht so aus, als ob Sie versuchen, Daten von einer I2C-Schnittstelle zu erfassen. Hier ist eine einfache Lösung zum Erfassen von 8 Datenbits von sda und Speichern in einem Register namens 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 

Weitere Informationen über I2C in Verilog können here Zusätzlich ist ein grundlegender I2C Slave here (Sie müssen sie registrieren und anmelden, um zu sehen, den Quellcode) zu finden gefunden werden kann.

1

Sie geben nicht genügend Informationen.

Antwort von @ Krabby127 ist auch nicht synthetisch.

Ich denke, Sie haben viel mehr zu tun. Sie sollten zuerst den Unterschied zwischen Verilog und C erfahren. RTL-Code ist die Hardware in FPGA zu beschreiben. So ist das Konzept der synthetisierbaren sehr wichtig für Sie.

Und Sie müssen auf Entprellung des I2C-Signals achten. Achten Sie auf Tristate-Signal. Schließlich schlage ich vor, dass Sie ein I2C-Projekt von opencores.org zum Lernen bekommen. Verzeihen Sie mein schlechtes Englisch.

0

I2C-Slaves verwenden meistens einen anderen Abtasttakt als SCL. Ich meine nicht, dass es sonst unmöglich ist, aber die übliche Praxis besteht darin, eine schnellere Uhr für die Abtastung von SCL- und SDA-Signalen zu verwenden.

Ich empfehle auf jeden Fall, das Design mit den folgenden Ports mindestens zu starten. Da SDA ein Tristate-Signal ist, empfehle ich auch, in diesem Stadium nicht damit umzugehen. Sie können davon ausgehen, dass es aus Ihrem Modul heraus ausgeführt wurde und mit getrennten Eingabe- und Ausgabeports fortfahren kann.

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

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

Um ehrlich zu sein, I2C ist keine gute Wahl ein HDL (Verilog/SV/VHDL) und digitales Design zu lernen. Es wird einige komplexe Probleme bringen.

Verwandte Themen