T
torius
Guest
Hello there,
Sem zaposlen s 2 moter encoders.ti so encoders connented na FPGA.FPGA potrebo za štetje vsak utrip.tudi jaz ustvarila 32 bitni register za štetje.32 bit register je razdeljeno na 4-krat 8 bit.Zdaj hočem, da pošljejo te vrednosti mikrokrmilniška z I2C, sem našel I2C sužnji na fpga4fun.Moje vprašanje je, kako poslati podatke prek sda.Kaj je najboljši način Poskusil sem nekaj stvari, vendar mi je znano z verilog koda ni tako dober.
Upam, da nekateri moči pomoč mi
tukaj je koda:
/ / Primer I2C slave
/ / Www.fpga4fun.com
modul I2CslaveWith8bitsIO (SDA, SCL, IOout);
InOut SDA;
input SCL;
/ / 7-bitov naslov, da želimo za našo I2C slave
parameter I2C_ADR = 7'h27;
/ / I2C zagon in ustavitev pogoji odkrivanje logike
/ / To je "črno magijo", del tega modela ...
/ / Mi uporabljamo dve žici z combinatorial zanko za odkrivanje začeti in končati pogoji
/ / Kar prepričan ti dve žice ne dobite optimizirana stran
žice SDA_shadow / * sintezo vodi = 1 * /;
žice start_or_stop / * sintezo vodi = 1 * /;
dodelite SDA_shadow = (~ SCL | start_or_stop)?SDA: SDA_shadow;
dodeliti start_or_stop = ~ SCL?1'b0: (SDA ^ SDA_shadow);
reg incycle;
Vedno @ (negedge SCL ali start_or_stop posedge)
if (start_or_stop)
incycle <= 1'b0;
else if (~ SDA)
incycle <= 1'b1;/ / Sedaj smo pripravljeni za štetje I2C bitov, ki prihajajo v
reg [3:0] bitcnt; / / šteje I2C bits od 7 downto 0, plus ACK bit
wire bit_DATA = ~ bitcnt [3], / / DATA bitov se prvih 8 bitov, pošlje
wire bit_ACK = bitcnt [3], / / ACK bit je bit poslano 9.
reg data_phase;
Vedno @ (negedge SCL ali incycle negedge)
if (~ incycle)
začeti
bitcnt <= 4'h7; / / bit 7 je prejela prvo
data_phase <= 0;
konec
še
začeti
if (bit_ACK)
začeti
bitcnt <= 4'h7;
data_phase <= 1;
konec
še
bitcnt <= bitcnt - 4'h1;
konec
/ / In odkrivanja, če je naslov I2C tekem lastnega
wire adr_phase = ~ data_phase;
reg adr_match, op_read, got_ACK;
reg SDAR;
Vedno @ (posedge SCL) SDAR <= SDA; / / vzorec SDA na posedge saj spec I2C določa tako nizke, kot 0ľs imajo časa na negedge
reg [7:0] mem;
wire op_write = ~ op_read;
Vedno @ (negedge SCL ali incycle negedge)
if (~ incycle)
začeti
got_ACK <= 0;
adr_match <= 1;
op_read <= 0;
konec
še
začeti
if (adr_phase & bitcnt == 7 & SDAR! = I2C_ADR [6]) adr_match <= 0;
if (adr_phase & bitcnt == 6 & SDAR! = I2C_ADR [5]) adr_match <= 0;
if (adr_phase & bitcnt == 5 & SDAR! = I2C_ADR [4]) adr_match <= 0;
if (adr_phase & bitcnt == 4 & SDAR! = I2C_ADR [3]) adr_match <= 0;
if (adr_phase & bitcnt == 3 & SDAR! = I2C_ADR [2]) adr_match <= 0;
if (adr_phase & bitcnt == 2 & SDAR! = I2C_ADR [1]) adr_match <= 0;
if (adr_phase & bitcnt == 1 & SDAR! = I2C_ADR [0]) adr_match <= 0;
if (adr_phase & bitcnt == 0) op_read <= SDAR;
if (bit_ACK) got_ACK <= ~ SDAR; / / spremljamo ACK, da se lahko prosto avtobus, ko poveljnik ne ACK med brati operacijo
if (adr_match & bit_DATA & data_phase & op_write) mem [bitcnt] <= SDAR; / / spomin pisanje
konec
/ / In vozite črto SDA kadar je to potrebno.
wire mem_bit_low = ~ mem [bitcnt [2:0]];
wire SDA_assert_low = adr_match & bit_DATA & data_phase & op_read & mem_bit_low & got_ACK;
wire SDA_assert_ACK = adr_match & bit_ACK & (adr_phase | op_write);
wire SDA_low = SDA_assert_low | SDA_assert_ACK;
dodeliti SDA = SDA_low?1'b0: 1'bz;endmodule
Sem zaposlen s 2 moter encoders.ti so encoders connented na FPGA.FPGA potrebo za štetje vsak utrip.tudi jaz ustvarila 32 bitni register za štetje.32 bit register je razdeljeno na 4-krat 8 bit.Zdaj hočem, da pošljejo te vrednosti mikrokrmilniška z I2C, sem našel I2C sužnji na fpga4fun.Moje vprašanje je, kako poslati podatke prek sda.Kaj je najboljši način Poskusil sem nekaj stvari, vendar mi je znano z verilog koda ni tako dober.
Upam, da nekateri moči pomoč mi
tukaj je koda:
/ / Primer I2C slave
/ / Www.fpga4fun.com
modul I2CslaveWith8bitsIO (SDA, SCL, IOout);
InOut SDA;
input SCL;
/ / 7-bitov naslov, da želimo za našo I2C slave
parameter I2C_ADR = 7'h27;
/ / I2C zagon in ustavitev pogoji odkrivanje logike
/ / To je "črno magijo", del tega modela ...
/ / Mi uporabljamo dve žici z combinatorial zanko za odkrivanje začeti in končati pogoji
/ / Kar prepričan ti dve žice ne dobite optimizirana stran
žice SDA_shadow / * sintezo vodi = 1 * /;
žice start_or_stop / * sintezo vodi = 1 * /;
dodelite SDA_shadow = (~ SCL | start_or_stop)?SDA: SDA_shadow;
dodeliti start_or_stop = ~ SCL?1'b0: (SDA ^ SDA_shadow);
reg incycle;
Vedno @ (negedge SCL ali start_or_stop posedge)
if (start_or_stop)
incycle <= 1'b0;
else if (~ SDA)
incycle <= 1'b1;/ / Sedaj smo pripravljeni za štetje I2C bitov, ki prihajajo v
reg [3:0] bitcnt; / / šteje I2C bits od 7 downto 0, plus ACK bit
wire bit_DATA = ~ bitcnt [3], / / DATA bitov se prvih 8 bitov, pošlje
wire bit_ACK = bitcnt [3], / / ACK bit je bit poslano 9.
reg data_phase;
Vedno @ (negedge SCL ali incycle negedge)
if (~ incycle)
začeti
bitcnt <= 4'h7; / / bit 7 je prejela prvo
data_phase <= 0;
konec
še
začeti
if (bit_ACK)
začeti
bitcnt <= 4'h7;
data_phase <= 1;
konec
še
bitcnt <= bitcnt - 4'h1;
konec
/ / In odkrivanja, če je naslov I2C tekem lastnega
wire adr_phase = ~ data_phase;
reg adr_match, op_read, got_ACK;
reg SDAR;
Vedno @ (posedge SCL) SDAR <= SDA; / / vzorec SDA na posedge saj spec I2C določa tako nizke, kot 0ľs imajo časa na negedge
reg [7:0] mem;
wire op_write = ~ op_read;
Vedno @ (negedge SCL ali incycle negedge)
if (~ incycle)
začeti
got_ACK <= 0;
adr_match <= 1;
op_read <= 0;
konec
še
začeti
if (adr_phase & bitcnt == 7 & SDAR! = I2C_ADR [6]) adr_match <= 0;
if (adr_phase & bitcnt == 6 & SDAR! = I2C_ADR [5]) adr_match <= 0;
if (adr_phase & bitcnt == 5 & SDAR! = I2C_ADR [4]) adr_match <= 0;
if (adr_phase & bitcnt == 4 & SDAR! = I2C_ADR [3]) adr_match <= 0;
if (adr_phase & bitcnt == 3 & SDAR! = I2C_ADR [2]) adr_match <= 0;
if (adr_phase & bitcnt == 2 & SDAR! = I2C_ADR [1]) adr_match <= 0;
if (adr_phase & bitcnt == 1 & SDAR! = I2C_ADR [0]) adr_match <= 0;
if (adr_phase & bitcnt == 0) op_read <= SDAR;
if (bit_ACK) got_ACK <= ~ SDAR; / / spremljamo ACK, da se lahko prosto avtobus, ko poveljnik ne ACK med brati operacijo
if (adr_match & bit_DATA & data_phase & op_write) mem [bitcnt] <= SDAR; / / spomin pisanje
konec
/ / In vozite črto SDA kadar je to potrebno.
wire mem_bit_low = ~ mem [bitcnt [2:0]];
wire SDA_assert_low = adr_match & bit_DATA & data_phase & op_read & mem_bit_low & got_ACK;
wire SDA_assert_ACK = adr_match & bit_ACK & (adr_phase | op_write);
wire SDA_low = SDA_assert_low | SDA_assert_ACK;
dodeliti SDA = SDA_low?1'b0: 1'bz;endmodule