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


von verinoob (Gast)


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?
1
module PWM  (
2
input        CLK_50, 
3
4
output       MTR_Sleep_n,
5
6
  output MTRL_P,
7
  output MTRL_N,
8
  output MTRR_N,
9
  output MTRR_P
10
11
);
12
13
reg   PWM_O_R ; 
14
reg  PWM_O_L ;
15
16
reg [15:0] CNT1 ; 
17
reg [15:0] CNT2 ; 
18
19
20
assign MTR_Sleep_n = 1'b1;
21
22
23
//----     
24
//L_EMOTOR 
25
assign   MTRL_N = (!1)?1:  ((0)?0   : PWM_O_L); 
26
assign   MTRL_P = (!1)?1:  ((0)?PWM_O_L : 0  ); 
27
//R_EMOTOR          
28
assign   MTRR_P = (!1)?0:  ((0)?0  : PWM_O_R ); 
29
assign   MTRR_N = (!1)?1:  ((0)?PWM_O_R: 0   ); 
30
31
//assign   MTRL_N = ~1?1:  ((1)?0   : 1); 
32
//assign   MTRL_P = (~1)?0:  ((0)?1 : 0  ); 
33
////R_EMOTOR          
34
//assign   MTRR_P = ~1?0:  ((0)?0  : 1 ); 
35
//assign   MTRR_N = ~1?1:  ((0)?1: 0   ); 
36
37
//assign   MTRL_N = (!1)?1: 0; 
38
//assign   MTRL_P = (1)?0:1; 
39
////R_EMOTOR          
40
//assign   MTRR_P = !1?0:1; 
41
//assign   MTRR_N = 1?1:0; 
42
43
44
always @ ( posedge CLK_50 ) begin 
45
    CNT1 <=  CNT1 + 1;  
46
   if (CNT1 > 16'h64 )  PWM_O_R <= 0; 
47
    else  PWM_O_R <= 1;  
48
end 
49
50
always @ ( posedge CLK_50 ) begin 
51
    CNT2 <=  CNT2 + 1;  
52
   if (CNT2 > 16'h64 )  PWM_O_L <= 0; 
53
    else  PWM_O_L <= 1;  
54
end 
55
56
endmodule

von Bernhard K. (bkom)


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
--

von Robert P. (fpgazumspass) Benutzerseite


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);

von verinoob (Gast)


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

von Bernhard K. (bkom)


Lesenswert?

@verinoob

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

: Bearbeitet durch User
von Andi (Gast)


Lesenswert?

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

von verinoob (Gast)


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

von Frank S. (schroederde)


Lesenswert?

Noop bleibt eben noop.

von Vancouver (Gast)


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?

von Thomas W. (diddl)


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.

von Vancouver (Gast)


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?

von Thomas W. (diddl)


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.

von Vancouver (Gast)


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.

von Verinoob (Gast)


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.

von Robert P. (fpgazumspass) Benutzerseite


Angehängte Dateien:

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.