Omdat in het 'FPGA waarom zoweinig nieuwe gebruikers?' topic wat off-topic ging bij deze dan een nieuw topic.

Het ging over pull-up/down weerstanden op de JTAG poort:

Op 14 februari 2007 07:49:49 schreef fotoopa:
[...]Ik zou ze zeker opplaatsen. Met bepaalde devices hebben we in het verleden al heel wat problemen gehad als je het niet doet, trouwens het wordt zover ik weet op alle application notes aangegeven. De Jtag aansluiting is trouwens een externe aansluiting met risico. Lange kabel, externe PC interface zijn bronnen van problemen. Deze weerstanden garanderen je juiste niveaus en beperken extra ladingen door de externe aansluitingen.

Ik zag dat Altera aanraadt voor JTAG chains pull-ups te zetten op TMS en TDI. Een pull-down op TCK wordt wel standaard aangeraden.
Dat laatste is op zich wel verstandig, JTAG is wel een protocol waar zomaar iets willekeurigs mee kan gebeuren. Zelf gebruik ik een vrij korte programmerkabel en heb er nog nooit problemen mee gehad. En de pinnen hebben dus wel al interne pull-ups en downs al zijn ze 'weak'. Als TCK een pull-down heeft kan er overigens weinig gebeuren zolang je er niets op hebt staan, alles moet op TCK pulsen gebeuren. Je zit alleen dan nog met rare pulsen op lange programmeerkabels.

@madwizard: Wil je in dit topic alleen tips hebben of kunnen we ook een vragen stellen met betrekking tot CPLD/FPGA PCB design en verilog. Zit namelijk met een probleem in verilog, waar denk ik meer mensen tegen aan lopen, en als het goed is post ik hem hier. Maar als je alleen tips wilt open ik er een nieuw topic voor.

Ik denk dat zowel pure hardware als VHDL/verilog problemen aanbod zouden mogen komen. Ik ga in de loop van de volgende dagen nog wel enkele problemen aantippen, vooral ook de 3.3V levels naar de buitenwereld omdat veel nieuwe gebruikers nog veelal 5V levels gewoon zijn.

Ook hoe ik de interfaces bouw met betrekking tot de buitenwereld. En hoe ik mij beveiligd tegen verkeerde aansluitingen of binnenkomende signalen.

dan gaan we idd hier maar verder: PCB is nu ook getekend, enkel de silkscreen moet nog afgewerkt worden

het schema

de print

het eagle-project inclusief gerbers

Iemand commentaar? altijd welkom

sven,
Kun je eens een pdf filtje maken van je onderkant alleen? + bestukking onderaan

Het ziet er vrij goed uit. Je hebt wel een eigen methode gebruikt voor je I.O connectoren omdat die anders doorgaans op de buitenkant komen te staan, maar ah, voor mij maakt dat functioneel niet zoveel uit. Als ze onderling maar op 2.54mm raster staan zodat je een standaard gaatjesprint als basis kunt gebruiken. Dus alle connector in alle richtingen op 2.54 mm raster

Ik weet ook niet of er nog verschillen zijn met de 570 LE versie want die moet je zeker voorzien. Bugetaire is de 240 wel de goedkoopste maar ik zou eerder naar de volgende versie gaan. Kun je kiezen dan is het supper. Beide versie's bestaan in dezelfde 100 pins TQFP behuizing. Verschillen moet ik nog nazien.

voila, de BOTTOM
zoals je ziet een mooi massavlak, met hoop C's bij de voedingspennen

Ik had eigenlijk gedacht om alles met 10 polige flatcables aan te sluiten. Tests doe ik toch op breadboard & heb daarvoor adaptors liggen.

De 240 heb ik al liggen. Ik wou met een kleine device beginnen, als ik grotere project aankan zal ik wel zo'n ontwikkel-bord kopen. Deze is bedoeld voor m'n eerste stapjes.

m.i. is alleen een pull up voor TMS nodig. Zolang de JTAG poort gereset blijft, zijn de andere pinnen "don't care". Maar regel 1 gaat voor: volg de aanwijzigen van de fabrikant.

Ik zie slechts de GND op 1 connector. Dit is veel te weinig. Doorgaans neemt men per connector minstens 1 of 2 GND pinnen. Ook de 3V3 dacht ik niet te zien op de connectors onderaan. dat is heel vervelend als je referentie's moet maken met pullup's of dergelijke.

Gezien de ruimte die langs beide zijden nog beschikbaar is zou ik 14 pins nemen en altijd opdezelfde basis GND en +3V3 mee nemen. vb een zijde beide uiterste pinnen GND, andere zijde 3V3 of beter VCCIO1, VCCIO2. Zo worden alle GND's mooi verdeeld voor je stromen bij hoge frequentie's. Zoals je het nu hebt is dit heel slecht bij freq van boven de 1MHz, zelfs op gaatjesprint. Moet het echt low cost, zelfs dan kun je nog de 10 pins bestukken zonder de extra GND en power!

