Jarek
Guest
Sat May 08, 2004 1:22 pm
Witam
Mam problem z implementacją układu opisanego w VHDLu gdy jeden z sygnałów
wykorzystywanych jako zegar NIE jest podłączny do linii zegara globalnego
(SPARTAN II XC2S50).
Poniższy fragment programu ma służyć do zatrzaskiwania młodszej części
adresu z multipleksowanej szyny adres/dane mikrokontrolera 8051.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Test is
Port (
uP_DA: in std_logic_vector (7 downto 0); -- dane adres z uP
uP_ALE: in std_logic; -- sygnal ALE z uP
(NIE jest podłączony do jednej z globalnych lini CLK)
SEG: out std_logic_vector (7 downto 0) -- wyswietlacz
);
end Test;
architecture Behavioral of Test is
signal ale_n: std_logic;
begin
ale_n <= uP_ALE;
LACH_ADDR: process (ale_n)
begin
if (ale_n'event and ale_n = '0') then
SEG(7 downto 0) <= uP_DA (7 downto 0);
end if;
end process;
end Behavioral;
niestety podczas procesu implementacji otrzymuję błąd
Using target part "2s50tq144-5".
ERROR:MapLib:93 - Illegal LOC on IPAD symbol "uP_ALE" or BUFGP symbol
"uP_ALE_BUFGP" (output signal=uP_ALE_BUFGP), IPAD-IBUFG should only be LOCed
to GCLKIOB site.
natomiast poniższy przykład implementuje się już poprawnie.
Zmieniono jedynie:
ale_n <= uP_ALE; na ale_n <= uP_ALE and NOTHING; gdzie linia
NOTHING zawsze w stanie '1'.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Test is
Port (
NOTHING: in std_logic;
uP_DA: in std_logic_vector (7 downto 0); -- dane adres z uP
uP_ALE: in std_logic; -- sygnal ALE z uP
(NIE jest podłączony do jednej z globalnych lini CLK)
SEG: out std_logic_vector (7 downto 0) -- wyswietlacz
);
end Test;
architecture Behavioral of Test is
signal ale_n: std_logic;
begin
ale_n <= uP_ALE and NOTHING;
LACH_ADDR: process (ale_n)
begin
if (ale_n'event and ale_n = '0') then
SEG (7 downto 0) <= uP_DA (7 downto 0);
end if;
end process;
end Behavioral;
Pozdrwiam
Jarek
jerry1111
Guest
Mon May 10, 2004 10:24 am
On Sat, 8 May 2004 16:22:57 +0200, "Jarek" <lab@televox.pl> wrote:
Quote:
Witam
Mam problem z implementacją układu opisanego w VHDLu gdy jeden z sygnałów
wykorzystywanych jako zegar NIE jest podłączny do linii zegara globalnego
(SPARTAN II XC2S50).
Prawidlowo - sygnaly zegarow i resetow sa puszczane w srodku scalaka
dedykowanymi liniami (maly czas propagacji, duzy fanout). Dlatego
zegary i resety musza byc na dedykowanych pinach.
Dlaczego uzywasz ALE jako zegar? Nie lepiej zrobic tak:
if(rising_edge(clk)) then
if(ALE='0') then
SEG(7 downto 0)<=uP_DA(7 downto 0);
end if;
end if;
CLK - to ten sam zegar, co procka.
Poza tym w drugim przykladzie uzywasz bramkowania zegara (gated
clock). Nie nalezy tego stosowac tez ze wzgledu na dedykowane linie
zegarowe. Poza tym w przypadku gated clock otrzymasz f_max ukladu
np: 1MHz zamiast 100MHz :-)
Generalna zasada to jest robienie ukladow _synchronicznych_. Jesli
robisz inaczej, to BARDZO DOKLADNIE musisz wiedziec co robisz, bo
uklad bedzie dzialac tak jak chce, a nie tak jak chce projektant.
--
Jerry
Jarek
Guest
Tue May 11, 2004 11:50 am
Użytkownik "jerry1111" <stop_this_spam_jerry1111_remove@remove.wp.pl>
napisał w wiadomości news:h8pu90llvp6rdt3g1innioilv2kqt7fcm5@4ax.com...
Quote:
On Sat, 8 May 2004 16:22:57 +0200, "Jarek" <lab@televox.pl> wrote:
Witam
Mam problem z implementacją układu opisanego w VHDLu gdy jeden z sygnałów
wykorzystywanych jako zegar NIE jest podłączny do linii zegara globalnego
(SPARTAN II XC2S50).
Prawidlowo - sygnaly zegarow i resetow sa puszczane w srodku scalaka
dedykowanymi liniami (maly czas propagacji, duzy fanout). Dlatego
zegary i resety musza byc na dedykowanych pinach.
Dlaczego uzywasz ALE jako zegar? Nie lepiej zrobic tak:
if(rising_edge(clk)) then
if(ALE='0') then
SEG(7 downto 0)<=uP_DA(7 downto 0);
end if;
end if;
Niestety linie uP_AD nie są stabline podczas całego okresu uP_ALE='0' więc
powyższa propozycja nie zadziała.
Quote:
CLK - to ten sam zegar, co procka.
Nie procesor działa z innym zegaram niż układ FPGA
Quote:
Poza tym w drugim przykladzie uzywasz bramkowania zegara (gated
clock). Nie nalezy tego stosowac tez ze wzgledu na dedykowane linie
zegarowe. Poza tym w przypadku gated clock otrzymasz f_max ukladu
np: 1MHz zamiast 100MHz :-)
Generalna zasada to jest robienie ukladow _synchronicznych_. Jesli
robisz inaczej, to BARDZO DOKLADNIE musisz wiedziec co robisz, bo
uklad bedzie dzialac tak jak chce, a nie tak jak chce projektant.
Jerry
Zdaję sobie sprawę z tego iż łączę dwa układy o różnych CLK.
Bardziej chodziło mi wyjaśnienie dlaczego w jednym przypadku układ może być
zaimplementowany a w drugim nie pomimo że w obu przypadkach sygnał uP_ALE
nie jest podłączony do dedykowanego zegara.
Pozdrawiam
Jarek
Dziadek
Guest
Wed May 12, 2004 6:01 am
Quote:
Niestety linie uP_AD nie są stabline podczas całego okresu uP_ALE='0'
więc
powyższa propozycja nie zadziała.
Ale chyba sa stabline na ktoryms zboczu - nie?
Quote:
Nie procesor działa z innym zegaram niż układ FPGA
To podlacz zegar proca do FPGA - Spartan-2 ma 4 wejscia zegarowe
Quote:
Zdaję sobie sprawę z tego iż łączę dwa układy o różnych CLK.
A z problemow tez sobie zdajesz sprawe? Cytat z pamieci z grupy fpga:
"Uklady asynchroniczne robia tylko projektanci z bardzo duzym doswiadczeniem
i nowicjusze".
Quote:
Bardziej chodziło mi wyjaśnienie dlaczego w jednym przypadku układ może
być
zaimplementowany a w drugim nie pomimo że w obu przypadkach sygnał uP_ALE
nie jest podłączony do dedykowanego zegara.
Bo taka jest struktura polaczen FPGA - AFAIR na siec globalna mozesz wejsc
tylko z wejscia zegarowego albo z DLL.
Quote:
Pozdrawiam
Jarek
Pozdr.
Dz.
toady
Guest
Wed May 12, 2004 6:28 am
Quote:
Mam problem z implementacją układu opisanego w VHDLu gdy jeden z sygnałów
wykorzystywanych jako zegar NIE jest podłączny do linii zegara globalnego
(SPARTAN II XC2S50).
Masz 4 wejscia zegarowe w Spartanie, wiec podlacz sygnał ALE na jedno z
nich.
A potem musisz z komponentów wewn. utworzyć taki łańcuszek:
ALE_PIN -> IBUFG -> ewentualnie CLOCKDLL -> BUFG
-> sygnał ALE dostępny w projekcie
U mnie to wyglada tak:
entity ...
ALE_PIN : in std_logic; -- address latch
architecture ...
component IBUFG
port (I: in std_logic; O: out std_logic);
end component;
component BUFG
port (I: in std_logic; O: out std_logic);
end component;
signal ALE_SIG : std_logic;
signal ALE : std_logic;
begin
-- ALE signal
ALE_PAD: IBUFG port map (I=>ALE_PIN, O => ALE_SIG );
ALE_BUFG: BUFG port map (I=>ALE_SIG, O=>ALE);
-- Multiplexed address/data bus - latch address
Address_mux: process (ALE)
begin
if falling_edge(ALE) then
ADR_MUX <= LD_IN(15 downto 0);
end if;
end process;
--
pozdrawiam
toady