VHDL - checa przy symulacji

May 23, 2015 4 Replies

Napisałem kawałek kodu do obliczania C=|A-B|, gdzie A,B,C to 11 bitowe liczby bez znaku. Liczy dobrze, ale przy symulacji behawioralnej wynik pojawia się na opadającym zboczu zegara.Za cholerę nie wiem dlaczego?! Poniżej kod:



library IEEE; use IEEE.STD_LOGIC_1164.ALL;



library UNISIM; use UNISIM.VComponents.all;



entity amod is



Port ( A : in STD_LOGIC_VECTOR (10 downto 0); B : in STD_LOGIC_VECTOR (10 downto 0); CLK : in STD_LOGIC; C : out STD_LOGIC_VECTOR (10 downto 0)); end amod;



architecture Behavioral of amod is signal Cs:std_logic_vector(11 downto 0); begin



process(CLK,A,B) begin if CLK'event and CLK='1' then Cs<=std_logic_vector(to_unsigned(abs(to_integer(signed('0'&A))-to_integer(signed('0'&B))),12)); end if; C<=Cs(10 downto 0); end process;



end Behavioral;


Jeśli działanie jest synchronizowane zegarem to po co na liście czułości procesu dajesz A i B? Zamiast CLK'event and CLK='1 daj rising_edge(CLK). Gdzieś czytałem, że wbrew pozorom nie zawsze to zadziała tak samo. C<=Cs(10 downto 0); wywal poza proces. Albo Cs zrób jako variable wewnątrz procesu.

Faktycznie masz rację. Zrobiłem to z rozpędu.

Nie pomogło.

Pomogło, ale dalej nie kojarzę dlaczego w oryginalnej wersji takie jaja.

W sprzęcie by zadziałało poprawnie, w symulacji przypisanie następuje w następnej delcie... Takie przypisania robi się w procesie współbieżnym, czyli na zewnątrz lub jako variable jak zasugerował kolega Jakub.

Pozdrawiam MiSter

I racja, kolega fachowo wytłumaczył z podstawami teoretycznymi, bo ja to tylko praktyk w tej dziedzinie jestem.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required