Gå til innhold

Signal connected to multiple drivers [Verilog] Xilinx ISE


Anbefalte innlegg

Hei, jeg skjønner ikke hvorfor jeg får denne feilmeldingen her:

Xst:528 - Multi-source in Unit <i2c> on signal <busy>; this signal is connected to multiple drivers.

Her er det forskjellige modulene, som får akkurat samme feilmelding:

(du trenger bare å se på den øverste kode boksen om du tror du vet hva som kan være feil, alle de andre er bare for å vise at jeg har prøvd "alt".)

module i2c (clk, busy, noe);
input clk;
input [1:0] noe;
output busy;
reg busy = 0;

always@(posedge clk)
begin
  if(noe==0) busy = 0;
  else if(noe==1) busy = 1;
end
   
module i2c (clk, busy, noe);
input clk;
input [1:0] noe;
output busy;
reg busy = 0;

always@(posedge clk)
begin
  if(noe==0) busy <= 0;
  else if(noe==1) busy <= 1;
end
module i2c (clk, busy, noe);
input clk;
input [1:0] noe;
output busy;
reg busy;

always@(posedge clk)
begin
  if(noe==0) busy = 0;
  else if(noe==1) busy = 1;
end
module i2c (clk, busy, noe);
input clk;
input [1:0] noe;
output busy;
reg busy;

always@(posedge clk)
begin
  if(noe==0) busy <= 0;
  else if(noe==1) busy <= 1;
end
module i2c (clk, busy, noe);
input clk;
input [1:0] noe;
output busy;
reg bus;
assign busy = (bus) ? 1'b1:1'b0;

always@(posedge clk)
begin
  if(noe==0) bus = 0;
  else if(noe==1) bus = 1;
end
module i2c (clk, busy, noe);
input clk;
input [1:0] noe;
output busy;
reg bus;
assign busy = (bus) ? 1'b1:1'b0;

always@(posedge clk)
begin
  if(noe==0) bus <= 0;
  else if(noe==1) bus <= 1;
end

Hva i granskauen kan være gale? På de to siste får jeg fortsatt feilmelding på "busy" og ikke noe på "bus".

Lenke til kommentar
Videoannonse
Annonse

Du gir busy en verdi utenfor always blokken og det gir multiple drivers. Du kan bare gi en verdi i en always blokk eller på en enkelt linje utenfor.

Du må også bruke <= når det er always @posegde clk, og bør bruke = når det always@*

 

Korrekt er alternativ 4 (om jeg telte rett), men jeg ville nok skrevet litt annerledes.

module i2c (clk, busy, noe);
input clk;
input [1:0] noe;
output busy;
reg busy;
 
always@(posedge clk) begin
  if(noe==2'b00) 
    busy <= 1'b0;
  if(noe==2'b01) 
    busy <= 1'b1;
end
Endret av Dr_VingTor
  • Liker 1
Lenke til kommentar

Hmm, takk for forslag, skal undersøke litt til.

 

EDIT: Er det slik at jeg bør sende en reset for å sette verdier? Slik at min FSM kommer seg i IDLE state? (dette er bare en liten del av en I2C master kontroller jeg har laget, alle disse feilmeldingene kom når jeg skulle prøve å implementere det på min fpga som krever at ejg bruker Xilinx Project navigator)

 

EDIT2:

Om jeg heller har lyst til å bruke en case i steden for if - else if da? Gjør det noen forskjell på om jeg skal bruke blocked / unblocked ( = / <= )?

Endret av Kirchhoff
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...