VHDL - checa przy symulacji

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;

Reply to
stchebel
Loading thread data ...

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.

Reply to
Jakub Rakus

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

Nie pomogło.

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

Reply to
stchebel

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

Reply to
MiSter

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

Reply to
Jakub Rakus

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.