tilldela pinnar till Xilinx FPGA...

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

tilldela pinnar till Xilinx FPGA...

Inlägg av Seven11 »

Jag har just fått mitt lilla utvecklingskort med en Xilinx Spartan 3 - 400k, och har bara gjort ett litet test program i VHDL:

Kod: Markera allt

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity test1 is
    Port ( a : in  STD_LOGIC;
           b : in  STD_LOGIC;
           c : in  STD_LOGIC;
           y : out  STD_LOGIC);
end test1;

architecture Behavioral of test1 is

begin

y <= (a or b) and c;

end Behavioral;
Men hur bestämmer jag vilken pinne på utvecklingskortet som ska vara y, a,b och c??? (utvecklingskortet är ett S3BOARD från Digilent)
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg av rehnmaak »

Du skriver i ucf-filen var pinnarna ska vara. Där sätter du även upp constraints för klockor osv. Dokumentationen finns i Constraints Guide

tex:

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 50 MHz HIGH 50 %;
NET "clk" LOC = "P79";
NET "SDRAM_Addr<0>" LOC = "P150";
NET "SDRAM_Addr<1>" LOC = "P152";
NET "SDRAM_Addr<2>" LOC = "P154";
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

så om jag skulle vilja koppla a till "P1", b till "P2", c till "P3" och y till "A1" så blir det

NET "a" LOC = "P1";
NET "b" LOC = "P2";
NET "c" LOC = "P3";
NET "y" LOC = "A1";

?
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg av rehnmaak »

Det ska väl kunna fungera....
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Har du inte ett grafiskt gränssnitt i Webpack eller använder du nåt annat?
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

hur gör man då om man vill ha en klocka?

VHDL koden som jag har ser ut så här:

Kod: Markera allt

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity test1 is
    Port ( clka : in  STD_LOGIC;
           y : inout  STD_LOGIC);
end test1;

architecture Behavioral of test1 is

begin

testit: process
variable var: integer := 0;
begin
	wait until rising_edge(clka);
	var := var + 1;
	if var = 500 then
		y <= not y;
		var := 0;
	end if;
end process testit;

end Behavioral;
och .ucf filen:

Kod: Markera allt

NET "clka" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 2 mS HIGH 10;
NET "y" LOC = "P11"; 
meningen är att lysdioden som sitter på pinne "P11" eller "y" i koden ska tändas och släckas i ett 1 sekunders intervall... men vad tror ni?
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg av rehnmaak »

Jag tror det är något i denhär stilen du ska ha....

Kod: Markera allt

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 

entity test1 is 
    Port ( clka : in  STD_LOGIC; 
           y : inout  STD_LOGIC); 
end test1; 

signal q : std_logic;
signal clk : std_logic;
signal delay : integer;

architecture Behavioral of test1 is 

begin 

testit: process (clk)
begin 
   if (clk'event and clk='1') then
   begin
      delay <= delay + 1;
      if (delay = 500) then
      begin
          delay <= 0;
          q <= not q;
      end if;
   end if;
end process testit; 

y <= q;

end Behavioral;
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

nej det funkar inte heller...

efter att flyttat in "signal" definitionerna i architecture definitionen och tagit bort "begin" efter if så går koden igenom synteseringen, alltså:

Kod: Markera allt

ibrary IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity test1 is
    Port ( clka : in  STD_LOGIC;
           y : inout  STD_LOGIC);
end test1;

architecture Behavioral of test1 is

signal q : std_logic;
signal clk : std_logic;
signal delay : integer;

begin

testit: process (clk)
begin
   if (clk'event and clk='1') then
      delay <= delay + 1;
      if (delay = 500) then
          delay <= 0;
          q <= not q;
      end if;
   end if;
end process testit;

y <= q;

end Behavioral;
men den går inte igenom den fas där man genererar programmerings filerna, får felmedelande:

Checking timing specifications ...
WARNING:XdmHelpers:625 - No instances driven from the following signals or pins
are valid for inclusion in TNM group "clk". A TNM property on a pin or signal
marks only the flip-flops, latches and/or RAMs which are directly or
indirectly driven by that pin or signal.
signal "clka"
WARNING:XdmHelpers:644 - No appropriate elements were found for the TNM group
"clk". This group has been removed from the design.
ERROR:XdmHelpers:650 - The period specification "TS_clk" is invalid because the
"clk" group was removed.
?
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg av rehnmaak »

naturligtvis ska signaldefinitionerna ligga efter architecture och inget begin efter if.... jag får skylla på att jag blandar ihop det med verilog :?

byt namn från "clk" till "clka" så ska det fungera.

EDIT: och ta bort "signal clk : std_logic"
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

hmmm den verkar inte ge med sig... det går att föra över programmet till utvecklingskortet men lysdioden blinkar inte... den är bara släckt...
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg av rehnmaak »

Du har glömt att tilldela clka en pinne...
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

okej... hur går man det? och vilken pinne ska man välja?
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg av rehnmaak »

Tja, du får väl leta reda på en klocka i schemat till kortet.... sen följer du den till pinnen på FPGA:n :)

Jag tror klockan på det kortet är på 50MHz så du kanske behöver öka dina 500 till något MYCKET större.
Användarvisningsbild
cyber-hagga
Inlägg: 26
Blev medlem: 1 augusti 2004, 00:50:35

Inlägg av cyber-hagga »

På sida 35 av "Reference Manual" http://www.digilentinc.com/Data/Product ... ARD-rm.pdf
står det att clk 50MHz ligger på pinne T9.

såg även i "Board Verification" http://www.digilentinc.com/Data/Product ... D-demo.zip
i filen "S3demo.ucf" skrivs det att:

NET "mclk" LOC = "T9" ;

vet inte om det fungerar att skriva så , haftför mig att alla pinnar börjar på p inte T =)

"if (delay = 500) then" får nog ökas som sagt till typ 25000000 så blinkar LEDen i 1Hz om jag hänger med i coden.

de får du testa , kortet håller nog för det tor ja =)

så en recap (om ja får va med å sabotera koden):

Kod: Markera allt

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity test1 is
    Port ( clk : in  STD_LOGIC;
           y   : out STD_LOGIC);
end test1;

architecture Behavioral of test1 is
signal count : integer range 0 to 50000002; -- 50M 26bitar
begin

testit: process (clk)
begin
   if rising_edge(clk) then
      count <= count + 1;
      if count = 25000000 then
          y <= '1';
      elsif count = 50000000 then
	  y <= '0';
	  count <= 0;
      end if;
   end if;
end process testit;

end Behavioral;
--(försvann min fina indentering nuigen)
----
i ucf (om de går att skriva såhär)

NET "clk" LOC = "T9";
NET "y" LOC = "K12";


lycka till
//ch
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

jo det borde funka (ska testa sen)... men vad är då meningen med TIMESPEC kommandot i .ucf filen? läste förut om att Spartan 3 hade "DCM" som var någon form av PLL så man kunde dela och öka klockan lite hur man ville utan det skulle kosta några grindar men jag förstod inte riktigt hur dom användes...
Skriv svar