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.

Schrijf cyclus:
http://img527.imageshack.us/img527/6523/wmwrcf9.th.png
Lees cyclus:
http://img443.imageshack.us/img443/7466/wmrdbd6.th.png

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..

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 :)

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?

Ik heb me laten vertellen dat zowel xilinx als altera dit beide hebben.

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.

@MagicBox: uploadarchief is zoveel vriendelijker voor ons dan imageshack!!

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 ;)

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.

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.

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!

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.

Net in een andere directory geprobeerd, en daar werkt het wel...

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!

http://users.skynet.be/fotoopa/fpga/connector.png

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;
  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!

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.

@FotoOpa

Led19 gaat die ook branden met uw Test Programma?