Hallo, schaut euch das mal an: [verilog] module i2c_slave (SCL, SDA, start); input SDA; input SCL; reg start; output start; always@(negedge SDA or negedge SCL) begin start = !SDA & SCL; end endmodule [/verilog] wenn SDA low ist und nur SCL nach high geht, darf doch mit start gar nichts passieren - warum geht start hoch, wenn SCL hoch geht, es ist doch gar kein posedge SCL vorhanden?
nun hab ich gerade gemerkt: das verhält sich ja wie assign start = !SDA & SCL; da hat der doch einfach was wegoptimiert.
na toll, wenn ich es als if-bedingung formuliere nimmt er es nicht: was in den klammern von always@ darf nicht in der if-bedingung verwendet werden.
1 | |
2 | |
3 | |
4 | |
Willst du "nur" simulieren, oder soll das später mal in Hardware realisiert werden? Was für ein Bauteil soll das im richtigen Leben werden? Hast du irgendwelche Warnungen bei der Synthese (nicht beachtet)? In FPGAs gibt es nur Register, die entweder auf die steigende oder auf die fallende Flanke eines Signals getaktet werden (ok, mit ein paar speziellen Ausnahmen). Du willst hier offenbar etwas, das 2 Signale als Takt verwendet. Sozusagen etwas ähnliches wie ein flankengetriggertes RS-Flipflop.
eigentlich wollte ich nur etwas programmieren, was start und stop bei i²c erkennt und ein bit soll eben zwischen start und stop 1 sein, außerhalb 0 so ungefähr: always@(SCL and negedge SDA) begin online = 1; end always@(SCL and posedge SDA) begin online = 0; end aber leider stellt sich quartus ständig quer und will nicht mal sowas übersetzen: always@(reset or negedge SDA) begin online = SCL & !reset; end wobei unschwer zu erkennen ist, dass es sich hier um ein flankengesteuertes D-FF mit asynchronen reset handelt.
Gast
#1007532
> aber leider stellt sich quartus ständig quer und will nicht mal sowas > übersetzen: > > always@(reset or negedge SDA) > begin > online = SCL & !reset; > end > > wobei unschwer zu erkennen ist, dass es sich hier um ein > flankengesteuertes D-FF mit asynchronen reset handelt. Normalerweise schreibt man <= und nicht = bei flankengesteuerten Blöcken.
so hab ich hab es nun scheinbar hingekriegt - siehe anhang. der <= hat auch nichts gebracht ich möchte gerne mal wissen, wie diese FlipFlops, die ich da verwendet habe, in verilog beschrieben wurden. warum muss man da eigentlich alles immer so umständlich beschreiben, kann da quartus nicht viel toleranter sein und es richtig übersetzen?
Gast
#1007897
Für Xilinx gibt es eine Dokumentation zum Compiler, in der genau beschrieben wird, wie man in Verilog und VHDL bestimmte Strukturen, z.B. DFFs beschreiben muss. Ich wäre überrascht wenn es das für Quartus nicht gäbe. Vielleicht solltest Du danach suchen und sie lesen ...
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.