Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

VHDL generator impulsów... / błąd : MultiSource on Integers

xyspokusa
-
-
Posty:3
Rejestracja:16 sty 2008, o 19:31
Lokalizacja:Bydgoszcz
VHDL generator impulsów... / błąd : MultiSource on Integers

Postautor: xyspokusa » 16 sty 2008, o 19:37

witam, chialbym napisać w VHDL i skompilować program, który będzie
generować 3, 6 albo 9 impulsów w zaleznosci od 2-bitowego sygnału wejsciowego. generacja nastepuje po wygaśnięciu sygnału START.


napisałem, ale nie działa. z góry dziękuje za pomoc i wskazówki :)
/w Xilinku: Check syntax kompiluje,
ale assign pins - pokazuje mi sie bład :
MultiSource on Integers in Concurrent Assignment., przy rozpoczeciu drugiego procesu.

Kod: Zaznacz cały

library IEEE; use IEEE.std_logic_1164.all; entity TYP is port ( clock : in std_logic ; a : in BIT_VECTOR (0 to 1); start : in bit; y : out bit); end entity TYP; architecture GENERATOR of TYP is type state is (s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18); signal present_state, next_state : state; signal czekac : bit; -- czekac='1' -- automat jest w trakcie generowania impulsow begin seq : process (start, clock) is -- czyli asynchroniczny start ! tak jak mialo byc begin if ( start'event and start='0' and czekac='0') then czekac <= '1'; case a is when "00" => next_state <= s0; -- stoi w miejscu czekac <= '0'; when "01" => next_state <= s13; -- wygeneruje 3 jedynek when "10" => next_state <= s7; -- wygeneruje 6 jedynek when "11" => next_state <= s1; -- wygeneruje 9 jedynek end case; elsif czekac='0' then -- czekac='0' czyli automat nie musi czekac next_state<=s0; end if; if rising_edge(clock) then present_state <= next_state; end if; end process seq; com : process (present_state) is begin y<='0'; case present_state is when s0 => -- zapetla sie tu. y<='0'; -- next_state <=s0 -- to nie nadmiarowosc, bo i tak to robi when s1 => y<='1'; -- pierwsza "jedynka" next_state<=s2 ; -- dla a=00 -> leci od poczatku when s2 => y<='0'; next_state<=s3 ; when s3 => y<='1'; -- druga "jedynka" next_state<=s4 ; when s4 => y<='0'; next_state<=s5 ; when s5 => y<='1'; -- trzecia "jedynka" next_state<=s6 ; when s6 => y<='0'; next_state<=s7 ; -- dla a=10 leci od tad. i generje 6 "jedynek" when s7 => y<='1'; -- czwarta "jedynka" next_state<=s8 ; when s8 => y<='0'; next_state<=s9 ; when s9 => y<='1'; -- piata "jedynka" next_state<=s10 ; when s10 => y<='0'; next_state<=s11 ; when s11 => y<='1'; -- szosta "jedynka" next_state<=s12 ; when s12 => y<='0'; next_state<=s13 ; when s13 => y<='1'; -- siodma "jedynka" next_state<=s14 ; -- dla a=01 generuje trzy "jedynki" when s14 => y<='0'; next_state<=s15 ; when s15 => y<='1'; -- osma "jedynka" next_state<=s16 ; when s16 => y<='0'; next_state<=s17 ; when s17 => y<='1';-- osma "jedynka" next_state<=s18 ; when s18 => y<='0'; next_state<=s0 ; -- na koniec wraca do s0 end case; end process com; end architecture GENERATOR;
Ostatnio zmieniony 16 sty 2008, o 21:36 przez xyspokusa, łącznie zmieniany 1 raz.

ziggy
-
-
Posty:25
Rejestracja:2 cze 2006, o 21:44
Lokalizacja:Podkarpacie
Kontaktowanie:

Postautor: ziggy » 17 sty 2008, o 11:59

Zwróć uwagę, że sygnał next_state sterujesz z obydwu procesów: sekwencyjnego i kombinacyjnego. Tu jest problem. Proponuję w pierwszym (sekwencyjnym) procesie zamienić next_state na present_state. Teraz prawdopodobnie (nie sprawdzałem) tego błędu zgłaszać nie będzie, ale w tym kodzie widzę więcej problemów (w sensie sposobu działania). Wątpliwości budzi np. użycie sygnału czekać. Rozumiem, że zgodnie z warunkami zadania, sygnał ten powinien mieć wartość 1 jeżeli automat jest w trakcie generowania sekwencji impulsów. W Twoim kodzie tak nie będzie. Poza tym typowy sposób opisu procesu sekwencyjnego z asynchronicznym ustawianiem (zerowaniem) powinien wyglądać mniej więcej tak:

Kod: Zaznacz cały

... if (start'event and start='0') then -- ewentualnie teraz: if czekac='0' then ... end if; elsif (clock'event and clock='1') then present_state <= next_state; end if; ....
Ale oczywiście VHDLa używam mniej niż sporadycznie (Verilog jest lepszy :611: ) więc mogłem coś tu wyrazić nieściśle :610:

rafszym
-
-
Posty:44
Rejestracja:4 gru 2007, o 12:39
Lokalizacja:Warszawa

Postautor: rafszym » 17 sty 2008, o 18:23

pozwoliłem sobie na trochę zmian...
powinno działać, nie robiłem symulacji ale implementacja w ISE 8.2 dla Spartan3 przechodzi...

Kod: Zaznacz cały

library IEEE; use IEEE.std_logic_1164.all; entity TYP is port ( clock : in std_logic ; a : in std_logic_vector(0 to 1); start : in std_logic; y : out std_logic; reset : in std_logic); end entity TYP; architecture GENERATOR of TYP is type state is (s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18); signal present_state, next_state : state; signal stop, generuj : std_logic; begin process(reset,start,stop) -- sterowanie wyzwoleniem generacji impulsow begin if reset='1' then generuj<='0'; elsif stop='1' then generuj<='0'; elsif falling_edge(start) then generuj<='1'; end if; end process; process(clock) -- ustawienie stanów poczatkowych i przejsci do nastepnych stanow begin if reset='1' then present_state <= s0; elsif generuj='0' then case a is when "00" => present_state <= s0; -- stoi w miejscu when "01" => present_state <= s13; -- wygeneruje 3 jedynek when "10" => present_state <= s7; -- wygeneruje 6 jedynek when others => present_state <= s1; -- wygeneruje 9 jedynek end case; elsif rising_edge(clock) then present_state <= next_state; end if; end process; com : process (present_state) is begin -- y<='0'; nie potrzeba, po resecie mamy stan s0 a ten ustawia y<='0' case present_state is when s0 => -- zapetla sie tu. y<='0'; stop<='0'; next_state <=s0; -- to nie nadmiarowosc, bo i tak to robi when s1 => stop<='0'; y<='1'; -- pierwsza "jedynka" next_state<=s2 ; -- dla a=00 leci od poczatku when s2 => stop<='0'; y<='0'; next_state<=s3 ; when s3 => stop<='0'; y<='1'; -- druga "jedynka" next_state<=s4 ; when s4 => stop<='0'; y<='0'; next_state<=s5 ; when s5 => stop<='0'; y<='1'; -- trzecia "jedynka" next_state<=s6 ; when s6 => stop<='0'; y<='0'; next_state<=s7 ; -- dla a=10 leci od tad. i generje 6 "jedynek" when s7 => stop<='0'; y<='1'; -- czwarta "jedynka" next_state<=s8 ; when s8 => stop<='0'; y<='0'; next_state<=s9 ; when s9 => stop<='0'; y<='1'; -- piata "jedynka" next_state<=s10 ; when s10 => stop<='0'; y<='0'; next_state<=s11 ; when s11 => stop<='0'; y<='1'; -- szosta "jedynka" next_state<=s12 ; when s12 => stop<='0'; y<='0'; next_state<=s13 ; when s13 => stop<='0'; y<='1'; -- siodma "jedynka" next_state<=s14 ; -- dla a=01 generuje trzy "jedynki" when s14 => stop<='0'; y<='0'; next_state<=s15 ; when s15 => stop<='0'; y<='1'; -- osma "jedynka" next_state<=s16 ; when s16 => stop<='0'; y<='0'; next_state<=s17 ; when s17 => stop<='0'; y<='1';-- osma "jedynka" next_state<=s18 ; when s18 => stop<='1'; -- koniec blokady y<='0'; next_state<=s0 ; -- na koniec wraca do s0 end case; end process com; end architecture GENERATOR;
pzdr.

xyspokusa
-
-
Posty:3
Rejestracja:16 sty 2008, o 19:31
Lokalizacja:Bydgoszcz

Postautor: xyspokusa » 18 sty 2008, o 20:27

witam,

zamiana next_state na present_state - jak radzi Ziggy, niestety nie dziala.
kombinowałem i jakoś średnio. jestem początkującym programistą w VHDL.

Rafszym, spoko dzieki, że zmieniłeś ten program i nie krępuj sie:)
dziekuje i pozdrawiam !

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości