Sida 1 av 2
tilldela pinnar till Xilinx FPGA...
Postat: 8 april 2006, 16:09:35
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)
Postat: 8 april 2006, 16:21:25
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";
Postat: 8 april 2006, 17:03:04
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";
?
Postat: 8 april 2006, 17:08:01
av rehnmaak
Det ska väl kunna fungera....
Postat: 8 april 2006, 17:29:14
av thepirateboy
Har du inte ett grafiskt gränssnitt i Webpack eller använder du nåt annat?
Postat: 9 april 2006, 14:35:10
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?
Postat: 9 april 2006, 15:05:00
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;
Postat: 9 april 2006, 15:13:36
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.
?
Postat: 9 april 2006, 15:18:36
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"
Postat: 9 april 2006, 15:28:47
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...
Postat: 9 april 2006, 15:39:44
av rehnmaak
Du har glömt att tilldela clka en pinne...
Postat: 9 april 2006, 15:45:25
av Seven11
okej... hur går man det? och vilken pinne ska man välja?
Postat: 9 april 2006, 15:50:04
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.
Postat: 9 april 2006, 22:43:36
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
Postat: 10 april 2006, 17:27:32
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...