mikrocontroller.net

Forum: FPGA, VHDL & Co. Register Wert einem Wire zuweisen in Verilog


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: verinoob (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem: Ich versuche PWM-Werte aus den always 
Blöcken den jeweiligen Outputs MTRR_P usw. mit innerhalb der 
Bedingungsoperatoren zuzuweisen. Jedoch erhalte ich laut der Simulation 
dauernd eine 1 an jedem Ausgang.
Wo kann der Fehler liegen?
module PWM  (
input        CLK_50, 

output       MTR_Sleep_n,

  output MTRL_P,
  output MTRL_N,
  output MTRR_N,
  output MTRR_P

);

reg   PWM_O_R ; 
reg  PWM_O_L ;

reg [15:0] CNT1 ; 
reg [15:0] CNT2 ; 


assign MTR_Sleep_n = 1'b1;


//----     
//L_EMOTOR 
assign   MTRL_N = (!1)?1:  ((0)?0   : PWM_O_L); 
assign   MTRL_P = (!1)?1:  ((0)?PWM_O_L : 0  ); 
//R_EMOTOR          
assign   MTRR_P = (!1)?0:  ((0)?0  : PWM_O_R ); 
assign   MTRR_N = (!1)?1:  ((0)?PWM_O_R: 0   ); 

//assign   MTRL_N = ~1?1:  ((1)?0   : 1); 
//assign   MTRL_P = (~1)?0:  ((0)?1 : 0  ); 
////R_EMOTOR          
//assign   MTRR_P = ~1?0:  ((0)?0  : 1 ); 
//assign   MTRR_N = ~1?1:  ((0)?1: 0   ); 

//assign   MTRL_N = (!1)?1: 0; 
//assign   MTRL_P = (1)?0:1; 
////R_EMOTOR          
//assign   MTRR_P = !1?0:1; 
//assign   MTRR_N = 1?1:0; 


always @ ( posedge CLK_50 ) begin 
    CNT1 <=  CNT1 + 1;  
   if (CNT1 > 16'h64 )  PWM_O_R <= 0; 
    else  PWM_O_R <= 1;  
end 

always @ ( posedge CLK_50 ) begin 
    CNT2 <=  CNT2 + 1;  
   if (CNT2 > 16'h64 )  PWM_O_L <= 0; 
    else  PWM_O_L <= 1;  
end 

endmodule 

Autor: Bernhard K. (bkom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schätze CNT1 und 2 werden nie anders als xxxx oder so..

Register entweder so initialisieren:
--
reg [15:0] CNT1 = 0;
--

Oder syncron oder asyncron resetten:
--
always @ ( posedge CLK_50 [or posedge reset]) begin
    if (reset) then
    NT1 <= 0;
    else
      CNT1 <=  CNT1 + 1;
      if (CNT1 > 16'h64 )  PWM_O_R <= 0;
      else  PWM_O_R <= 1;
end
--

Autor: Robert P. (fpgazumspass) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und/Oder der Takt lebt nicht, weil 1 ja für die "niedrigen" Zählerstände 
gilt.

Zum ternären Operator kann man ja stehen wie man will, aber das hier ist 
schon fast geeignet als Scherzfrage im Vorstellungsgespräch:

assign   MTRL_N = (!1)?1:  ((0)?0   : PWM_O_L);

Autor: verinoob (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Bernhard K. schrieb:
> Schätze CNT1 und 2 werden nie anders als xxxx oder so..

Dann schätz mal weiter. Das Ding ist, dass die always Blöcke schon 
getrennt getestet wurden und beide erwartungsgemäß funktionieren ;)
Solltest wohl lieber bei einem Schätzspiel mitmachen



Robert P. schrieb:
> Zum ternären Operator kann man ja stehen wie man will, aber das hier ist
> schon fast geeignet als Scherzfrage im Vorstellungsgespräch:
>
> assign   MTRL_N = (!1)?1:  ((0)?0   : PWM_O_L);

Dafür, dass du anscheinend nicht wirklich viel Ahnung hast, nimmst du 
den Mund ganz schön voll

Autor: Bernhard K. (bkom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@verinoob

wasch doch bitte deinen Mund ersteinmal mit Seife aus, vorher bekommst 
du von mir keine Hilfe mehr!

: Bearbeitet durch User
Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du den Simulator so behandelst, wie die Forenteilnehmer hier, dann 
ist es kein Wunder, wenn er dir falsche Werte anzeigt.

Autor: verinoob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Bernhard K

ich möchte mich für meine Aussage gegenüber dir entschuldigen. Ich hatte 
übersehen, dass zwei verschiedene Personen geantwortet haben. Dachte du 
bist dieser Robert P. mit seiner dummen Aussage.

Ich danke dir für dein Tipp. Werde ich ausprobieren

Autor: Frank S. (schroederde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noop bleibt eben noop.

Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Robert P. schrieb:
> assign   MTRL_N = (!1)?1:  ((0)?0   : PWM_O_L);

Ich arbeite noch nicht so wirlich lange mit Verilog, aber dieses 
Statement hat mich jetzt auch überrascht. Kann das jemand erklären?

Autor: Thomas W. (diddl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vancouver schrieb:
> Robert P. schrieb:
>> assign   MTRL_N = (!1)?1:  ((0)?0   : PWM_O_L);
>
> Ich arbeite noch nicht so wirlich lange mit Verilog, aber dieses
> Statement hat mich jetzt auch überrascht. Kann das jemand erklären?

Es weist PWM_O_L an MTRL_N zu, IMMER.

Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas W. schrieb:
> Es weist PWM_O_L an MTRL_N zu, IMMER.

So hätte ich das auch interpretiert, aber warum tut man das auf diese 
Weise?

Autor: Thomas W. (diddl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vancouver schrieb:
> So hätte ich das auch interpretiert, aber warum tut man das auf diese
> Weise?

Ach das ergibt sich manchmal so.

Wenn ursprünglich eine Bedingung da war, die man nicht mehr will, aber 
nicht sicher ist ob man sie dann doch wieder will.

Das ganze wird sowieso weg optimiert, insofern einfach Faulheit des 
Autor, es so stehen zu lassen.

Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, ok. Ich dachte es gäbe da noch eine Besonderheit, die ich nicht 
kenne.

Ich hätte für die Conditions symbolische Namen eingesetzt und die auf 
einen festen Wert geklemmt, oder das ganze Statement auskommentiert 
stehen gelassen.

Danke.

Autor: Verinoob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In den Bedingungsoperatoren waren selbstverständlich Input als Bedingung 
angeklemmt worden. Ich habe den Bedingungen erstmal durch feste Zahlen 
ersetzt, um die Abfragen zu überprüfen.

Autor: Robert P. (fpgazumspass) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ja, und diesen sinnlosen Kram stelle ich dann auch unbedingt in ein 
Forum von dem ich Hilfe erwarte...
Etwa die Hälfte des Codes besteht daraus!
Mag dir klar sein, aber sicher nicht jedem auf den ersten Blick der das 
ankuckt um zu helfen.

Im übrigen lag Berhnhard völlig richtig, es fehlt nur der init Wert, 
weil sonst auf X gewechselt wird beim ersten Hochzählen.
Mit Init Wert läuft alles, siehe Anhang.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.