Ik moet voor school een chronometer programmeren in Abel-hdl.
Ik heb een programma geschreven dat zou moeten werken. Maar wanneer ik het probeer te compileren zegt hij dat er te veel GLB's zijn.
Is er een moeglijkheid om deze code eenvoudiger te maken?

MODULE Chrono

TITLE 'chronometer min sec en hondersten'
"ingangen en uitgangen"
segmA,segmB,segmC,segmD,segmE,segmF,segmG,segmP pin 20,23,17,18,26,22,24,19 istype 'com';
disp1,disp2,disp3,disp4 pin 27,28,29,30 istype 'buffer';
clk0,clk1 pin 60,65;
start,stop,reset,ms pin 40,42,45,47;
"registers"
mint3,mint2,mint1,mint0 node istype 'reg_d';
mine3,mine2,minte,mine0 node istype 'reg_d';
sect3,sect2,sect1,sect0 node istype 'reg_d';
sece3,sece2,sece1,sece0 node istype 'reg_d';
milt3,milt2,milt1,milt0 node istype 'reg_d';
mile3,mile2,mile1,mile0 node istype 'reg_d';
temp3,temp2,temp1,temp0 node istype 'com';
"carry's
CoMe,CoSe,CoSt,CoMIe,CoMIt node istype 'com';
counter1,counter0 node istype 'reg_d';
init, run node istype 'com';
"set's"
minutent = [mint3,mint2,mint1,mint0]; 
minutene = [mine3,mine2,minte,mine0]; 
secondent = [sect3,sect2,sect1,sect0]; 
secondene = [sece3,sece2,sece1,sece0]; 
millisecondent = [milt3,milt2,milt1,milt0]; 
millisecondene = [mile3,mile2,mile1,mile0];
counter = [counter1,counter0];
disp =[disp1,disp2,disp3,disp4];
temp = [temp3,temp2,temp1,temp0];
c=.c.;

EQUATIONS

minutent.clk = clk1;
minutene.clk = clk1;
secondent.clk = clk1;
secondene.clk = clk1;
millisecondene.clk = clk1;
millisecondent.clk = clk1; 

minutent.ar = init;
minutene.ar = init;
secondent.ar = init;
secondene.ar = init;
millisecondene.ar = init;
millisecondent.ar = init; 

	when ((start == 1)& (stop == 0) & (reset == 0)) then run = 1;
else 	when ((start == 0)& (stop == 1) & (reset == 0)) then run = 0;
else  	run = run;

	when ((reset == 1) & (run == 0))then init = 1;
else init = 0; 
"------------------------------------------------------------------------
		when((run == 1)&(millisecondene<9)) then millisecondene := millisecondene + 1;
	else 	when((1 == 1)&(millisecondene>=9)) then millisecondene := 0;
	else 	millisecondene := millisecondene;
	
	CoMIe = (millisecondene==9);
"------------------------------------------------------------------------
		when((CoMIe == 1)&(millisecondent<9)) then millisecondent := millisecondent + 1;
	else 	when((CoMIe == 1)&(millisecondent>=9)) then millisecondent:= 0;
	else 	millisecondent := millisecondent;
	
	CoMIt = CoMIe & (millisecondent==9);
"------------------------------------------------------------------------
		when((CoMIt == 1)&(secondene<9)) then secondene := secondene + 1;
	else 	when((CoMIt == 1)&(secondene>=9)) then secondene:= 0;
	else 	secondene := secondene;
	
	CoSe = CoMIt & (secondene==9);
"------------------------------------------------------------------------
		when((CoSe == 1)&(secondent<5)) then secondent := secondent + 1;
	else 	when((CoSe == 1)&(secondent>=5)) then secondent:= 0;
	else 	secondent := secondent;
	
	CoSt = CoSe & (secondent==5);
"------------------------------------------------------------------------
		when((CoSt == 1)&(minutene<9)) then minutene := minutene + 1;
	else 	when((CoSt == 1)&(minutene>=9)) then minutene:= 0;
	else 	minutene := minutene;
	
	CoMe = CoSt & (minutene==9);
"------------------------------------------------------------------------
		when((CoMe == 1)&(minutent<5)) then minutent := minutent + 1;
	else 	when((CoMe == 1)&(minutent>=5)) then minutent:= 0;
	else 	minutent := minutent;

"------------------------------------------------------------------------
	
"Multiplex"

counter.clk = clk0;
counter := counter + 1;

		when (counter == 0) then disp = 1;
	else 	when (counter == 1) then disp = 2;
	else 	when (counter == 2) then disp = 4;
	else 	when (counter == 3) then disp = 8;

when (ms == 1) then{ 
		when (counter == 0) then {temp = secondene;}
	else 	when (counter == 1) then {temp = secondent;}
	else 	when (counter == 2) then {temp = minutene;segmP = 1;}
	else 	when (counter == 3) then {temp = minutent;}}
				
else {	
		when (counter == 0) then {temp = millisecondene;}
	else 	when (counter == 1) then {temp = millisecondent;}
	else 	when (counter == 2) then {temp = secondene;segmP = 1;}
	else 	when (counter == 3) then {temp = secondent;}}

truth_table				" aansturing voor de segmenten

	([temp]->[segmA,segmB,segmC,segmD,segmE,segmF,segmG])
	           
	[0]->[1,1,1,1,1,1,0];   "0
	[1]->[0,1,1,0,0,0,0];	"1
	[2]->[1,1,0,1,1,0,1];	"2
	[3]->[1,1,1,1,0,0,1];	"3
	[4]->[0,1,1,0,0,1,1];	"4
	[5]->[1,0,1,1,0,1,1];	"5
	[6]->[0,0,1,1,1,1,1];	"6
	[7]->[1,1,1,0,0,0,0];	"7
	[8]->[1,1,1,1,1,1,1];	"8
	[9]->[1,1,1,0,0,1,1];	"9


END

je kunt 2 flipflops wegsmijten....

secondentientallen loopt maar van 0 tot 5.... (60 seconden per minuut) dus daar kan je al iets weggooien...
ditto voor minuten tientallen...

Anders pak je beter een groter device.

maar waarom in godsnaam nog ABEL ... geen kat gebruikt dat nog. das al 10 jaar pieredood

Bedankt voor de reactie.

Wanneer ik die 2 fliplops wegdoe krijg ik een error omdat ik deze bij het multiplexen van de displays de 3bit node in een 4bit node wil steken.

Een andere device is geen optie we moeten een bepaalde cpld gebruiken.

edit: heb de 2 flipflops weggedaan en een 2de temp node gemaakt.
en dit compileerd :). morgen eens testen of het werkt.

[Bericht gewijzigd door kortsluiting op (20%)]

Free: dit is omdat een docent, die niets van nieuwe technology weet, het ooit voor elkaar (of iemand het voor elkaar heb zien) heeft gekregen om de betreffende opdracht precies in dat type device met een prehistorische taal te frotten.

Arme studenten, tegenwoordig...

We krijgen vhdl in het 2de semester waarschijnlijk was dit een opwarmertje...

heb het nog steeds niet goed gekregen maar heb de minuten tientallen verwijderd en dan lukt het wel.

Ik heb nog een vraagje, wanneer ik mijn stop knop indruk gaat hij automatisch resetten. Als ik de knop zeer snel indruk en loslaat gaat hij niet in reset. Ik heb geen idee waar het fout loopt.