Problem z VHDL - podczas optymalizacji

Jul 04, 2006 3 Replies

Witam, dlaczego podczas optymalizacji są usuwane wszystkie wejścia (zostaje tylko 8 wyjść)?


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


entity MostekA is Port ( MOSI : in STD_LOGIC; MISO : out STD_LOGIC; SCLK : in STD_LOGIC; CS : in STD_LOGIC; D : inout STD_LOGIC_VECTOR (7 downto 0); A : out STD_LOGIC_VECTOR (11 downto 0); ETH_RD : out STD_LOGIC; ETH_WR : out STD_LOGIC; ETH_RST : out STD_LOGIC; MEM_WE : out STD_LOGIC; MEM_RAS : out STD_LOGIC; MEM_CAS : out STD_LOGIC; MEM_OE : out STD_LOGIC; PHE_RD : out STD_LOGIC; PHE_WR : out STD_LOGIC); end MostekA;



architecture Behavioral of MostekA is signal shift_reg : std_logic_vector(7 downto 0); begin



process(SCLK) begin if (SCLK'EVENT and SCLK = '1') then shift_reg(7 downto 1)<= shift_reg(6 downto 0); shift_reg(0)<=MOSI; end if; end process; process(CS) begin if (CS'EVENT and CS = '1') then shift_reg<="00000000"; end if; end process;



D <= shift_reg;



end Behavioral;


Pozdrawiam MD


Maksymilian Dutka napisał(a):

Jakim cudem to przechodzi syntezę? Sygnał 'shift_reg' jest przypisywany w dwóch różnych procesach, na zboczach dwóch różnych sygnałów. Tak nie można.

ae

Andrzej Ekiert napisał(a):

:D

Dopiero się uczę VHDL-a, wieczorkiem to przerobie.

Dziękuje i pozdrawiam MD

... /ciach/ ...

Widzę że na zboczu narastającym SCLK robisz jakąś operację na shift_reg i na zboczu narastającym CS też robisz jakąś operację na tym samym rejestrze. A co jeśli zdarzenia te wystąpią równocześnie? Takie rozwiązanie jest bez sensu. Może syntezator gdzieś się gubi i dlatego eliminuje wejścia.

Widzę że usiłujesz zrobić jakiś rejestr o wyjściu równoległym, który będziesz ładować szeregowo przez SPI. To może załóżymy że shift_reg przepiszemy na wyjście na skutek zbocza narastającego CS które nastąpi po przesłaniu wszystkich bitów danych:

process(SCLK, CS) begin if rising_edge(SCLK) then shift_reg(7 downto 1) <= shift_reg(6 downto 0); shift_reg(0) <= MOSI; end if;

if rising_edge(CS) then D <= shift_reg; end if; end process;

Rozwiązanie to prawdopodobnie pożre 2 globalne linie zegarowe. Dobrze jest zastanowić się czy nie możnaby próbkować CS podczas aktywnych zboczy SCLK, wtedy będzie jeden zegar:

process(SCLK, CS) begin if rising_edge(SCLK) then if CS = '1' then D <= shift_reg; else shift_reg(7 downto 1) <= shift_reg(6 downto 0); shift_reg(0) <= MOSI; end if; end if; end process;

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required