Implementacja w VHDL, sygnał zegarowy

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

Reply to
Jarek
Loading thread data ...

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.

Reply to
jerry1111

Użytkownik "jerry1111" <stop_this_spam_jerry1111 snipped-for-privacy@remove.wp.pl>

napisał w wiadomości news: snipped-for-privacy@4ax.com...

Niestety linie uP_AD nie są stabline podczas całego okresu uP_ALE='0' więc powyższa propozycja nie zadziała.

Nie procesor działa z innym zegaram niż układ FPGA

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

Reply to
Jarek

Ale chyba sa stabline na ktoryms zboczu - nie?

To podlacz zegar proca do FPGA - Spartan-2 ma 4 wejscia zegarowe

A z problemow tez sobie zdajesz sprawe? Cytat z pamieci z grupy fpga: "Uklady asynchroniczne robia tylko projektanci z bardzo duzym doswiadczeniem i nowicjusze".

Bo taka jest struktura polaczen FPGA - AFAIR na siec globalna mozesz wejsc tylko z wejscia zegarowego albo z DLL.

Pozdr. Dz.

Reply to
Dziadek

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;

Reply to
toady

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.