rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Bij mij zeurt ie ook altijd dat mijn clock signaal een "undefined clock" is. Kennelijk heb ik ook nog niet gevonden hoe je hem verteld dat het een clock is. Zo zijn er veel meer warnings die ik krijg waarvan ik zeg: "Dat heb je goed gezien, jongen!". (addr is een 32 bit counter. addr = addr + 32'h100, dan roept ie dat de onderste 8 bits helemaal nul blijven! ehh. gelijk heb je!)
Dat ie w_n en temp_clock[*] als clocks gaat zien lijkt me ongewenst. De huidige situatie is denk ik dat het wel werkt, maar dat je in randgevallen problemen kan krijgen. Metastabiliteit als je "w_n" signaal op een verkeerd moment veranderd. Of slechte timing eigenschappen in je PWM module.
Hallo,
laat mij even voorstellen, ik ben niet nieuw op dit forum, maar wel nieuw in de CPLD/FPGA wereld.
Ik heb sinds kort een UP2 bordje van altera in mijn bezit met daarop een MAX en een FLEX.
Ik zou heel graag willen beginnen experimenteren met de VGA poort die erop zit.
Maar ik heb een fout in mijn code en ze is waarschijnlijk heel eenvoudig, maar ik slaag er maar niet in om ze te vinden. Dit is mijn code:
module eigen_vga_project(clk, red, blue, green, h_sync, v_sync);
// Input Port(s)
input clk;
// Output Port(s)
output red;
output blue;
output green;
output h_sync;
output v_sync;
wire h_sync;
wire v_sync;
wire red;
reg[10:0] h_count;
reg[19:0] v_count;
// Update the register output on the clock's rising edge
always @ (posedge clk)
begin
assign red = 1'b1;
if ( h_count == 795 )
begin
h_count = 0;
end
else
begin
h_count <= h_count + 1;
end
if (h_count >= 653 && h_count <= 747 )
begin
h_sync <= 1'b1;
end
else
begin
h_sync <= 1'b0;
end
if ( v_count == 415000 )
begin
v_count = 0;
end
else
begin
v_count <= v_count + 1;
end
if (v_count >= 390000 && v_count <= 391500 )
begin
v_sync = 1'b0;
end
else
begin
v_sync = 1'b1;
end
end
endmodule
De error die ik krijg is dat h_sync, v_sync en red een "variable data type" moeten hebben.
Hoe los ik dit op? Want ze staan toch gedefineerd bovenaan in mijn module?
Grtz Sam.
hsync vsync en red zijn outputs en moeten in dit geval dus van het type reg zijn i.p.v wat ze nu zijn (wire)
assign red = 1'b1;
dit doe je buiten je always @ statement, als je toch wilt dat er red een waarde gegeven wordt binnen ene always @ blok dan doe je:
red <= 1'b1;
[Bericht gewijzigd door surge_me op (48%)]
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Alternatief is (voor de hsync bijvoorbeeld) om
assign h_sync = (h_count >= 653 && h_count <= 747 ) ? 1: 0;
te doen. Dan wordt ie combinatorisch van h_count afgeleid.
Bedankt voor de tip, maar ik zie het nut niet in waarom ik dat zou veranderen.
Zou er dan iets verbeteren aan mijn software?
Overigens met alle fouten eruit, krijg ik nog steeds geen kleur op mijn scherm 
Maar ik zie wel duidelijk dat mijn beeld "opstart".
Ik hoop dat jullie begrijpen wat ik bedoel. Want ik zie dat het backlight van mijn LCD scherm aanspringt, en ik kan in mijn OSD menu gaan van mijn scherm.
Iets wat ik niet kan als mijn scherm in stand by staat.
OOK als ik mijn scherm ontkoppel van mijn bordje, komt de melding op mijn scherm "no signal, going to sleep".
Iets wat er ook op komt als ik mijn pc uitzet.
Kan ik hieruit afleiden dat mijn h_sync & v_sync correct zijn?
Grtz.
Op 28 november 2007 17:38:21 schreef the-x:
Zou er dan iets verbeteren aan mijn software?
Eh dat is nu net je fout.... je maakt geen software, maar hardware...
Daarnaast kun je zien dat Hsync en Vsync goed werken in het OSD, daar kun je vaak de frequentie zien van de inkomende signalen
Op 28 november 2007 17:41:55 schreef surge_me:
[...]
Daarnaast kun je zien dat Hsync en Vsync goed werken in het OSD, daar kun je vaak de frequentie zien van de inkomende signalen
Hmmm. Ik ga het veranderen, want ik voel me maar een leek tussen jullie. Het nut zal me dan later wel inkomen. 
En als dat waar is wat je zegt, dat je de frequentie van hsync & vsync kunt aflezen in het osd menu van mijn scherm. Dan heb ik het volgende:
Als ik naar het onderdeel "information" ga van mijn scherm, dan zie ik daar staan
31,6 KHz / 60,7 Hz
H+ / V-
Lijkt mij dan dat ik een soort van kleurenprobleem heb.
Eens uitzoeken dus. Thx voor je goede raad!
De meeste monitors vragen een negatieve sync. Ik zie dat die bij jou de horizontale sync positief is, de vertikale is negatief. Ik zou dit even nakijken.
Op 28 november 2007 18:22:47 schreef fotoopa:
De meeste monitors vragen een negatieve sync. Ik zie dat die bij jou de horizontale sync positief is, de vertikale is negatief. Ik zou dit even nakijken.
Je hebt inderdaad gelijk. Ik heb een klein foutje gemaakt. Stom! Maar blijkbaar was het dat toch niet.
Mijn monitor wil maar geen kleur weergeven.
En als ik kijk bij frequentie staat er mooi V-: 60Hz en H-: 31,7 KHz.
Ach ja, ik ben nog lang niet van plan om op te geven!
Bedankt voor de opmerking! Zo ging ik er inderdaad al nooit komen.
Je stelt je rood konstant op 1 maar een analoge monitor gaat het zwartniveau gaan sampelen na de horizontale sync, juist voor het begin van de eigenlijke video data. Als je nu het rood signaal vooraf al hoog hebt zal hij dat niveau als zwart level gebruiken. En gezien je nooit meer hoger kunt gaan zal je ook nooits iets van kleur zien.
je rood ( en ook de nadere kleuren) mag dus maar actief hoog gezet worden tijdens de echte horizontale display tijd.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Maar van v_sync gelijk even een mooi non-blocking statement. Dat doe je overal en het is wel zo netjes. Zoals gezegd maak je hardware en geen (sequentiele) software.
v_sync <= 1'b1;
Misschien komt daar die melding ook vandaan dat je een variable type moet hebben.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Op 28 november 2007 08:34:22 schreef rew:
Bij mij zeurt ie ook altijd dat mijn clock signaal een "undefined clock" is. Kennelijk heb ik ook nog niet gevonden hoe je hem verteld dat het een clock is. Zo zijn er veel meer warnings die ik krijg waarvan ik zeg: "Dat heb je goed gezien, jongen!". (addr is een 32 bit counter. addr = addr + 32'h100, dan roept ie dat de onderste 8 bits helemaal nul blijven! ehh. gelijk heb je!)
Die warning over de addr teller is volledig terecht. Je laat de onderste 8 bits op nul. Je kunt ze dus gewoon weg laten en addr 8 bits kleiner maken! Scheelt weer ruimte. (overigens haalt je synthese ze ook wel weg, maar het natuurlijk mooier om dat zelf onder controle te houden)
Over die undifined clock: ELKE clock moet je in je timing constraints opnemen en aangeven wat de frequentie is (en evt de duty cycle). Anders weet je synthese niet hoeveel ruimte qua timing het heeft voor setup/hold van de FFs.
Het beste is om maar 1 (een!) clock te hebben. Synchroon design dus.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Ik heb ooit een design gemaakt waarbij ik op die manier de tellers heb ingekort. Er moesten een aantal dingen een aantal stappen geintegreerd worden (versnelling, snelheid, positie). Resultaat is dat ik er met mijn stomme kop niet meer bij kan wat waar staat. Gewoon 64 bit registers gebruiken, en de synthese de lagere bitjes laten wegprutsen. Als de code dan makkelijker wordt/blijft voor de designers is dat een voordeel. Dit spul is al zo moeilijk te maintainen.
Ik heb in de timing analyser al opgegeven dat ik een clock heb, en wat z'n frequentie is. Volgens mij is het de "mapper" die klaagt.
[edit: Het is toch de timing analyser. ]
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
the-x, Ik had een andere oplossing aangedragen om je probleempje op te lossen, en wil geen uitspraak doen over of mijn methode beter is of niet.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Op 28 november 2007 08:34:22 schreef rew:
Bij mij zeurt ie ook altijd dat mijn clock signaal een "undefined clock" is.
ga naar assignments. selecteer je signaal ( via node finder ) zet in volgende kolom ( klikken. er komt een pull down menutje ) signaal als GLOBAL signal en in de volgende kolom je signaal als 'global clock'.
als je het dan ook nog toewijst aan een dedeicated clockpin is het helemaal mooi 9 het hoeft niet ,maar je spaart wel een halve nanoseconde als je het wel doet )
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Op 28 november 2007 17:05:01 schreef rew:
Alternatief is (voor de hsync bijvoorbeeld) omassign h_sync = (h_count >= 653 && h_count <= 747 ) ? 1: 0;te doen. Dan wordt ie combinatorisch van h_count afgeleid.
en dan glitcht ie gelijk zot !.
maak je H_sync uitgang maar snel een register !
hier is een belngrijke tip : zorg dat je uitgangen van een blok ALTIJD een register zijn !. breng nooit geen combinatorische signalen naar buiten.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Advisor -> Segmentation fault. Zucht. Opnieuw opstarten en Quartus is zwart-wit.
????
Beide advisors. En het is consequent. (Dat zwartwit echter niet. Dat heb ik niet meer gezien.)
OK. Dat combinatorisch zal ik niet meer doen..... Vraagje:
case (ustate)
0:begin
if (data_available)
ustate <= 1;
else
ustate <= 0;
end
1:begin
Kan ik hier de "else" weglaten? Of moet ik dan ustate <= ustate;
als concurrent statement toevoegen (er /voor/ zetten)? Of is dat impliciet?
[Bericht gewijzigd door rew op (49%)]
Hallo,
Ik nog eens met mijn VGA Project.
Het is me gelukt om 3 horizontale kleurenbanden op het scherm te zetten.
Blijkbaar moeten mijn sync signalen positief zijn.
Ik heb gekeken hoe mijn pc dit doet, en daarna gekeken hoe het bij mij was. Het was dus net het tegenovergestelde.
Deze heb ik dan omgedraaid, het kleurendeel geschreven en toen kwam de eerste kleurenband tevoorschijn.
Daarna nog de andere 2 kleuren - blauw & groen - toegevoegd en nu staan 3 kleurenbanden op mijn scherm. De code vindt je hier:
module eigen_vga_project(clk, red, blue, green, h_sync, v_sync);
// Input Port(s)
input clk;
// Output Port(s)
output red;
output blue;
output green;
output h_sync;
output v_sync;
reg h_sync;
reg v_sync;
reg red;
reg blue;
reg green;
reg[10:0] h_count;
reg[19:0] v_count;
// Update the register output on the clock's rising edge
always @ (posedge clk)
begin
if ( h_count == 800 )
begin
h_count <= 1'b00000000000;
end
else
begin
h_count <= h_count + 1;
end
if (h_count >= 653 && h_count <= 747 )
begin
h_sync <= 1'b1;
end
else
begin
h_sync <= 1'b0;
end
if ( v_count == 416319 )
begin
v_count <= 0;
end
else
begin
v_count <= v_count + 1;
end
if (v_count >= 390000 && v_count <= 391500 )
begin
v_sync = 1'b1;
end
else
begin
v_sync = 1'b0;
end
// KLEUREN AAN EN UITZETTE
// ROOD
if ( h_count >= 5 && h_count <= 615 && v_count >= 5 && v_count <= 125000 )
begin
red <= 1'b1;
end
else
begin
red <= 1'b0;
end
// GROEN
if ( h_count >= 5 && h_count <= 615 && v_count >= 125000 && v_count <= 250000 )
begin
green <= 1'b1;
end
else
begin
green <= 1'b0;
end
//BLAUW
if ( h_count >= 5 && h_count <= 615 && v_count >= 250000 && v_count <= 375000 )
begin
blue <= 1'b1;
end
else
begin
blue <= 1'b0;
end
end
endmodule
Met dank aan allen die me hebben meegeholpen met foutjes eruit te halen.
Bij deze is dit projectje dus officieel toegevoegd aan deze topic 
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Op 29 november 2007 16:40:38 schreef rew:
Kan ik hier de "else" weglaten? Of moet ik dan ustate <= ustate;
als concurrent statement toevoegen (er /voor/ zetten)? Of is dat impliciet?
De else kun je weglaten. ustate is immers een FF en behoudt z'n waarde als je niets assigned. Vaak wordt het wel zo gedaan (dus met else), maar ik vindt het alleen maar verwarrend.
[Bericht gewijzigd door flipflop op (15%)]
Op 29 november 2007 20:07:01 schreef flipflop:
[...]
De else kun je weglaten. ustate is immers een FF en behoudt z'n waarde als je niets assigned. Vaak wordt het wel zo gedaan (dus met else), maar ik vindt het alleen maar verwarrend.
NEEEEEEEE dat kan niet 
Als je else weg laat krijg je:
case (ustate)
0:begin
if (data_available)
ustate <= 1;
end
ustate <= 0;
1:begin
Of tewel wat er ook gebeurt ustate staat altijd op 0
Wat je moet doen (als je else perse weg wilt laten)
case (ustate)
0:begin
ustate <= 0; --ustate altijd 0 tenzij
if (data_available) --data_available is 1
ustate <= 1; --dan ustate 1
end
1:begin
Dus dat ding dat NA je else staat moet BOVEN aan, alleen dan gaat het goed (dat is het hele idee van concurrent if statments)
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Ik bedoelde, je kunt de else met alles wat eronder zit weglaten. Dus dit:
case (ustate)
0:begin
if (data_available)
ustate <= 1;
end
1:begin
Dit geldt uiteraard alleen als je in een geklokt process zit, anders krijg je een latch en dat gaat zeker niet werken in een state machine.
[Bericht gewijzigd door flipflop op (68%)]
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Op 29 november 2007 16:40:38 schreef rew:
case (ustate) 0:begin if (data_available) ustate <= 1; else ustate <= 0; end 1:beginKan ik hier de "else" weglaten? Of moet ik dan ustate <= ustate;
sterker nog ! je kan zelfs de begin end weglaten !
case (ustate)
0: if (data_available)
ustate <= 1;
1: begin
en nu nog straffer :
case (ustate)
0: ustate <= data_available;
1: blabla