Goede avond,

ik ben al enkele dagen bezig om te proberen meerdere modules te gebruiken in mijn programma. De bedoeling is een module te maken die de code bevat voor 7-segment display en deze dan op te roepen.

Bij het compileren lukt het totaal niet! Ik ben zover gegaan totdat ik de code van een testfile van Terasic (bordje is van dit merk) heb overgenomen, maar zelfs dan compileerd het niet...

dit is de module die de andere moet oproepen


module segment2 (input clk, output reg [6:0] ssOut);
reg [27:0]  prescaler;
reg event1;
reg [3:0] uitgangen;

always @ (posedge clk) begin
	event1 <= 0;
	prescaler <= prescaler + 1;
 
	if (prescaler[23:0] == 24'h00100000) event1 <=1'b1;

	if (event1) begin
           uitgangen <= uitgangen +1;
	   SevenSegmentDisplayDecoder u0 (.oSEG0(ssOut), .iDIG(uitgangen));
       end
end
endmodule

hieronder de code van Terasic, deze zou inorde moeten zijn:


module SevenSegmentDisplayDecoder	(	oSEG,iDIG	);
input	[3:0]	iDIG;
output	[6:0]	oSEG;
reg		[6:0]	oSEG;

always @(iDIG)
begin
		case(iDIG)
		4'h1: oSEG = 7'b1111001;	// ---t----
		4'h2: oSEG = 7'b0100100; 	// |	  |
		4'h3: oSEG = 7'b0110000; 	// lt	 rt
		4'h4: oSEG = 7'b0011001; 	// |	  |
		4'h5: oSEG = 7'b0010010; 	// ---m----
		4'h6: oSEG = 7'b0000010; 	// |	  |
		4'h7: oSEG = 7'b1111000; 	// lb	 rb
		4'h8: oSEG = 7'b0000000; 	// |	  |
		4'h9: oSEG = 7'b0011000; 	// ---b----
		4'ha: oSEG = 7'b0001000;
		4'hb: oSEG = 7'b0000011;
		4'hc: oSEG = 7'b1000110;
		4'hd: oSEG = 7'b0100001;
		4'he: oSEG = 7'b0000110;
		4'hf: oSEG = 7'b0001110;
		4'h0: oSEG = 7'b1000000;
		endcase
end

endmodule

Beide modules hebben een eigen .v bestand. Ik weet niet of dit iets uitmaakt. De specifieke fout is:

Error (10170): Verilog HDL syntax error at segment2.v(19) near text "u0"; expecting "<=", or "=", or "+=", or "-=", or "*=", or "/=", or "%=", or "&=", or "|=", or "^=", or "<<=", or ">>=", or "<<<=", or ">>>=", or "++", or "--"

dit slaat op de regel:

SevenSegmentDisplayDecoder u0 (.oSEG0(ssOut), .iDIG(uitgangen));

Ik doe denk ik alles goed... Ik ben ten einde raar over dit stukje code:/ Het zal wel weer iets idioots zijn ofzo...

alvast bedankt,
Tijmerd

Hier is duidelijk een software designer aan het werk! :-)

Die module is GEEN functie zoals in C of Basic. Het is een stukje hardware dat je neerlegt dat volledig parallel werkt van je eerste module segment2. Je kunt dus niet een module "aanroepen" op een bepaald moment (if..... then). Denk hardware.
Hoe het wel moet: Je kunt de ene module als onderdeel van de andere instantieren. Dat moet buiten de always@ gebeuren.

Wat je vaak ziet is een "structure" module, van waaruit alleen maar andere modules worden geinstantieerd. Via wires hangen al die modules aan elkaar. Verder zit er in die topmodule geen hardware, dus always@ of assigns. Op die manier hou je een mooi clean design, zoals je een blokschema zou tekenen.

Ik dacht dat ik die al instantieerde door ze zo "op te roepen" maar blijkbaar niet... ik heb al verschillende samples geprobeerd vanop internet maar er is nog niets dat mij gelukt is:/

kan je me soms nog wat extra informatie geven?

Bedankt

het is helemaal niet nodig om dat in je event te doen.
je mag die decoder altijd aangesloten laten op de uitgangen.

ik ben zelf niet thuis in module instantiering ( ik moet het altijd zelf opzoeken, veel teveel tikwerk en een spaghettie om uit te vlooien welk signaal er nu in welke modules gebruikt wordt. ik maak altijd een mooi toplevel schema.)

in princiepe moet jij een toplevel vberilog blok maken waar je een instantie van je klok maakt en een instantie van die decoder.
daar defineer je dan een wire en je gebruikt die naam om ze aan elkaar te lijmen,

iets in dit genre :

wire [3:0] blabla
output [7:0] uit
SevenSegmentDisplayDecoder blok1 (.oSEG0(uit), .iDIG(blabla));
segment2 blok2 (.uitgangen(blabla))

je gaat je uitgangen wel in je lijst van i/o moeten meegeven.

Nou vooruit, een voorbeeldje. Je hebt wel wat zoektermen inmiddels om zelf wat te googlen. Probeer dit eens te snappen:



module segment2 (input clk, output reg [3:0] out);
  reg [3:0] counter;

  buffer buf0 (.in(counter{0}), .out(uit(0)));
  buffer buf1 (.in(counter{1}), .out(uit(1)));
  buffer buf2 (.in(counter{2}), .out(uit(2)));
  buffer buf3 (.in(counter{3}), .out(uit(3)));
 
  always @ (posedge clk) begin
    counter <= counter + 1;
  end
endmodule


module buffer (in, out);
input in;
output out;
  assign out = in; 
endmodule

Nogmaals, je roept niets aan zoals in software. Je legt hardware neer, net zoals echte hardware.