RTV forum PL | NewsGroups PL

Implementacja sygnału ALE w VHDL na Spartan II XC2S50 bez podłączenia zegara

Implementacja w VHDL, sygnał zegarowy

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Implementacja sygnału ALE w VHDL na Spartan II XC2S50 bez podłączenia zegara

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

elektroda NewsGroups Forum Index - Elektronika Polska - Implementacja sygnału ALE w VHDL na Spartan II XC2S50 bez podłączenia zegara

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map