Op 14 februari 2007 20:36:27 schreef fotoopa:
Gezien de ruimte die langs beide zijden nog beschikbaar is zou ik 14 pins nemen en altijd opdezelfde basis GND en +3V3 mee nemen. vb een zijde beide uiterste pinnen GND, andere zijde 3V3 of beter VCCIO1, VCCIO2. Zo worden alle GND's mooi verdeeld voor je stromen bij hoge frequentie's. Zoals je het nu hebt is dit heel slecht bij freq van boven de 1MHz, zelfs op gaatjesprint. Moet het echt low cost, zelfs dan kun je nog de 10 pins bestukken zonder de extra GND en power!

Ik zal morgen eens bekijken wat het best is voor de layout.
Eén punt snap ik niet VCCIO1 & VCCIO2 apart op de flatcable zetten? Is het niet logisch
-ofwel alle VCC aan mekaar (toch allemaal 3v3)

-de bijhorende VCCIO van de IO poort naar buitenbrengen + overal VCCIO 1/2 uit mekaar houden behalve op sterpunt.
Dit lijkt me nogal moeilijk op een double-layer

Als ik kies voor de 14 polige headers, kan ik misschien beter kiezen voor pin1 = VCC / Pin2,13,14 = GND ?

Ok, het probleem waar ik mee zit is het volgende. Ik moet de volgende functie uitrekenen:


x = arcsin((Vout-Voffset)/(dV/dG))

Vout = 8 bit waarde (waarde tussen 66 en 190)
Voffset = vaste waarde (1650mV = 128)
dV/dG = vaste waarde (800mV = 62)

Probleem:
hoe berekening ik dit slim en snel (met zo weinig mogelijk macrocellen te gebruiken)

Ik dacht zelf aan een lookup table met als adres = Vout-66 en de output verschoven met 90 graden. Dan heb ik een lookup table met een 7 bits adres nodig.


reg [7:0] output_data;
wire [6:0] address;
wire clk;
   
always @(posedge clk)
  case (address)
     7'b0000000: output_data = 3;
     7'b0000001: output_data = 11;
     7'b0000010: output_data = 15;
     7'b0000011: output_data = 18;
     7'b0000100: output_data = 21;
..........................................
     7'b1111011: output_data = 169;
     7'b1111100: output_data = 177;
     default:    output_data = 255;
  endcase	 

Maar zoals je ziet gaat dit erg veel ruimte kosten... Hoe zou ik dit beter kunnen oplossen?

dat duw je in een rom

maak met de megawizard ene rom aan. en ladd je tabel daar in.
quartus stopt dan dan in het flash patroon , en het kost je veel minder cellen.

Of een kleine lookup table met 8 of 16 waardes, en lineair interpoleren. En vooral ook de antisymmetrie ervan niet vergeten!

wiskundig valt er ook een hoop te foezelen hiermee. Benaderen met exponentielen bijvoorbeeld. Net wat je nauwkeurigheid moet zijn.

Op 14 februari 2007 21:24:45 schreef sven:
[...]

Ik zal morgen eens bekijken wat het best is voor de layout.
Eén punt snap ik niet VCCIO1 & VCCIO2 apart op de flatcable zetten? Is het niet logisch
-ofwel alle VCC aan mekaar (toch allemaal 3v3)

-de bijhorende VCCIO van de IO poort naar buitenbrengen + overal VCCIO 1/2 uit mekaar houden behalve op sterpunt.
Dit lijkt me nogal moeilijk op een double-layer

Als ik kies voor de 14 polige headers, kan ik misschien beter kiezen voor pin1 = VCC / Pin2,13,14 = GND ?

De bedoeling voor die VCCIO1 en VCCIO2 is om de mogelijkheid te hebben die op 2.5V te voeden. Omdat je die 2.5V niet voorziet op je bovendeck zou je die via de I/O pins naar beneden kunnen brengen om daar de extra regulator te voorzien en boven moet je dan de jumper verwijderen die de 2 groepen aan elkaar legt.

Dit kan enkel als je bovenaan de 2 kringen opsplitst. Ga je ervan uit altijd op 3V3 te werken dan heeft de splitsing idd geen zin en heb je enkel 3V3 als voeding. Dit is de meest eenvoudige oplossing. in dit geval zou ik van iedere connector pin 1 en 2 aan 3V3 leggen en pin 13 en pin 14 aan de GND. Dan moet je geen zorgen maken om de voeding te splitten. Zowel een 3V3 als een GND zijn voor digitale signalen een nul potentiaal. Ze hebben dus zin om op de connector te plaatsen. immers de voedingen worden weer ontkoppeld met die pinnen en vormen een lage impedantie tov de signaal lijnen.

