Op 17 september 2007 21:34:09 schreef P.Techneut:
Is het aantal van 4 gnd draden voldoende?
Ja daar zie ik geen probleem in. Trouwens op mijn DE1 board zitten maar 2 GND pinnen per plug. Zelfs op de HP LA's zaten daar maar 1 GND per 16 channels op. Die GND's moeten bijna geen stroom voeren om te meten.
Ja! ik heb nog een vraag, ik weet even niet in welke van de dozijn verschillende FPGA toppics ik het neer moet planten, maar dit is de meest recente dus doe ik het hier.
Als ik voor een FPGA een PCB ga ontwerpen, dan moet daar een voeding bij. Altera zegt (terecht!) dat het benodigde vermogen afhankelijk is van de ontworpen HDL code.
MAar als ik een test (experimenteer) bordje maak, weet ik nog niet wat er in de chip komt! In de datasheet (handboek moet ik zeggen) staat dan ook niet wat het MAXIMALE vermogensgebruik is....
Dus hoe weet ik wat het maximale vermogensverbruik is (en hoe ik dus mijn voeding moet dimensioneren)?
Hoewel ik het nog niet gebruikt heb heeft Altera wel iets hiervoor:
Altera site
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
maak ze gewoon sterk genoeg.
ik heb nu een 2c35 draaien gevoed vanuit een LP3906 .. of wast 3609 .. neen 3906 geloof ik. van national semi
ding is piepklein en levert alle spanningen die ik nodig heb ( en alle stroom )
en voor die prijs kan je geen ander voedingssyteem in elkaar zetten.
Ohw ja ik heb een 2A voeding genomen (het boeltje zit al inelkaar en loopt als een zonnetje, )
MAar die 2A is dus wat teveel zo te zien want ik gebruik een 2C8.. (en jij een 2c35 op 1.5A)
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
voor het gemak: http://www.national.com/pf/LP/LP3906.html
@fotoopa:
Ik heb geloof ik eens van je vernomen dat jij een Terasic DE1 board bezit? Ik ben wel geinteresseerd in dit board alleen..
Heb je al eens getest of hier de NiosII goed op draait al dan niet i.c.m. uClinux?
Het is voor mij echt een droom om er eens Linux op te kunnen gooien 
[Bericht gewijzigd door SMD lover op (11%)]
Op 19 september 2007 15:51:46 schreef SMD lover:
@fotoopa:Heb je al eens getest of hier de NiosII goed op draait al dan niet i.c.m. uClinux?
Ik heb 2 van die DE1 boards in gebruik. Maar software is niet mijn favoriete hobby ( te weinig verstand), dus ook niet van de NIOS nog van de uCLinux. Die DVD's liggen hier maar heb ze nog nooit gebruikt.
Vandaag weer een eenvoudige test gedaan. Opdracht was eenvoudig, een kleine routine schrijven om mula (8 bit waarde) en mulb (8 bit waarde) met elkaar te vermenigvuldigen en het resultaat in produkt te plaatsen.
Ik wou dit bekijken op de logic analyser en zien of ik die data kon gebruiken met een clocksnelheid van 24 MHz.
always @ (posedge clk_24Mhz)
begin
mula <= encoder_a;
mulb <= encoder_b;
produkt <= mula * mulb;
end
mula was een input van een rotary encoder teller waar ik gewoon aandraaide.
mulb was een 2de rotary encoder die ook op een bepaalde waarde stond.
De logic analyser was aangesloten op 32 I/O pinnen van mijn board, goed voor al de ingangs signalen en het produkt weer te geven. De 24 Mhz clock had ik ook binnen genomen om op het scherm weer te geven.
Mijn time setting van de LA stond op 500Mhz (2 nsec sampel time)
De trigger stond zo ingesteld dat een verandering van de mula waarde de LA ging triggeren.
Hier het resultaat van de meting:
Resultaat:
Je ziet dat de LA getriggert heeft bij een verandering van de waarde van de mula. Die waarde is van 63 naar 64 bcd gegaan.
de mulb stond op 112 bcd.
Het produkt 64*112= 7168 verschijnt 1 clockpuls later waar de cursor B (blauw) staat.
De intervaltijd staat onderaan weergegeven als 42 nsec. Hierbij moet je opmerken dat daar een speling opzit gelijk aan de sampel periode die hier 2 nsec is (500 Mhz)
De LA bezit ook de mogelijkheid om op 4 afzonderlijke ingangen de frequentie te meten. Ik heb hiervoor CLK2 toegekent aan de 24 MHz clock en onderaan zie je de precieze frequentie meting die hier 23.9999770 MHz is.
Gewoon ongeloofelijk hoe confortabel zo een LA meting is.
Ik had deze resultaten nodig om te zien hoe snel ik realtime data kon berekenen voor mijn moodlight project door gebruik te maken van de interne multiplay functie's die in de cyclone II devices zitten. Gewoon wow! ( persoonlijke mening!)
Ik heb de test herhaalt met een 50 Mhz clock en het produkt verschijnt idd ook bij de volgende clock.
Ja het grote voordeel is hierbij dat je geen extra hardware nodig hebt om dit te testen/ontwikkelen terwijl je toch heel veel zaken kunt uitproberen. In de huidige opstelling heb ik een volledige I/O connector nog vrij van 36 I/O pinnen en daar staat de LA kontinu op aangesloten. Ik hoef bijgevolg niet steeds de draden van de LA opnieuw te gaan aansluiten. Heb je bepaalde problemen tijdens je hardware ontwikkeling, plaats dan gewoon enkele signalen op de meet connectors voor de LA zoals state machines en je ziet al vrij snel wat er mis gaat.
Ook de weergave van de waardes in verschillende data op het scherm formaten is heel confortabel evenal de afzonderlijke naamgeving per signaal of groep is super.
Gisteren heb ik hiervoor nog een nieuwe labtop aangekocht. Dit scherm heeft 1280 pixels horizontaal, ideaal voor zo een LA. De foto hierboven is slechts een gedeelte van die breedte om de topic niet te breed uit te smeren. Maar in de stutus kun je daar veel meer meetgegevens aflezen.
@P.Techneut,
Hierbij een foto van de opstelling:
De DE1 bezit 2 I/O connector type flatkabel 2x20 pins. De LA meetdraden zijn voorzien van female 2.54 pith pinnen die je direct op zo een standaard I/O connector kunt aansluiten. Op die I/O connector waren maar 2 GND pinnen voorzien, op de LA zijn er dat 4 Ik heb er dan 2 via die extra opsteeknijpers 2.54 mm direct op de print zelf aangesloten. Ik had in totaal 38 van die opsteek nijpers bijbesteld voor het geval je direct op de chips moet aansluiten. Maar hier op een gewone connector gaat dit met de origineele pinnen van de LA.
[Bericht gewijzigd door fotoopa op (24%)]
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 21 september 2007 18:01:49 schreef fotoopa:
de interne multiplay functie's die in de cyclone II devices zitten. Gewoon wow! ( persoonlijke mening!)
dat had je toch wel verwacht van die cyclone's ? das de kracht van die dingen. je vermenigvuldiging gebeurt in hardware en neemt 1 clocktick in beslag. ik zou de specs eens moeten bekijken maar volgens mij kan je die cyclone gewoon op 50 MHZ clocken , de intenre multiplier aanzetten ( een van de plls gebruiken om de clock omhoog te pompen ) en daarmee de vermenigvuldiger lcocken. tzou me niet verbazen dat je 2 a 3 honderd MHz haalt.
ik heb een delayline gemaakt in een cyclone ( de traagste variant ) ik gebruik een keten van LCELL's waarvan ik 1 uitgang kan selecteren. ( je moet dat in schemavorm doen en de vlag remove_redundant_lcell afzetten voor dat schema, anders compileert ie de lcells weg ... een lcell is een stomme buffer en aangezien de belasting niks is denkt de compiler : dit hoeft niet ... maar in mijn geval dus wel). ook voor de selector moet je heel goed opletten.
wel nu , om een lang verhaal kort te maken. de delay van 1 lcell is exact 320 PICOseconde !...
de communicatiebus ( microwire achtig ding ) heeft 3 draden : SDEN , CLK en SDAT. alle draden gaan door zo een skew block.
ik kan dus de data en de clock mooi schuiven ten opzichte van elkaar. CLK is 100 MHz. ( 10 nS ) dat signaal moet van de FPGA naar onze asic langs vrij lange draden ( ongeveer 10 centimeter met daartussen connector ) ik meet de skew aan de asic en trim gewoon in de FPGA de signalen zodat de timing terug klopt aan de uitgang.
Op 21 september 2007 18:59:24 schreef free_electron:
[...] ik meet de skew aan de asic en trim gewoon in de FPGA de signalen zodat de timing terug klopt aan de uitgang.
Jij bent wel een slim kereltje huh? 
[message=683224,Op 21 september 2007 18:59:24 schreef free_electron
dat had je toch wel verwacht van die cyclone's ? das de kracht van die dingen. je vermenigvuldiging gebeurt in hardware en neemt 1 clocktick in beslag.
Ja dat had ik verwacht en voor een nieuwe FPGA gebruiker is dit meer overtuigend dan 1000 woorden (hoop ik).
update:
Ik heb de test herhaalt met een 50 Mhz clock en het produkt verschijnt idd ook bij de volgende clock. Dit is wel op externe pinnen gemeten, voor interne verwerking zal dit nog hoger/sneller gaan maar ik heb het voorlopig niet nodig voor mijn toepassing.
[Bericht gewijzigd door fotoopa op (27%)]
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Op 21 september 2007 19:05:39 schreef MagicBox:
Jij bent wel een slim kereltje huh?
Straks gaat ie nog naast z'n schoenen lopen. 
Het is overigens bij de meeste FPGA's wel mogelijk om de skew in te stellen. Is geen rocket science. Voor de gebruiker 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 21 september 2007 20:08:12 schreef flipflop:
[...]
Straks gaat ie nog naast z'n schoenen lopen.Het is overigens bij de meeste FPGA's wel mogelijk om de skew in te stellen. Is geen rocket science. Voor de gebruiker niet.
schoenen ? dit is calufonia ! de meeste lopen hier rond op sandalen.(birkenstocks, teva's , chaco's, of ook gewoon van die stomme 1 dollar 'zeesletsen' )
[Bericht gewijzigd door free_electron op (11%)]
Hmm na al dat gebabbel over en rondsmijten met Verilogcode door fotoopa en F.E. ben ik zelf eens op zoek gegaan met het besluit me er eens in te verdiepen:
http://www.asic-world.com/verilog/veritut.html
Ik moet zeggen, met dit taaltje zijn dingen heel wat sneller te bakken dan te zitten klooien met schematics!
Dit werkt echt leuk
Ik denk dat ik al mijn reeds gemaakte ontwerpjes eens in Verilog moduultjes gaat omzetten.
Niet lachen! Mijn eerste Verilog progje:
module SerPar8x4(SD, SC, RESET, RA, RB);
input SD; //Serial input
input SC; //Clock input
input RESET; //Asynchronous reset
output [3:0] RA; //4-Bit output register A
output [3:0] RB; //4-Bit output register B
reg [2:0] CT; //Internal state counter
reg [6:0] R; //Internal 7-bit address/data register
reg [3:0] RA;
reg [3:0] RB;
always @ (posedge SC or posedge RESET)
begin
if (RESET) begin
RA <= 0;
RB <= 0;
CT <= 0;
end else begin
RA <= RA;
RB <= RB;
if (CT == 7) begin
case ({R[6],R[5],R[4],R[3]})
0: RA <= {R[2],R[1],R[0],SD};
1: RB <= {R[2],R[1],R[0],SD};
endcase
CT <= 0;
end else begin
CT <= CT ++ 1;
R <= {R[5], R[4], R[3], R[2], R[1], R[0], SD};
end
end
end
endmodule
Wat doet 't? Het clock'ed serieel een byte in op de SD pin. MSB eerst, als laatste LSB. Op de 8e klokpuls zet 'ie het lower nibble van het ingeklokte spul in een van de 4-bit registers, welke worden geadresseerd door het high nibble. Dus eigenlijk kun je serieel 1 van 16 mogelijke 4-bit registers gaan vullen. Byte opmaak is:
A3 A2 A1 A0 D3 D2 D1 D0
Als ik dit met StateCAD of met de schema editor had moeten doen.... Ik ben overtuigd 
[Bericht gewijzigd door MagicBox op (31%)]
Op 21 september 2007 19:14:58 schreef fotoopa:
Ik heb de test herhaalt met een 50 Mhz clock en het produkt verschijnt idd ook bij de volgende clock.
Je kunt bij de compilatie toch ook de maximum klokfrequentie zien? Maar mooi spul hoor die logic analyzer.
@MagicBox:
{R[5], R[4], R[3], R[2], R[1], R[0], SD};Makkelijker is:
{R[5:0], SD};Ook kun je de input/output/regs in de module header meenemen:
module SerPar8x4(input SD,
input SC,
input RESET,
output reg[3:0] RA,
output reg[3:0] RB);Op 21 september 2007 21:56:34 schreef madwizard:
[...]
Je kunt bij de compilatie toch ook de maximum klokfrequentie zien? Maar mooi spul hoor die logic analyzer.@MagicBox:
{R[5], R[4], R[3], R[2], R[1], R[0], SD};Makkelijker is:
{R[5:0], SD};Heb ik naar gezocht, kon ik niet vinden. Dit is helemaal mooi!
Ook kun je de input/output/regs in de module header meenemen:
module SerPar8x4(input SD, input SC, input RESET, output reg[3:0] RA, output reg[3:0] RB);Nog een goeie tip daar
Bedankt. Het ziet er naar uit dat ik hier nog veel kan leren 
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
** WARNING * er zit een bug in de systemverilog implementatie in Quartus 7.1 !. ( vandaag ontdekt door, jawel : yours truly .... )
het systemverilog always_ff statement wordt niet altijd correct geimplementeerd ( soms krijg je toch een latch in je systeem .... )
wachten op confirmatie... en ondertussen geen systemverilog gebruiken !
Om maar even in dit topic door te gaan..
Free, kun je even beknopt uitleggen hoe ik bi-directionele I/O's maak, en kan opgeven dat ze in Hi-Z state staan onder bepaalde voorwaarden?
Free ligt vast te slapen (of slaapt hij nooit?
, dus bij deze.
Je maakt eerste de bidirectionele I/O aan met inout (in plaats van input of output):
inout magic;
Je kunt er geen register van maken omdat een register altijd een output is, en niet bidirectioneel kan zijn.
Stel je wilt een output enable maken, dit gaat dan als volgt:
wire enable; // Kan ook een reg zijn
reg data; // output voor magic (in output mode)
inout magic = enable ? data : 1'bZ; // kan ook los met assignNu is magic als enable op 1 staat een output, en wel met waarde data. Data hoeft niet per se een reg te zijn, kan ook een output van iets anders zijn. Als enable op 1 staat zet je Z (high-Z) op de lijn, en heb je dus een input.
Output naar magic gaat door te zorgen dat enable op 1 staat en je waarde in data te zetten. Input gaat door magic gewoon uit te lezen:
val <= magic;
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
free lag inderdaad te maffen. tis nu 5u18 in de ochtend...
je kan om een bidirectionele te maken inderdaad doen zoals madwizard schrijft.
ik doe dergelijke dingen meestal op schemaniveau.
ik maak mijn blokken met aparte in en output bussen , alsook een OE ( outout enable ) signaal.
op je toplevel zet je dan een inout poot en een tri buffer.
soms wordt voor complexe systemen de boel een geweldige soep en weet je op de duur niet meer wat er aan wat vastgeknoopt is.
als je systeem een paar duizend lijnen code begint te worden en in 20 of 30 files zit ...
niks makkelijker dan een toplevel. en daarin je cellen instantieren.
een voorbeeldje : ik heb nu een processor ( voorlopig een 8051 core, later kleef ik daar een nios in ) uitgebreid met allerhande peripherie. ( PWM generatoren , microwire-achtige transceiver , skew generator , debouncers , snelle counters/timers, pattern generator en nog veel meer )
alles zit in een geheugenblok gemapt.
elk blok heeft een addres bus ,een databus en een read en write signaal.
via parameters (parameter in verilog) geef ik de adressen op van de registers in elk blok.
je krijgt op je toplevel dan een mooi circuit en naast elk blokje zie je de parameters staan,
ook voor de tristateable pinnen zie je duidelijk de tri drivers staan en kan je de global disable zien staan ( ik heb hotplug in mijn systeem. zodra je aan de connector begint te sleuren worden alle i/o's getristated. dit gebeurt buiten alle logica om.
vergeet het om complexe circuits volledige als text entry in elkaar te zetten. gebruik die schematic entry mode om je toplevel te maken. het is veel overzichtelijker dan in een directory alle files te moeten openen en te gaan uitvlooien wie er nu waar aan vasthangt.
je moet dat schematic topsheet( en voor complexe blokken de subsheets) bezien als een grafische navigator die je direct laat zien welk signaal er van a naar b naar c gaat.
als je in quartus dubbelklikt op een symbool opent hij direct het relevant blok ( de juiste file ) en kan je editeren. niks makkelijker dan dat.
een ander probleem als je inouts in je verilog gaat steken is om 2 blokken aan elkaar te knopen.
stel je hebt 2 of meerdere blokken die elk bidirectioneel zijn en op dezelfde poten naar buiten komen...
dat wordt soms een soep.
mak da met losse inputs en outputs. knoop op schema alle ingangen aan elkaar. en de uitgangen via een multiplexer. kleef er de tri in en klaar.
dit verhindert ook dat je foute logica gaat maken. stel dat ik per abuis twee blokken heb die op het zelfde moment ga sturen... heel waarschijnlijk gaat de synthesizer voor de output structuur daar geen multiplexer achter zetten maar een OR poort om te combineren .... dan krijg je heeeel vreemde dingen te zien. en verdenk je je blokken. terwijl het echter een fundamenteel design probleem is.
Zo maakte ik eerst mijn ontwerpen. Top schema wat alleen blokken heeft, en daar de databussen aan elkaar knopen. Waar relevant, blokken hadden een ingangs databus en uitgangs databus. De uitgangsdatabussen van de blokjes gingen inderdaad naar een mux met daarachter een tri-buffer.
Het is wel een goed idee ja om als toplevel een schema te houden. Dan voorzie ik mijn verilog blokjes gewoon van in- en uitgangs databussen zonder tristate geklooi 
Hier alvast een blokje wat ik heb omgezet, het interrupt register in de power controller voor de amp. FYI, het hele opstarten/afsluiten alsmede DC detectie, temp detectie e.d. wordt door 1 CPLD geregeld.
// ============================================================================================
// Module: PsuIntReg
//
// Description: Provides an interrupt register that flags
// positive-, negative- and dual edge input signal events.
// The INT output will remain high as long as IE and any interrupt flag
// is set. The flags are cleared by asserting high WR.
//
// Inputs:
// DCD DC Voltage Detect. Positive edge.
// TDF Temperature threshold reached for fan-enable. Dual edge.
// TDS Temperature threshold reached for shut-down. Positive edge.
// BTN Power button pressed or released. Dual edge.
// SU Startup completed, normal operation can begin. Negative edge.
// SD Shutdown sequence starting. Positive edge.
// IE When set, allows the INT output to be set when any interrupt flag is set.
// WR Clears all flags when WR goes high.
//
// Outputs:
// INT Is set when one or more interrupt flags are set.
// DOUT Databus containing the interrupt flags in the following order:
// 7 6 5 4 3 2 1 0
// 0 0 DCD TDF TDS SD SU BTN
// ============================================================================================
module PsuIntReg(INT, DOUT, DCD, TDS, TDF, BTN, SU, SD, WR, IE);
output wire INT;
output wire [7:0] DOUT;
input wire DCD;
input wire TDS;
input wire TDF;
input wire BTN;
input wire SU;
input wire SD;
input wire WR;
input wire IE;
//
// Power button dual-edge triggered flag
//
reg [1:0] BTN_FLAGS;
wire BTN_FLAG;
always @ (posedge BTN, posedge WR)
begin
if (WR) BTN_FLAGS[0] <= 0;
else BTN_FLAGS[0] <= 1;
end
always @ (negedge BTN, posedge WR)
begin
if (WR) BTN_FLAGS[1] <= 0;
else BTN_FLAGS[1] <= 1;
end
assign BTN_FLAG = BTN_FLAGS[0] | BTN_FLAGS[1];
initial BTN_FLAGS = 0;
//
// DC Detect pos-edge triggered flag
//
reg DCD_FLAG;
always @ (posedge DCD, posedge WR)
begin
if (WR) DCD_FLAG <= 0;
else DCD_FLAG <= 1;
end
initial DCD_FLAG = 0;
//
// Startup neg-edge triggered flag
//
reg SU_FLAG;
always @ (negedge SU, posedge WR)
begin
if (WR) SU_FLAG <= 0;
else SU_FLAG <= 1;
end
initial SU_FLAG = 0;
//
// Shutdown pos-edge triggered flag
//
reg SD_FLAG;
always @ (posedge SD, posedge WR)
begin
if (WR) SD_FLAG <= 0;
else SD_FLAG <= 1;
end
initial SD_FLAG = 0;
//
// Combine flags into a 6-bit word
//
assign DOUT = { 4'b0,
DCD_FLAG,
SD_FLAG,
SU_FLAG,
BTN_FLAG };
//
// Assert the INT pin when any flag and IE are set
//
assign INT = IE && (DOUT != 0);
endmodule
Mijn 2e verilog proggie ^^
Het is wel opletten geblazen met hoe je je code formuleerd hoor.. wat logisch hetzelfde is, komt er niet altijd het zelfde uit! A != 0 of A > 0 bijvoorbeeld. Eerste geeft gewoon een dikke P-term, tweede gaat een dikke OR-term maken. Nu is het zo dat in de CPLD die ik gebruik per macro cell maar 5 OR ingangen heeft, tegen 38 AND ingangen. A !=0 of A > 0 is het verschil tussen 1 macro cell of 3 cellen in je synthesis O.o