T
torius
Guest
Γεια σου,
Είμαι απασχολημένος με 2 moter κωδικευτές.κωδικευτές connented αυτές είναι σε ένα FPGA.FPGA την ανάγκη να μετρούν κάθε παλμού.Έτσι, δημιουργήθηκε ένα 32 bit εγγραφή για να μετράνε.τα 32 bit μητρώο είναι χωρισμένο σε 4 φορές 8 bit.Τώρα θέλω να αποστείλει αυτές τις τιμές σε ένα μικροελεγκτή με I2C,
βρήκα ένα i2c σκλάβα για fpga4fun.Η ερώτησή μου είναι πώς να αποστέλλουν τα δεδομένα μέσω του sda.Ποιος είναι ο καλύτερος τρόπος
που έχω δοκιμάσει κάποια πράγματα, αλλά με τις γνώσεις μου verilog κώδικας δεν είναι και τόσο καλά.
Ελπίζω ότι κάποιος μπορεί να με βοηθήσει
εδώ
είναι ο κώδικας:
/ / Παράδειγμα I2C σκλάβος
/ / Www.fpga4fun.com
ενότητα I2CslaveWith8bitsIO (SDA, SCL, IOout)?
inout SDA?
εισροών SCL?
/ / Η 7-bits διεύθυνση που θέλουμε για μας I2C σκλάβος
παράμετρος I2C_ADR = 7'h27?
/ / I2C ξεκινήσει και να σταματήσει η λογική ανίχνευσης συνθήκες
/ / Αυτή είναι η "μαύρη μαγεία" τμήμα αυτού του σχεδιασμού ...
/ / Χρησιμοποιούμε δύο σύρματα με combinatorial βρόχου για την ανίχνευση της έναρξης και προϋποθέσεις
/ / Να διασφαλίσουμε αυτά τα δύο καλώδια δεν έχουν βελτιστοποιηθεί μακριά
σύρμα SDA_shadow / * σύνθεση διατηρεί = 1 * /?
σύρμα start_or_stop / * σύνθεση διατηρεί = 1 * /?
αντιστοιχίσετε SDA_shadow = (~ SCL | start_or_stop);SDA: SDA_shadow?
αντιστοιχίσετε start_or_stop = ~ SCL;1'b0: (SDA ^ SDA_shadow)?
reg incycle?
πάντα @ (negedge SCL ή posedge start_or_stop)
εάν (start_or_stop)
incycle <= 1'b0?
else if (~ SDA)
incycle <= 1'b1?/ / Τώρα είμαστε έτοιμοι να μετρήσετε το I2C bits που έρχονται σε
reg [3:0] bitcnt? / / μετράει το I2C δυφία από 7 downto 0, συν ένα ACK bit
σύρμα bit_DATA = ~ bitcnt [3]? / / την ΔΕΔΟΜΕΝΩΝ bits είναι τα πρώτα 8 bit αποστέλλονται
σύρμα bit_ACK = bitcnt [3]? / / την ACK bit είναι το 9ο bit αποστέλλονται
reg data_phase?
πάντα @ (negedge SCL ή negedge incycle)
αν (~ incycle)
αρχίζω
bitcnt <= 4'h7? / / την bit 7 λάβει πρώτα
data_phase <= 0?
τέλος
άλλος
αρχίζω
εάν (bit_ACK)
αρχίζω
bitcnt <= 4'h7?
data_phase <= 1?
τέλος
άλλος
bitcnt <= bitcnt - 4'h1?
τέλος
/ / Και να εντοπίζουν αν η διεύθυνση I2C αγώνες τους δικούς μας
σύρμα adr_phase = ~ data_phase?
reg adr_match, op_read, got_ACK?
reg SDAr?
πάντα @ (posedge SCL) SDAr <= SDA? / / SDA για posedge δείγμα, δεδομένου ότι το I2C spec διευκρινίζει στο χαμηλότερο επίπεδο που κατέχουν 0ľs χρόνο για negedge
reg [7:0] mem?
σύρμα op_write = ~ op_read?
πάντα @ (negedge SCL ή negedge incycle)
αν (~ incycle)
αρχίζω
got_ACK <= 0?
adr_match <= 1?
op_read <= 0?
τέλος
άλλος
αρχίζω
εάν (adr_phase & bitcnt == 7 & SDAr! = I2C_ADR [6]) adr_match <= 0?
εάν (adr_phase & bitcnt == 6 & SDAr! = I2C_ADR [5]) adr_match <= 0?
εάν (adr_phase & bitcnt == 5 & SDAr! = I2C_ADR [4]) adr_match <= 0?
εάν (adr_phase & bitcnt == 4 & SDAr! = I2C_ADR [3]) adr_match <= 0?
εάν (adr_phase & bitcnt == 3 & SDAr! = I2C_ADR [2]) adr_match <= 0?
εάν (adr_phase & bitcnt == 2 & SDAr! = I2C_ADR [1]) adr_match <= 0?
εάν (adr_phase & bitcnt == 1 & SDAr! = I2C_ADR [0]) adr_match <= 0?
εάν (adr_phase & bitcnt == 0) op_read <= SDAr?
εάν (bit_ACK) got_ACK <= ~ SDAr? / / παρακολουθούμε τη ACK να είναι σε θέση να ελευθερώσει το λεωφορείο, όταν ο κυβερνήτης δεν ACK διαβάσει κατά τη διάρκεια μιας επιχείρησης
εάν (adr_match & bit_DATA & data_phase & op_write) mem [bitcnt] <= SDAr? / / μνήμη γράψετε
τέλος
/ / Και να δώσει το SDA γραμμή όταν είναι απαραίτητο.
σύρμα mem_bit_low = ~ mem [bitcnt [2:0]]?
σύρμα SDA_assert_low = adr_match & bit_DATA & data_phase & op_read & mem_bit_low & got_ACK?
σύρμα SDA_assert_ACK = adr_match & & bit_ACK (adr_phase | op_write)?
σύρμα SDA_low = SDA_assert_low | SDA_assert_ACK?
αντιστοιχίσετε SDA = SDA_low;1'b0: 1'bz?endmodule
Είμαι απασχολημένος με 2 moter κωδικευτές.κωδικευτές connented αυτές είναι σε ένα FPGA.FPGA την ανάγκη να μετρούν κάθε παλμού.Έτσι, δημιουργήθηκε ένα 32 bit εγγραφή για να μετράνε.τα 32 bit μητρώο είναι χωρισμένο σε 4 φορές 8 bit.Τώρα θέλω να αποστείλει αυτές τις τιμές σε ένα μικροελεγκτή με I2C,
βρήκα ένα i2c σκλάβα για fpga4fun.Η ερώτησή μου είναι πώς να αποστέλλουν τα δεδομένα μέσω του sda.Ποιος είναι ο καλύτερος τρόπος
που έχω δοκιμάσει κάποια πράγματα, αλλά με τις γνώσεις μου verilog κώδικας δεν είναι και τόσο καλά.
Ελπίζω ότι κάποιος μπορεί να με βοηθήσει
εδώ
είναι ο κώδικας:
/ / Παράδειγμα I2C σκλάβος
/ / Www.fpga4fun.com
ενότητα I2CslaveWith8bitsIO (SDA, SCL, IOout)?
inout SDA?
εισροών SCL?
/ / Η 7-bits διεύθυνση που θέλουμε για μας I2C σκλάβος
παράμετρος I2C_ADR = 7'h27?
/ / I2C ξεκινήσει και να σταματήσει η λογική ανίχνευσης συνθήκες
/ / Αυτή είναι η "μαύρη μαγεία" τμήμα αυτού του σχεδιασμού ...
/ / Χρησιμοποιούμε δύο σύρματα με combinatorial βρόχου για την ανίχνευση της έναρξης και προϋποθέσεις
/ / Να διασφαλίσουμε αυτά τα δύο καλώδια δεν έχουν βελτιστοποιηθεί μακριά
σύρμα SDA_shadow / * σύνθεση διατηρεί = 1 * /?
σύρμα start_or_stop / * σύνθεση διατηρεί = 1 * /?
αντιστοιχίσετε SDA_shadow = (~ SCL | start_or_stop);SDA: SDA_shadow?
αντιστοιχίσετε start_or_stop = ~ SCL;1'b0: (SDA ^ SDA_shadow)?
reg incycle?
πάντα @ (negedge SCL ή posedge start_or_stop)
εάν (start_or_stop)
incycle <= 1'b0?
else if (~ SDA)
incycle <= 1'b1?/ / Τώρα είμαστε έτοιμοι να μετρήσετε το I2C bits που έρχονται σε
reg [3:0] bitcnt? / / μετράει το I2C δυφία από 7 downto 0, συν ένα ACK bit
σύρμα bit_DATA = ~ bitcnt [3]? / / την ΔΕΔΟΜΕΝΩΝ bits είναι τα πρώτα 8 bit αποστέλλονται
σύρμα bit_ACK = bitcnt [3]? / / την ACK bit είναι το 9ο bit αποστέλλονται
reg data_phase?
πάντα @ (negedge SCL ή negedge incycle)
αν (~ incycle)
αρχίζω
bitcnt <= 4'h7? / / την bit 7 λάβει πρώτα
data_phase <= 0?
τέλος
άλλος
αρχίζω
εάν (bit_ACK)
αρχίζω
bitcnt <= 4'h7?
data_phase <= 1?
τέλος
άλλος
bitcnt <= bitcnt - 4'h1?
τέλος
/ / Και να εντοπίζουν αν η διεύθυνση I2C αγώνες τους δικούς μας
σύρμα adr_phase = ~ data_phase?
reg adr_match, op_read, got_ACK?
reg SDAr?
πάντα @ (posedge SCL) SDAr <= SDA? / / SDA για posedge δείγμα, δεδομένου ότι το I2C spec διευκρινίζει στο χαμηλότερο επίπεδο που κατέχουν 0ľs χρόνο για negedge
reg [7:0] mem?
σύρμα op_write = ~ op_read?
πάντα @ (negedge SCL ή negedge incycle)
αν (~ incycle)
αρχίζω
got_ACK <= 0?
adr_match <= 1?
op_read <= 0?
τέλος
άλλος
αρχίζω
εάν (adr_phase & bitcnt == 7 & SDAr! = I2C_ADR [6]) adr_match <= 0?
εάν (adr_phase & bitcnt == 6 & SDAr! = I2C_ADR [5]) adr_match <= 0?
εάν (adr_phase & bitcnt == 5 & SDAr! = I2C_ADR [4]) adr_match <= 0?
εάν (adr_phase & bitcnt == 4 & SDAr! = I2C_ADR [3]) adr_match <= 0?
εάν (adr_phase & bitcnt == 3 & SDAr! = I2C_ADR [2]) adr_match <= 0?
εάν (adr_phase & bitcnt == 2 & SDAr! = I2C_ADR [1]) adr_match <= 0?
εάν (adr_phase & bitcnt == 1 & SDAr! = I2C_ADR [0]) adr_match <= 0?
εάν (adr_phase & bitcnt == 0) op_read <= SDAr?
εάν (bit_ACK) got_ACK <= ~ SDAr? / / παρακολουθούμε τη ACK να είναι σε θέση να ελευθερώσει το λεωφορείο, όταν ο κυβερνήτης δεν ACK διαβάσει κατά τη διάρκεια μιας επιχείρησης
εάν (adr_match & bit_DATA & data_phase & op_write) mem [bitcnt] <= SDAr? / / μνήμη γράψετε
τέλος
/ / Και να δώσει το SDA γραμμή όταν είναι απαραίτητο.
σύρμα mem_bit_low = ~ mem [bitcnt [2:0]]?
σύρμα SDA_assert_low = adr_match & bit_DATA & data_phase & op_read & mem_bit_low & got_ACK?
σύρμα SDA_assert_ACK = adr_match & & bit_ACK (adr_phase | op_write)?
σύρμα SDA_low = SDA_assert_low | SDA_assert_ACK?
αντιστοιχίσετε SDA = SDA_low;1'b0: 1'bz?endmodule