Of een kleine lookup table met 8 of 16 waardes, en lineair interpoleren. En vooral ook de antisymmetrie ervan niet vergeten!

wiskundig valt er ook een hoop te foezelen hiermee. Benaderen met exponentielen bijvoorbeeld. Net wat je nauwkeurigheid moet zijn.

interpoleren heb ik naar gekeken maar dit is niet nauwkeurig genoeg. Het is voor een tilt sensor, hierbij moet de nauwkeurigheid bij een uitwijking tussen -10 en +10 graden nauwkeurig zijn (<0.5 graden), daarbuiten is een nauwkeurigheid van >2 goed genoeg.

wiskundig valt er ook een hoop te foezelen hiermee

Helemaal vergeten, ik kan natuurlijk 1 kwadrant nemen, de andere is dan het spiegelbeeld hiervan.

maak met de megawizard ene rom aan. en ladd je tabel daar in.
quartus stopt dan dan in het flash patroon , en het kost je veel minder cellen.

Het komt in een xilinx XC9500XL, maar zal eens kijken of ISE ook zoiets heeft.

Op 14 februari 2007 22:47:32 schreef fotoopa:
[...]

De bedoeling voor die VCCIO1 en VCCIO2 is om de mogelijkheid te hebben die op 2.5V te voeden. Omdat je die 2.5V niet voorziet op je bovendeck zou je die via de I/O pins naar beneden kunnen brengen om daar de extra regulator te voorzien en boven moet je dan de jumper verwijderen die de 2 groepen aan elkaar legt.

Dit kan enkel als je bovenaan de 2 kringen opsplitst. Ga je ervan uit altijd op 3V3 te werken dan heeft de splitsing idd geen zin en heb je enkel 3V3 als voeding. Dit is de meest eenvoudige oplossing. in dit geval zou ik van iedere connector pin 1 en 2 aan 3V3 leggen en pin 13 en pin 14 aan de GND. Dan moet je geen zorgen maken om de voeding te splitten. Zowel een 3V3 als een GND zijn voor digitale signalen een nul potentiaal. Ze hebben dus zin om op de connector te plaatsen. immers de voedingen worden weer ontkoppeld met die pinnen en vormen een lage impedantie tov de signaal lijnen.

Ik ga dit enkel op 3v3 houden, houdt het simpeler

Ik heb al eens 1 konnektor aangepast:
het resultaat
pin1/2 = 3v3 pin13/14 = gnd
Een ontkoppel-C bij elke konnektor komt nog.

JA ik heb nog een vraag :)

Waarschijnlijk een hele stomme maar het volgende in verilog


module inoutput(
in    wire clk,
inout reg port_data,
out   reg output_clk);

Hoe kan ik dan die inout poort wisselen tussen in en out

als ik hem hard nul maak (dus output) en ik zeg daarna iets van:


if(port_data)
 some action
else
 other action

Kijkt hij dan naar de waarde op poort_data (als input), en ziet hij dan niet de 0 die ik er eerder naar toe schreef, als port_data extern hoog gemaakt wordt?

of moet je nog een truukje uit halen?

Op 15 februari 2007 00:11:41 schreef sven:
[...]Ik ga dit enkel op 3v3 houden, houdt het simpeler
Ik heb al eens 1 konnektor aangepast:
het resultaat
pin1/2 = 3v3 pin13/14 = gnd
Een ontkoppel-C bij elke konnektor komt nog.

Ja dat is heel goed zo. En gezien het een lowcost begin PCB is zal enkel 3v3 geen probleem zijn. Het belangrijkste is vooral de GND pinnen per connector en door een vaste struktuur aan te nemen ga je later niet zo snel een verkeerde GND pin gebruiken, ze liggen allemaal in dezelfde richting en op dezelfde positie. Logische indeling!

@sven : Is het een idee om de bordjes zo te maken dat je kan stacken ?

@surge_me : In VHDL gaat het als volget :

p_BUF:PROCESS(oe, data, data_out)
BEGIN
data_in <= data;
IF (oe = '1') THEN
data <= data_out;
ELSE
data <= 'Z';
END IF;
END PROCESS p_BUF;

mvg

ST

Op 14 februari 2007 15:32:49 schreef xantus:
@madwizard: Wil je in dit topic alleen tips hebben of kunnen we ook een vragen stellen met betrekking tot CPLD/FPGA PCB design en verilog. Zit namelijk met een probleem in verilog, waar denk ik meer mensen tegen aan lopen, en als het goed is post ik hem hier. Maar als je alleen tips wilt open ik er een nieuw topic voor.

Inderdaad is dit topic daar ook wel geschikt voor, ik denk dat het het handigst is dat hier gewoon alle praktische problemen in komen waar je tegen aan loopt maar die niet zo groot zijn dat ze een eigen topic nodig hebben. Of dat dan hardware of 'software' is maakt niet uit.

Op 15 februari 2007 01:00:28 schreef surge_me:
Waarschijnlijk een hele stomme maar het volgende in verilog


module inoutput(
in    wire clk,
inout reg port_data,
out   reg output_clk);

Hoe kan ik dan die inout poort wisselen tussen in en out

als ik hem hard nul maak (dus output) en ik zeg daarna iets van:


if(port_data)
 some action
else
 other action

Kijkt hij dan naar de waarde op poort_data (als input), en ziet hij dan niet de 0 die ik er eerder naar toe schreef, als port_data extern hoog gemaakt wordt?

Je kunt registers ook high-Z maken door er Z naar toe te schrijven:

port_data <= 1'bZ;

Maar eerlijk gezegd weet ik niet helemaal zeker of dat bij een bi-directionele poort helemaal goed gaat. De volgende methode werkt in ieder geval wel:
http://www.altera.com/support/examples/verilog/ver_bidirec.html

Op 15 februari 2007 07:11:57 schreef fotoopa:
[...]Ja dat is heel goed zo. En gezien het een lowcost begin PCB is zal enkel 3v3 geen probleem zijn. Het belangrijkste is vooral de GND pinnen per connector en door een vaste struktuur aan te nemen ga je later niet zo snel een verkeerde GND pin gebruiken, ze liggen allemaal in dezelfde richting en op dezelfde positie. Logische indeling!

Het eindresultaat (hoop ik)
het schema

bottom layer

top Layer

@ blu line : stackable maken lijkt me nogal overdreven, t'is een van de kleinste maxII devices

sven,

Prachtig, niets meer op aan te merken. Mooi printje voor veel kleine toepassingen! Ik ben altijd kandidaat om er eentje af te nemen als ze klaar zijn.

Kan gemakkelijk ergens ingebouwd worden en zal niet veel verbruiken.

Op 15 februari 2007 17:05:28 schreef sven:
[...]

Het eindresultaat (hoop ik)

Ga je dit zelf maken of laat je het fabriceren?

Indien je het printje zelf gaat maken zou je misschien de via's onder de max weg willen halen (dat doorvertinnen met een draadje en een beetje soldeer is echt super irritant omdat het perfect vlak moet zijn (anders staat de max scheef) en dan moet je weer met een mesje alles afschrapen tot dat het glad is.

Indien je het bordje laat maken: ziet er goed uit en veel succes :D

Op 15 februari 2007 21:49:39 schreef surge_me:
[...]

Ga je dit zelf maken of laat je het fabriceren?

Indien je het printje zelf gaat maken zou je misschien de via's onder de max weg willen halen (dat doorvertinnen met een draadje en een beetje soldeer is echt super irritant omdat het perfect vlak moet zijn (anders staat de max scheef) en dan moet je weer met een mesje alles afschrapen tot dat het glad is.

Indien je het bordje laat maken: ziet er goed uit en veel succes :D

Al zou ik zelf de mogelijkheid nog hebben om ze zelf te maken, om de redenen die je zelf net aanhaald zou ik er niet aan beginnen. Ik laat deze dus maken, ben ik tenminste zeker van het resultaat

Op 15 februari 2007 19:02:01 schreef fotoopa:
sven,

Prachtig, niets meer op aan te merken. Mooi printje voor veel kleine toepassingen! Ik ben altijd kandidaat om er eentje af te nemen als ze klaar zijn.

Kan gemakkelijk ergens ingebouwd worden en zal niet veel verbruiken.

Zal er eerst 1 laten maken, je weet maar nooit.
Als er meerdere mensen interesse hebben is het nog goedkoop ook (10 stuk = 90€ )

Hallo allemaal bedankt voor de tips :)

Dat met het toewijzen van Z aan een inout poort gaat helaas niet :(

Maar goed ik heb het linkje van altera gevolgd (van madwizzard) allen ik snap niet wat ze met het volgende bedoelen:

alle code op een rijtje:


module bidirec (oe, clk, inp, outp, bidir);

// Port Declaration

input   oe;
input   clk;
input   [7:0] inp;
output  [7:0] outp;
inout   [7:0] bidir;

reg     [7:0] a;
reg     [7:0] b;

assign bidir = oe ? a : 8'bZ ; //<= dit snap ik niet
assign outp  = b;

// Always Construct

always @ (posedge clk)
begin 
	b <= bidir;
	a <= inp;
end

endmodule


Volgens mij bedoelen ze als oe = 1, clk maakt niet uit, en a = 11111111 dan bidir = zzzzzzzz heb ik dit goed? als ik dit goed heb snap ik niet hoe bidir doorgaans bepaald wordt (als de inout niet hoog impedant moet zijn)