Register Wert einem Wire zuweisen in Verilog

Gast #6013027
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
#6013079
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
--
Gast #6013153
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
Gast #6013257
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
Gast #6013592
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.
Persönliche Seite #6014212
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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren