Met de BOM kun je toch ook al gaan solderen lijkt me? Of is het onduidelijk wat wat is? Helaas heb ik m'n pakketje ook nog niet mogen ontvangen...
Op 4 oktober 2007 11:25:35 schreef madwizard:
Met de BOM kun je toch ook al gaan solderen lijkt me? Of is het onduidelijk wat wat is? Helaas heb ik m'n pakketje ook nog niet mogen ontvangen...
Zelfs in het moerassige afgelegen gebied is mijn pakje toegekomen.
Eerste elementen zijn gesoldeerd maar de rest is voor morgen. Het gaat prima door gewoon schema en opdruk te volgen. Het meeste probleem is dat ik 2 brillen moet opzetten om mijn elementjes te vinden! maar al bij al gaat het.
Maar het zal toch nog 1 tot 2 dagen duren eer de eerste testen kunnen uitgevoerd worden. Je hebt veel smd elementjes maar de meeste hier zijn toch al van de fijnste, niet direct iets voor beginners!
Printjes zijn wel buitengewoon mooi gemaakt. Klassieke componenten zou voor velen gemakkelijker geweest zijn maar functioneel maakt het niets uit. Ik ben overtuigd dat het wel zal werken.
nog een klene tip:
Als er zijn die hun smd weerstandje verloren zijn, kijk eens naar de punt van je soldeerbout of hij daar niet hangt te bingenlen 
Nou, nu een echt stukkie verilog gebakken. Het is de interface voor het communiceren met de WM8816 volume controller.
Wat 't doet is beschreven in de code 
`timescale 1ns / 1ps
// ============================================================================================
// Module: DbeVolume
//
// Description: WM8816 Volume Controller interface. Presents the WM8816 as two 8-bit
// parallel registers to the CPU. To write to the device, write data to the
// data register first. Then write the control byte to the control register.
// To read from the device, write the control byte to the control register,
// then read the data from the data register. The control byte determines
// whether a write or read operation is performed. See WM8816 datasheet.
//
// After the control byte is written, the BUSY strobe becomes active.
// The statemachine begins to communicate with the WM8816 on the first
// rising edge of the system clock until the I/O operation has completed
// after which the BUSY stobe is reset back to inactive. During an I/O
// operation writing to the control or data register has no effect.
//
// Inputs:
// RESET System reset. Resets the statemachine, flag, control- and data registers.
// CLK System clock. The maximum allowed frequency is 2MHz.
// DI The data to write to the control- or data register.
// WRD Data register write strobe. Data on DI is clocked in on the rising edge.
// WRC Control register write strobe. Data on DI is clocked in on the rising edge.
// Serial communication begins on the first rising edge of the system
// clock after WRC has gone low.
//
// Outputs:
// DO Contents of the data register.
// BUSY Activates when WRC goes inactive, remains active untill serial communication
// completed.
// VCS WM8816 Chip Select.
// VCLK WM8816 Clock.
// VDATA WM8818 Bi-directional Data.
// ============================================================================================
module DbeVolume( RESET, CLK,
WRC, WRD,
DI, DO, BUSY,
VCS, VCLK, VDATA);
// uC interface
input wire RESET; //Main reset
input wire CLK; //Main clock
input wire WRC; //Control register write strobe
input wire WRD; //Data register write strobe
input wire [7:0] DI; //Data input
output wire [7:0] DO; //Data output
output wire BUSY; //Busy flag output
// WM8816 interface
output wire VCS; //Chip select strobe
output wire VCLK; //Clock strobe
inout wire VDATA; //Data pin
// Internal
reg [7:0] CR; //8-bit control register
reg [7:0] DR; //8-bit data register
reg [1:0] STM; //State-machine
reg [2:0] CNT; //Counter
wire FIDLE; //Idle state flag, used as asynchronous reset
wire FDATA; //Data state flag, used as asynchronous reset
reg LCLK; //Leading clock: --__--__--__
reg FCLK; //Following clock: _--__--__--_
wire CCLK; //Control register clock
wire DCLK; //Data register clock
wire SCLK; //Shift clock
reg OE; //Serial data output enable
reg START; //Start flag
// State-machine states
parameter STM_IDLE = 2'b00;
parameter STM_CTRL = 2'b01;
parameter STM_DATA = 2'b10;
// State flags
assign FIDLE = (STM == STM_IDLE);
assign FDATA = (STM == STM_DATA);
// Busy flag
assign BUSY = (START | STM != STM_IDLE);
// Start flag
always @ (negedge WRC, posedge FDATA) begin
if (FDATA) START <= 0;
else if (!BUSY) START <= 1;
end
// Leading clock
always @ (posedge CLK, negedge BUSY) begin
if (!BUSY) LCLK <= 0;
else LCLK <= !LCLK;
end
// Following clock
always @ (negedge CLK, negedge BUSY) begin
if (!BUSY) FCLK <= 0;
else FCLK <= !FCLK;
end
// Counter
always @ (posedge LCLK, posedge FIDLE) begin
if (FIDLE) CNT <= 0;
else CNT <= CNT ++ 1;
end
// State-machine
always @ (posedge LCLK, posedge RESET) begin
if (RESET) STM <= STM_IDLE;
else begin
if (CNT == 3'b111)
case (STM)
STM_CTRL: STM <= STM_DATA;
STM_DATA: STM <= STM_IDLE;
endcase
else
if (STM == STM_IDLE) STM <= STM_CTRL;
end
end
// Output enable bit
always @ (negedge LCLK, posedge FIDLE) begin
if (FIDLE) OE <= 1;
else if ((STM == STM_CTRL) && (CNT == 3'b111) && DR[1]) OE <= 0;
end
// Shift clock
assign SCLK = (!FCLK && !LCLK && STM == STM_CTRL && OE) | // Shift clock control byte
(!FCLK && !LCLK && STM == STM_DATA && OE) | // Shift clock data byte out
( FCLK && LCLK && STM == STM_DATA && !OE); // Shift clock data byte in
// Control register
assign CCLK = (WRC && !BUSY) | (SCLK);
always @ (posedge CCLK, posedge RESET) begin
if (RESET) CR <= 0;
else if (BUSY) CR <= {CR[6:0], DR[7]};
else CR <= DI;
end
// Data register
assign DCLK = (WRD && !BUSY) | (SCLK);
always @ (posedge DCLK, posedge RESET) begin
if (RESET) DR <= 0;
else if (BUSY) DR <= {DR[6:0], VDATA};
else DR <= DI;
end
// To uC
assign DO = DR;
// To WM8816
assign VDATA = OE ? CR[7] : 1'bZ;
assign VCS = STM != STM_IDLE && !(STM == STM_DATA && CNT == 3'b111 && !LCLK);
assign VCLK = FCLK;
// Initialization
initial begin
CR = 0;
DR = 0;
LCLK = 0;
FCLK = 0;
STM = STM_IDLE;
CNT = 0;
START = 0;
OE = 1;
end
endmodule
Het dataregister is gevuld met 0x00, dus dat is wat er in gaat. Een control byte 0x6A voor schrijven naar een WM register en een control byte 0x6E voor het lezen van een WM register.
Omdat de simulator niets op de VDATA pin zet, leest het ding Hi-Z in.
@Free, is dit een beetje propere Verilog of zit er 'not-done' spul in..
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
tis hele propere verilog.
maar om het iets minder tikwerk te maken : v2001 gebruiken
al dat dubbel assigneerwerk is nergens voor nodig.
module DbeVolume(
input wire
RESET, //Main reset
CLK, //Main clock
WRC, //Control register write strobe
WRD, //Data register write strobe
input wire
[7:0] DI, //Data input
output wire
[7:0] DO, //Data output
output wire
BUSY, //Busy flag output
VCS, //Chip select strobe
VCLK, //Clock strobe
inout wire
VDATA //Data pin
);
let wel dat de 99.99 % van de synthesizers die initial constructie gewoon wegsmijten. !!
( belangrijk als je daarop vertrouwt om je state machine te initialiseren bijvoorbeeld ! )
je (echte) logica kan compleet in deadlock gaan.
Ik wist nog niet dat je die header declaratie zo kon vereenvoudigen, dat pas ik dan nog even aan,
Dat initialisatie stuk ik denk wel dat ISE daar iets mee doet. De power-up state van de flipflops in de CPLD kan geprogrammeerd worden, ze krijgen een Xilinx 'INIT' attribute mee wat gezet wordt op basis van wat je in de initial zet. Ik heb het nog niet geprobeerd in de praktijk, maar zal ik zeker even testen. Als het niet werkt, zal ik er rekening mee houden dat alle flops op 0 moeten, dus zou ik die OE om moeten draaien 
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 5 oktober 2007 00:27:07 schreef MagicBox:
Ik wist nog niet dat je die header declaratie zo kon vereenvoudigen, dat pas ik dan nog even aan,Dat initialisatie stuk ik denk wel dat ISE daar iets mee doet. De power-up state van de flipflops in de CPLD kan geprogrammeerd worden, ze krijgen een Xilinx 'INIT' attribute mee wat gezet wordt op basis van wat je in de initial zet. Ik heb het nog niet geprobeerd in de praktijk, maar zal ik zeker even testen. Als het niet werkt, zal ik er rekening mee houden dat alle flops op 0 moeten, dus zou ik die OE om moeten draaien
in CPLD kan het. in FPGA niet !
cpld ( echte dan ) gebruiken een memry cel per connectie.
FPGA schuiven de bitstream in en gebruiken de interconnecties zelf als shifter. de data wandelt daar dus door en de initiele toestand na het laden van de stream is compleet onbekend. je moet ene FPGA ALTIJD resetten !
Bwaaah onzin hoor. De FPGA flipflops worden ook meegeprogrammeerd met de bitstream, netzoals de blockrams (een ROM memory, zoals een sinustabel oid, is niks anders dan een preloaded ram geheugen).
De init waarde wordt dus wel degelijk opgevolgd. Ik ben daarom ook een beetje afgestapt van reset logica, omdat dit in de meeste gevallen compleet overbodig is.
Op 5 oktober 2007 09:31:49 schreef KillerB the Supreme:
Bwaaah onzin hoor. De FPGA flipflops worden ook meegeprogrammeerd met de bitstream, netzoals de blockrams (een ROM memory, zoals een sinustabel oid, is niks anders dan een preloaded ram geheugen).De init waarde wordt dus wel degelijk opgevolgd. Ik ben daarom ook een beetje afgestapt van reset logica, omdat dit in de meeste gevallen compleet overbodig is.
Zou dit dat een wezenlijk verschil tussen Xilinx en Altera zijn?
Squant
A byte walks into a bar and orders a pint. Bartender asks him "What's wrong?" Byte says "Parity error." Bartender nods and says "Yeah, I thought you looked a bit off."
Hallo, ik heb ook meegedaan aan de FPGA SK. Maar heb zelf alleen het LCD bord geprogrammeerd.
Heb hier de code beneden geplaatst, het verwacht een 50MHz klok in. Zit ook nog een testbench bij voor de geinteresseerden.
`timescale 1ns / 1ps
module LQ43T3D_syncgen(RESET,CLK,ENABLE,HSYNC,VSYNC,X_ON,Y_ON);
// module inputs/outputs
// reset for simulation and well behavedness
input RESET;
// clock input. sync gen responds to the clock and enable at the same time
input CLK;
// if high the statemachine advances, this is to facilitate faster clocking
input ENABLE;
// LCD control signals
output HSYNC;
output VSYNC;
// X or Y drawing is enabled
output X_ON;
output Y_ON;
parameter hor_pix = 480;
parameter vert_pix = 272;
parameter hor_length = 525;
parameter vert_length = 286;
parameter hor_pulse_length = 41;
parameter vert_pulse_length = 10;
parameter hor_front_porch_length = 2;
parameter vert_front_porch_length = 2;
parameter hor_back_porch_length = 2;
parameter vert_back_porch_length = 2;
// counters for the H and V sync length
reg [9:0] Hcounter;
reg [9:0] Vcounter;
// registers for the HS, and VS
reg hor_sync, vert_sync;
// register to define if you are in a viewable area
reg Xpresent,Ypresent;
// wires
wire Vmax,Hmax;
wire Vpulse, Hpulse;
// For the SHARP LQ043T3D the parameters should be
// assign activity pins
assign X_ON = Xpresent;
assign Y_ON = Ypresent;
// the Clock should be from 8 to 9 Mhz
// maximum widths
assign Hmax = (Hcounter==hor_length);
assign Vmax = (Vcounter==vert_length);
// define pulse lengths
assign Hpulse = (Hcounter==hor_pulse_length);
assign Vpulse = (Vcounter==vert_pulse_length);
// lengths of the back porches
assign HBporch = (Hcounter==hor_length - hor_back_porch_length);
assign VBporch = (Vcounter==vert_length - vert_back_porch_length);
// lengths of the front porches + pulse lengths
assign HFporch = (Hcounter==hor_front_porch_length + hor_pulse_length);
assign VFporch = (Vcounter==vert_front_porch_length + vert_pulse_length);
// invert signals.
assign HSYNC = ~hor_sync;
assign VSYNC = ~vert_sync;
// increment the Horizontal sync gen
always @(posedge CLK)
begin
if(ENABLE)
begin
if(Hmax || !RESET)
Hcounter <= 0;
else
Hcounter <= Hcounter + 1;
end
end
// increment the Vertical sync gen
always @(posedge CLK)
begin
if(ENABLE)
begin
if(Hmax)
Vcounter <= Vcounter + 1;
if(Vmax || !RESET)
begin
Vcounter <= 0;
end
end
end
// Generate VGA spec sync pulses
always @(posedge CLK)
begin
// horizontal
if(Hmax)
hor_sync <= 1;
if(Hpulse)
hor_sync <= 0;
// vertical
if(Vmax)
vert_sync <= 1;
if(Vpulse)
vert_sync <= 0;
end
// define if the electron beam is in the proper area
always @(posedge CLK)
begin
// horizontal
if(VFporch)
Ypresent <= 1;
if(VBporch)
Ypresent <= 0;
// vertical
if(HFporch)
Xpresent <= 1;
if(HBporch)
Xpresent <= 0;
end
initial
begin
Hcounter <= 0;
Vcounter <= 0;
hor_sync <= 0;
vert_sync <= 0;
Xpresent <= 0;
Ypresent <= 0;
end
endmodule
Primaire syncgenerator, prima aan te passen aan verschillende typen displays. Gebruik hem zelf voor VGA SVGA en allerlei typen LCD's. Je kan de parameters veranderen door registers om een echte CRTC te maken.
`timescale 1ns / 1ps
module LQ43T3D_iface(RESET, CLK, LCD_HSYNC, LCD_VSYNC, LCD_RED, LCD_GREEN, LCD_BLUE, LCD_CLKOUT, LCD_ENABLE, DONE);
input CLK;
input RESET;
output LCD_HSYNC;
output LCD_VSYNC;
output [7:0] LCD_RED;
output [7:0] LCD_GREEN;
output [7:0] LCD_BLUE;
output LCD_CLKOUT;
output LCD_ENABLE;
output DONE;
wire X_ON;
wire Y_ON;
wire clk_lcd_enable;
reg [8:0] x_cnt;
reg [8:0] y_cnt;
reg [8:0] f_cnt;
reg [3:0] lcd_clk_div;
reg screen_rdy;
assign LCD_ENABLE = screen_rdy;
assign DONE = 1;
// Nice XOR pattern
assign LCD_RED[7:0] = ((x_cnt ^ y_cnt)) + (f_cnt << 2 );
assign LCD_GREEN[7:0] = ((x_cnt ^ y_cnt)) + (f_cnt << 1);
assign LCD_BLUE[7:0] = ((x_cnt ^ y_cnt)) + (f_cnt << 0);
// clock divider from 50 MHz tot 8.3MHz
assign LCD_CLKOUT = (lcd_clk_div < 3);
assign clk_lcd_enable = (lcd_clk_div == 5);
LQ43T3D_syncgen clockgen (RESET,CLK,clk_lcd_enable,LCD_HSYNC,LCD_VSYNC,X_ON,Y_ON);
initial
begin
x_cnt <= 0;
y_cnt <= 0;
f_cnt <= 0;
lcd_clk_div <= 0;
screen_rdy <= 0;
end
// reset statemachine
always @(posedge CLK)
begin
if(X_ON & Y_ON & clk_lcd_enable)
begin
x_cnt <= x_cnt + 1;
end
if((x_cnt == 480) & clk_lcd_enable)
begin
y_cnt <= y_cnt + 1;
x_cnt <= 0;
end
if((y_cnt == 272) & clk_lcd_enable)
begin
y_cnt <= 0;
f_cnt <= f_cnt + 1;
end
if(!RESET)
begin
x_cnt <= 0;
y_cnt <= 0;
f_cnt <= 0;
end
end
// clock divider and regulator
always @ (posedge CLK)
begin
if(clk_lcd_enable | !RESET)
lcd_clk_div <= 0;
else
lcd_clk_div <= lcd_clk_div + 1;
end
// 10 frames of data needed before screen is
// actually ready
always @ (posedge CLK)
begin
// enable screen in the middle of the frame
if((f_cnt == 10) & (y_cnt == 128))
screen_rdy <= 1;
if(!RESET)
screen_rdy <= 0;
end
endmodule
Deze module genereert wat leuke kleurtjes in dit geval. Op een later tijdstip komt hier de video shifter en geheugen aansturing voor het video ram in. Plus arbitrage om geheugen conflicten te voorkomen.
// Testbench
`timescale 1ns / 1ps
module LQ43T3D_syncgen_test;
reg RESET;
reg CLK0;
wire HSYNC;
wire VSYNC;
wire [7:0]RED;
wire [7:0]GREEN;
wire [7:0]BLUE;
wire ENABLE;
wire DONE;
wire CLKOUT;
parameter CLK0_PERIOD = 10; // cycle time
LQ43T3D_iface displayclkgen0 (RESET, CLK0, HSYNC, VSYNC, RED, GREEN, BLUE, CLKOUT, ENABLE, DONE);
initial begin
#0 CLK0 <= 0;
// reset toggle
#0 RESET <= 0;
#1000 RESET <= 1;
end
always
begin
#CLK0_PERIOD CLK0 = ~CLK0;
end
initial
begin
begin
#1000000000;
end
$stop;
$finish;
end
endmodule
Hier wat test bench code om te bekijken op de simulator.
Ik heb het geheel onder Xilinx ISE 9.2 draaidend. Het UCF bestand zit er niet bij omdat ik totaal andere pinouts heb op mijn fpga bordje.
Op 27 september 2007 20:42:04 schreef fotoopa:
Als er zijn die de datasheet wel begrijpen en mij kunnen vertellen hoe dit DISPL signaal moet verlopen, graag!
Er staat in de datasheet dat DISP 10 frames laag moet blijven. Waarom weet ik niet precies maar geloof dat het de reset procedure is. Heb dit wel gedaan omdat soms bij een reconfiguratie het beeld er raar in 2en gesplitst uit ziet. Op deze manier gedraagd zich alles correct bij een globale RESET.
Ik maak iedere module met een CLK en RESET pin, dit helpt bij simulatie om alle state machines te resetten maar heeft ook wel praktisch nut.
@Squant,
Bedankt voor de voorbeelden en de extra info voor het disp signaal.
Ik heb alle voorbeeldjes even in een quartus design geplaatst en gecompileerd. Dit gaat perfect zonder enige fout melding.
Ik ben nu aan het solderen van het FPGA boardje. Als ik later wat tijd heb ga ik eens de LA aan mijn DE1 boardje hangen en de user I/O pinnen toekennen aan jouw voorbeeld en wat beeldjes bekijken. maar het ziet er heel mooi uit.
Intussen was ik iets gelijkaardig aan het schrijven inclusief de nodige ram en ook een character display in overlay voor het 4.3 lcdje. routines zijn nog niet volledig af maar krijgen toch al mooie vormen. de character generator is een 5x7 dot die in de ram kan geladen worden bij powerup door de config eprom. Full 24 bit color ram zit buiten de FPGA maar onboard van de DE1 ( 512 Kbyte 10 nsec ram).
komt later ook wel een voorbeeld van.
Jochem
If you want to succeed, double your failure rate.
Uhm.. wat is er mis met imageshack? ik vind 'm wel prettig, direct uploaden, direct bekijken zonder inloggen/moeten clicken op links om uiteindelijk bij het plaatje of upload pagina'tje te komen.
Als het popups is, die ziet ik niet met ZoneAlarm's Ad-blocking 
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 5 oktober 2007 09:31:49 schreef KillerB the Supreme:
Bwaaah onzin hoor. De FPGA flipflops worden ook meegeprogrammeerd met de bitstream, netzoals de blockrams (een ROM memory, zoals een sinustabel oid, is niks anders dan een preloaded ram geheugen).De init waarde wordt dus wel degelijk opgevolgd. Ik ben daarom ook een beetje afgestapt van reset logica, omdat dit in de meeste gevallen compleet overbodig is.
dat is NIET gegarandeerd !.
lees het syntheseraport maar eens. veelal staat daar in dat de inhoud van register of latch xxx en yyy niet gegarandeerd kan worden en dat een reset noodzakelijk is.
Squant
A byte walks into a bar and orders a pint. Bartender asks him "What's wrong?" Byte says "Parity error." Bartender nods and says "Yeah, I thought you looked a bit off."
Op 5 oktober 2007 12:44:12 schreef fotoopa:
Intussen was ik iets gelijkaardig aan het schrijven inclusief de nodige ram en ook een character display in overlay voor het 4.3 lcdje. routines zijn nog niet volledig af maar krijgen toch al mooie vormen. de character generator is een 5x7 dot die in de ram kan geladen worden bij powerup door de config eprom. Full 24 bit color ram zit buiten de FPGA maar onboard van de DE1 ( 512 Kbyte 10 nsec ram).komt later ook wel een voorbeeld van.
Handig gewoon SRAM
, op de spartan3E starter kit zit een 64MiByte DDRDRAM geheugen wat behoorlijk problematisch is met aanspreken. Heb het zelf nog niet aan de gang kunnen krijgen (behalve in gesimuleerde code, maar is nog niet gemakkelijk). Als ik tijd heb ga ik eens de DDR controller van opencores gebruiken of ik het geheel werkend kan krijgen en dan het display aansturen.
Had veel liever gewoon SRAM gehad op het bordje net als de gewone spartan3 starterkit, die heeft tenminste ook gewone pinheaders in plaats van zo een hirose connector die geen standaard 2.54 raster heeft.
Squant
A byte walks into a bar and orders a pint. Bartender asks him "What's wrong?" Byte says "Parity error." Bartender nods and says "Yeah, I thought you looked a bit off."
Op 5 oktober 2007 17:34:48 schreef free_electron:
[...]dat is NIET gegarandeerd !.
lees het syntheseraport maar eens. veelal staat daar in dat de inhoud van register of latch xxx en yyy niet gegarandeerd kan worden en dat een reset noodzakelijk is.
Zoiets heb ik dus nog nooit bij XilinX ISE gezien, je kan ook kiezen bij de advanced options welke status de flipflops moeten hebben, high, low of FPGA equivalent. Ik denk dat het waarschijnlijk het verschil is tussen Altera en Xilinx.
Mijn eerste Blue Bird FPGA boardje is bestukt en ligt op mijn bureel voor de verschillende testen. ik had een klein testprogrammatje voorbereid om de 4x7 segments display aan te sturen samen met de 16 leds aan de uitgangs connector.
En ja alles blijkt van de eerste maal te werken, programma direct via de jtag in de FPGA en het draait.
De volgende dagen test ik de andere functie's maar voorlopig blijkt alles korrect te werken. Dank aan xantus voor het mooie ontwerp en voor het oplossen van de vele problemen tijdens het verloop van de SK actie.
Mijn eerste Blue Bird boardje van Xantus is bestukt. Nog een grondige kontrole van alle elementen voor juiste bestukking en goede soldeerpunten. Tijd om de eerste spanningsmetingen uit te voeren. Eerst de polariteit van de toevoerspanning nog eens nagezien en dan traag de voeding opdraaien vanaf 1.25V verder en verder in de richting van de 5V. Aan 3.36V zag ik dat de spanning konstant bleef wat op een goede regeling van de spanningsregulator wijst. De 1.5V ook meteen nagemeten en die was 1.50V precies.
Tijd om de voorbereiding van de jtag voor een testprogramma te kunnen opladen. Maar eerst nagemeten of op pin4 van de jtag connector wel de 3.3V aanwezig was want die is nodig voor de programmer. En je hoor dat was ook inorde.
Nu tijd om de USB programmer aan te koppelen. De eerste test verloopt over de JTAG mode, dus direct downloaden naar de FPGA. Bij het opstarten van de Quartus programmer was er direct connectie met de programmer en paf, daar ging de data naar de FPGA zonder fouten. Een eerder gemaakte testroutine maakt gebruik van de 4 digits display en alle 16 output leds aan de connectors. En ja daar loopt het volledige programma. Keurig op de juiste snelheid vanaf het 50 Mhz quartz.
Ook de config eprom epcs1 is er nu opgesoldeerd en het test programma daarin geladen via de Terasic USB programmer in AS mode. En ja hoor ook dit werkt perfect. Als je nu de power af en weer aan legt start je FPGA.
Opmerking:
Om de EPCS1 te kunnen programmeren moet je de programmer op de 10 polige AS connector aansluiten. Opgepast die connector staat 180 graden gedraaid tov de JTAG connector. Pin 1 zit aan de kant van het 7 segments display. Maar dit staat correct aangeduid op de print.
Ook moet je de programmer in as mode plaatsen. Maar heel belangrijk, je moet je programmer compileren voor de EPCS1 chip. Dit kun je instellen in Quartus ->assignments-> device en dan de TAB device and Pin Options aanklikken.
Daarin kun je de TAB Configuration aanklikken en onder configuration sheme actief serial selecteren
Dan use configuration device aanvinken en in het uitschuifvenster de EPCS1 selecteren.
Na deze instellingen je programma terug compileren zodat je een .pof bekomt voor de programmer.
Samengevat:
Programmeren via de JTAG direct in de FPGA is een .sof file en de programmer moet in JTAG mode staan. Je moet de JTAG connector gebruiken op de blue bird board.
Programmeren van de config prom is een .pof file en de programmer moet is as mode staan. Je moet de AS connector gebruiken op de Blue Bird board.
Om nieuwe gebruikers gemakkelijk een testprogramma te kunnen draaien heb ik een volledig project via de archive Quartus klaargemaakt.
Het project noemt zeven_segment
en de archive file is zeven_segment.qar
Deze file is hier te down loaden
Hoe moet je dit nu verwerken:
- download deze file om het even waar.
- start Quartus en via menu Project -> Restore Archive Project selecteer je in de bovenste fileselect de zeven_segment.qar file die je net hebt down geload.
In de destination folder selecteer je de plaats waar je het project wenst te restoren, e kunt hier eventueel een nieuwe directory aanmaken met de naam zeven_segment, die openen je dan en klikt op Ok om het project in die nieuwe directory volledig te restoren.
Nu vind je alle files van het project terug inclusief de .sof en .pof files die dienen voor de programmer.
Je kunt nu direct de FPGA programmeren met de USBblaster. Daarvoor zijn 2 methode mogelijk:
- direct de FPGA programmeren in JTAG mode van de programmer en met gebruik van de zeven_segment.sof file. Hiervoor sluit je de 10 polige kabel aan de blue bird board aan de connector aan de buitenkant van de board. Let goed op pin1
- 2de methode is de config eprom EPCS1 programmeren. Dit moet in AS mode en met de zeven_segment.pof file gebeuren. ( kun je inbrengen via de menu's in de programmer)
Hiervoor moet de USBblaster op de 2de connector zitten, naar de binnenkant van de board. Let weer op op pin1 want die zit nu 180 graden aan de andere zijde. Gebruik hiervoor de zeven_segment.pof file met de programmer eerst in AS mode te zetten.
Het testprogramma is net upgedate met de laatste versie. Het bevat volgende functie's:
- Een 8 bit teller is aangesloten op de 2x7 segments display en toont een 8 bit tellerwaarde in hex formaat. increment is 10 pulsen per seconde.
- Alle 6 de switchen zijn doorverbonden via de FPGA naar hun overeenkomende leds alsook de 8 dipswitchen. drukken op deze toetsen doet de led branden. Dit werkt ook als de 50 Mhz clock niet goed zou werken, de display met hexuitlezing met wel een goede clock hebben om te kunnen werken.
- Er is een 20 bit counter gemaakt die loopt met een clock van 1 usec. alle 20 de uitgangen zijn verbonden aan de 20 externe I/O con pinnen 1 tot 20 Bij iedere I/O pin is de clock verder door 2 gedeelt. Hiermee kun je met een scoop alle 20 de I/O's nazien of er een goed clocksignaal doorkomt. CON1 is 500Khz, CON2 250Khz enz....
- Er is een RC5 afstandsbedienings decoder gemaakt. Het resultaat ervan komt op de 2 hoogste digits van de display. Het moet een philips compatieble afstandsbediening zijn. Led16 geeft ook de pulsen weer van de RC5 decoder.
Er is al heel wat uitgelegd in de SK actie maar de rest wordt hier nu verder gedaan voor alle CO gebruikers. Intussen zijn een aantal gebruikers ook al klaar met hun bestukking en draaien met succes de eerste testprogramma's.
Nogmaal heel veel dank aan de Ontwerper Xantus voor deze heel mooie realisatie. Als je ziet wat werk dit gekost heeft, hoeveel tijd er daar ingestoken werd, gewoon ernorm!
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Op 5 oktober 2007 18:44:54 schreef Squant:
Zoiets heb ik dus nog nooit bij XilinX ISE gezien, je kan ook kiezen bij de advanced options welke status de flipflops moeten hebben, high, low of FPGA equivalent. Ik denk dat het waarschijnlijk het verschil is tussen Altera en Xilinx.
Ja, denk ik ook. Bij Xilinx is het namelijk wel degelijk gegarandeerd wat de stand van de FFs is na init. Een reset is dus niet strikt noodzakelijk en in sommige gevallen zelfs ongewenst. Voorbeeld: Als je een schuifregister codeert zal synthese er een SRL16 voor gebruiken als er GEEN reset is. Je hebt maar 1 CLB nodig. Als je WEL een reset hebt, dan moet ie het bouwen met losse FFs en heb je dus 16 CLBs nodig (bij een 16 bit shifter).
Dan nog even over de code van MagicBox:
assign FDATA = (STM == STM_DATA);
// Start flag
always @ (negedge WRC, posedge FDATA) begin
if (FDATA) START <= 0;
else if (!BUSY) START <= 1;
end
Ik vindt dit iets minder fraai (maar da's een verschil in opvatting tussen FE en ik (lijkt wel structureel te worden, hehe)). Mi is dit heel smerige code en gaat ook in veel gevallen niet goed werken. FDATA is nl in de always@ de reset voor een FF genaamd START. fdata komt echter uit de combinatoriek van de statemachine (output decoder). STM is een vector met meerdere bits. Deze gaan in de praktijk nooit allemaal in een keer "om". Daardoor kan er een glitch ontstaan op FDATA en zo een reset van START geven wanneer je het niet bedoeld. Nou kan het net goed gaan door de state codering goed te kiezen, maar het gaat gegarandeerd een keer fout als je een keer iets moet wijzigen.
Mijn advies: hou de zaak 100% synchoon. Dus in ALLE always@-s maar EEN dezelfde reset en clock gebruiken. In dat geval hebben glitches geen effect en is er nooit een verschil tussen simulatie en hardware. Uch!
Op 7 oktober 2007 22:19:48 schreef fotoopa:
...Hoe moet je dit nu verwerken:- download deze file om het even waar.
- start Quartus en via menu Project -> Restore Archive Project selecteer je in de bovenste fileselect de zeven_segment.qar file die je net hebt down geload.
In de destination folder selecteer je de plaats waar je het project wenst te restoren, e kunt hier eventueel een nieuwe directory aanmaken met de naam zeven_segment, die openen je dan en klikt op Ok om het project in die nieuwe directory volledig te restoren.
Dit geeft bij mij de fout melding:
The project or revision name contains one or more of the following illegal characters ans cannot opened: ^&?*|<>;'
Wat zou het probleem zijn ?
@MMSoft,
lijkt mij een corrupte .qar file te zijn. Ik heb zopas de online .qar file geladen, een restore gedaan in een totaal nieuwe directory Quartus via open project deze gebruikt en alles gecompileerd zonder problemen. De file naar de FPGA gestuurd en getest.
Alles is wel uitgevoerd bij mij met de laatste versie van Quartus 7.2 Dit zou eventueel ook nog een oorzaak kunnen zijn als je een oudere versie hebt.
Omdat het bestukkingsplan voor de I/O connectors niet zo duidelijk was heb ik dit wat hertekend en de namen aangeduid. Ook is het nu iets duidelijker waar pin1 van de connectors zit. Merkop dat de voedingen bij de beide connectors niet op dezelfde pinnen zit. Je mag de aansluitkabel niet zomaar van de ene op de andere connector plaatsen!
In het testprogramma komt dus een blokgolf uit per I/O pin vanaf CON1 tot en met CON20
CON1 is 500 Khz
CON2 is 250 KHz
CON3 is 125 KHz
....
enz tot CON20.
Zo kun je iedere I/O nazien of het signaal een zuivere blokgolf is die symetrisch is. Mocht er ergens een kortsluiting zitten dan zullen er signalen ontbreken of verminkt zijn.
[Bericht gewijzigd door fotoopa op (12%)]
Op 7 oktober 2007 23:01:34 schreef flipflop:
[...]
Ja, denk ik ook. Bij Xilinx is het namelijk wel degelijk gegarandeerd wat de stand van de FFs is na init. Een reset is dus niet strikt noodzakelijk en in sommige gevallen zelfs ongewenst. Voorbeeld: Als je een schuifregister codeert zal synthese er een SRL16 voor gebruiken als er GEEN reset is. Je hebt maar 1 CLB nodig. Als je WEL een reset hebt, dan moet ie het bouwen met losse FFs en heb je dus 16 CLBs nodig (bij een 16 bit shifter).Dan nog even over de code van MagicBox:
assign FDATA = (STM == STM_DATA); // Start flag always @ (negedge WRC, posedge FDATA) begin if (FDATA) START <= 0; else if (!BUSY) START <= 1; endIk vindt dit iets minder fraai (maar da's een verschil in opvatting tussen FE en ik (lijkt wel structureel te worden, hehe)). Mi is dit heel smerige code en gaat ook in veel gevallen niet goed werken. FDATA is nl in de always@ de reset voor een FF genaamd START. fdata komt echter uit de combinatoriek van de statemachine (output decoder). STM is een vector met meerdere bits. Deze gaan in de praktijk nooit allemaal in een keer "om". Daardoor kan er een glitch ontstaan op FDATA en zo een reset van START geven wanneer je het niet bedoeld. Nou kan het net goed gaan door de state codering goed te kiezen, maar het gaat gegarandeerd een keer fout als je een keer iets moet wijzigen.
Mijn advies: hou de zaak 100% synchoon. Dus in ALLE always@-s maar EEN dezelfde reset en clock gebruiken. In dat geval hebben glitches geen effect en is er nooit een verschil tussen simulatie en hardware. Uch!
Je hebt helemaal gelijk, preventief programmeren. Echter, in dit specifieke stukje code heb ik rekening gehouden of en hoe glitches uit zouden pakken. Een extra syncrhone FF is een extra macrocell. Dus meer resources. Ik heb dit ontwerpje zo goed als mogelijk geoptimaliseerd en alles werkt goed. Ik zou het hoogstens nog specifiek kunnen documenteren, maar dit is geen bedrijfscode waar meerdere mensen aan werken en verder zal die WM8816's interface niet veranderen dus ook de verilog module zal ik niet meer wijzigen. 
Edit: ik had deze 'controller' al eerder gebouwd, maar dan met State-CAD en Schematic. Gebruikte 39 macrocellen. Verder was de timing minder optimaal, de cyclus duurde langer dan eigenlijk nodig was. Met dit stukkie V code slechts 29 macrocellen en timing is nu optimaal.