Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Symulacja shiftera PISO w ISE 9.2

23 Wrz 2009 09:39 2105 12
  • Poziom 10  
    Witam wszystkich!!!

    Ostatnio uczę się symulować wyniki to co napisałem w VHDL-u. Wychodzi to z różnym skutkiem :| no ale do rzeczy. Poniżej przedstawiam kod jednostki którą zaprojektowałem. Ma to być rejestr przesuwny PISO (równolegle-szeregowy)

    cnt.vhd
    Code:

    -----------------------------------------------------------
    entity cnt is
        Port ( reset : in  STD_LOGIC;
               enable : in  STD_LOGIC;
               clk : in  STD_LOGIC;
               we : in  STD_LOGIC_VECTOR (3 downto 0);
               wy : out  STD_LOGIC);
    end cnt;

    architecture Behavioral of cnt is

    signal tmp : STD_LOGIC_VECTOR (3 downto 0);

    begin

    process (clk)
    begin

    if reset = '1' then
       tmp <= "0000";
    elsif clk'event and clk = '1' then
       if enable = '1'  then
          tmp <= we;
       else
          tmp <= tmp ( 3 downto 1 ) & '0';
       end if;
       wy <= tmp(3);
    end if;

    end process;

    end Behavioral;
    -------------------------------------------------------------------
    test bench
    -------------------------------------------------------------------
    LIBRARY ieee;
    USE ieee.std_logic_1164.ALL;
    USE ieee.std_logic_unsigned.all;
    USE ieee.numeric_std.ALL;

    ENTITY fd_vhd IS
    END fd_vhd;

    ARCHITECTURE behavior OF fd_vhd IS

       -- Component Declaration for the Unit Under Test (UUT)
       COMPONENT cnt
       PORT(
          reset : IN std_logic;
          enable : IN std_logic;
          clk : IN std_logic;
          we : IN std_logic_vector(3 downto 0);         
          wy : OUT std_logic
          );
       END COMPONENT;

       --Inputs
       SIGNAL reset :  std_logic := '1';
       SIGNAL enable :  std_logic := '1';
       SIGNAL clk :  std_logic := '0';
       SIGNAL we :  std_logic_vector(3 downto 0) := "0110";

       --Outputs
       SIGNAL wy :  std_logic;

    BEGIN

       -- Instantiate the Unit Under Test (UUT)
       uut: cnt PORT MAP(
          reset => reset,
          enable => enable,
          clk => clk,
          we => we,
          wy => wy
       );

       tb : PROCESS
       BEGIN

       
          wait for 100 ns;
          reset <= '1';
          wait for 100 ns;
          reset <= '0';
          wait for 100 ns;
          enable <= '1';
          wait for 100 ns;
          enable <= '0';
       
          for inx in 0 to 50 loop
          wait for 100 ns;
          clk <= '1';
          wait for 100 ns;
          clk <= '0';
          end loop;

       END PROCESS;

    END;
    -------------------------------------------------------------------------

    Przebiegi czasowe

    Symulacja shiftera PISO w ISE 9.2

    W początkowej fazie jest stan nie zainicjowany który poniekąd wiem jak zainicjować bo robiłem to resetem... ok ale co dalej jak wyjście nie chce się wzbudzić ...

    Gdzie leży błąd w test benchu czy w kodzie źródłowym ???

    Pozdrawiam

    Dodałem znaczniki [code].
    [zumek]
  • Poziom 30  
    Witam,

    Pierwszy błąd jaki znalazłem to
    Code:

    tmp <= tmp ( 3 downto 1 ) & '0';


    odpowiada to podstawieniem:
    tmp(3)=tmp(3);
    tmp(2)=tmp(2);
    tmp(1)=tmp(1);
    tmp(0)='0';

    więc nie wykonujesz przesunięcia.
    Powinno być:
    Code:

    tmp <= tmp ( 2 downto 0 ) & '0';


    Pozdrawiam
    JarekC
  • Poziom 10  
    OK to poprawiłem ale dalej jest problem
    Code:

    ---------------------------------------------------------
    process (clk)
    begin

    if reset = '1' then
       tmp <= "0000";
       wy <= '0';
    elsif clk'event and clk = '1' then
       if enable = '1'  then
          tmp <= we;
       else
          [b]tmp <= tmp ( 2 downto 0 ) & '0';[/b] --- poprawione z tmp <= tmp ( 3 downto 1 ) & '0';
       end if;
       wy <= tmp(3);
    end if;

    end process;

    --------------------------------------------------------
    test bencz

    ---------sygnały ustawiłem------------------
    --Inputs
       SIGNAL reset :  std_logic := '1';
       SIGNAL enable :  std_logic := '1';
       SIGNAL clk :  std_logic := '0';
       [b]SIGNAL we :  std_logic_vector(3 downto 0) := "0110";[/b] -- ustwaiłem stan początkowy sześć binarnie

       --Outputs
       SIGNAL wy :  std_logic;
    ------------------------------------------

    ---------process sterujący--------------
    tb : PROCESS
       BEGIN

          wait for 100 ns;
          reset <= '1';
          wait for 100 ns;
          reset <= '0';
          wait for 100 ns;
          enable <= '1';
          wait for 100 ns;
          enable <= '0';

          -- Place stimulus here
          for inx in 0 to 50 loop
          wait for 100 ns;
          clk <= '1';
          wait for 100 ns;
          clk <= '0';
          end loop;


          wait; -- will wait forever
       END PROCESS;
    ------------------------------------------


    ale dalej nic nie drgnie na wyjściu a może coś w test benchu ??

    :cry:

    Dodałem znaczniki [code].
    [zumek]
  • Pomocny post
    Poziom 30  
    Tym razem pomyłka w testbench.
    Inicjujesz sygnał we "0110" ale nie wpisujesz go do rejestru (tmp), tmp ma cały czas
    wartość "0000" - Brak impulsu clk przy aktywnym sygnale enable.
    Dodaj sobie do wykresów sygnal tmp.

    Pozdrawiam
    JarekC
  • Poziom 10  
    Dziękuje bardzo ;) dzięki takim podpowiedziom udało mi sie zrobić następny kok w nauce VHDL -a.. W końcu zaskoczyłem jak sterować sygnałami do końca...
    Dziękuje bardzo...

    A teraz co zrobić aby nie było stanu 'u' na początku próbowałem go wyeliminować resetem ale lipa... enable tez??

    Symulacja shiftera PISO w ISE 9.2
  • Poziom 30  
    A który kod symulujesz:
    ten
    Code:

    if reset = '1' then
    tmp <= "0000";
    wy <= '0';
    elsif clk'event and clk = '1' then
    if enable = '1' then
    tmp <= we;
    else
    tmp <= tmp ( 2 downto 0 ) & '0';
    end if;
    wy <= tmp(3);
    end if;


    czy ten
    Code:

    if reset = '1' then
    tmp <= "0000";
    elsif clk'event and clk = '1' then
    if enable = '1' then
    tmp <= we;
    else
    tmp <= tmp ( 2 downto 0 ) & '0';
    end if;
    wy <= tmp(3);
    end if;


    różnica to zerowanie wy przy resecie.

    Przypisanie wy<=tmp(3) wewnątrz procesu (sterowanego clk) powoduje że
    na wyjściu masz dodatkowy przerzutnik.

    Może nie zauważyłeś ale w drugim przykładzie wy jest dopiero zmieniana przy
    pierwszej zmiana clk.
    W pierwszym przykładzie wy posiada dodatkowy reset asynchroniczny.

    Jeżeli chcesz aby wy było po prostu wyprowadzonym na zewnątrz stanem tmp(3)
    to przypisanie wy<=tmp(3) daj na zewnątrz procesu.

    Najlepiej po syntezie obejrzyj sobie schemat RTL (opcja View RTL Schematic).

    Czasami przed symulacją warto uruchomić Clean Project Files z zakładki Project.

    Pozdrawiam
    JarekC
  • Poziom 10  
    Już sie tak zapętliłem w tym pisaniu że sam nie zauważyłem że usunąłem na resecie
    wy <= '0'; dodałem do resetu i jest wzorcowo. Dziękuje
    Teraz mogę zacząć go do rozbudowywać dalej ... jeszcze raz dziękuje...
  • Poziom 10  
    Witam Ponownie :)

    może ktoś z was pomoże mi bo nie mogę czegoś zrozumieć
    Code:

    signal reg : STD_LOGIC_VECTOR (4 downto 0);

    begin

    process(clk)
    begin

    if reset = '1' then
      reg <= "00000";
    elsif clk'event and clk = '1' then
       if INIT = '1' then
        if Modin = '1' then
          reg <= reg + "0101";
        end if;
       [b]reg <= reg (4 downto 1) & '0'; [/b]
      end if;
    end if;
    end process;

    Q <= reg (4 downto 1);
    Modout <= reg (0);
       
    end Behavioral;


    nie wiem dlaczego po dodaniu pogrubionej linii kodu a chce aby wektor został przesunięty o jeden bit nie wpisuje sie ona do rejestru reg w ogóle ...
    Prześledziłem to zależnościach czasowych i lipa :(
    jeśli usunę toą linie to działa...
  • Poziom 30  
    Witam,

    Jeżeli ma nastąpić przesunięcie to znowu popełniłeś ten sam błąd:

    jest
    Code:

    reg <= reg (4 downto 1) & '0';

    powinno być:
    Code:

    reg <= reg (3 downto 0) & '0';


    Co ma robić twój kod?
    Czy przy Modin=1 miało nastapić dodanie 5 i przesunięcie o jeden bit w lewo a przy
    Modin=0 ma nastąpić tylko przesunięcie?
    Jeżeli tak to ten kod tego nie zrealizuje. To nie jest język C i tutaj instrukcje
    w procesie są wykonywane współbieżnie a nie sekwencyjnie.

    UWAGA: umieszczaj kod w znacznikach code.

    Pozdrawiam
    JarekC
  • Poziom 10  
    Przy Modin = 1 ma nastąpić dodanie 5 i przesunąć o jeden bit ale w prawo.
    Próbowałem dwie poniższe kombinacje ale nie powiodło się

    Code:
    reg <= reg (4 downto 1) & '0';


    lub

    Code:
     reg <= '0' & reg (4 downto 1) ;


    a jak modin = 0 to tylko przesuwać w prawo.

    Lecz kompilator nie zgłasza błędu. Tylko nie wpisuje wartości żądanej do rejestru REG

    dziękuje za podpowiedz z tym znacznikiem kod faktycznie bardziej czytelniejsze


    tak sobie teraz dopieo uzmysłowiłem a może zrobić maszynę stanów ??
  • Poziom 30  
    Witam,

    Sprawdź taki kod, powinien działać.
    Jak zadziała to poczytaj o różnicy pomiędzy signal a variable także o tym
    co to jest współbieżność w procesie.


    Code:

    signal reg : STD_LOGIC_VECTOR (4 downto 0);

    begin

    process(clk)

    variable v_reg : STD_LOGIC_VECTOR (4 downto 0);

    begin

     if reset = '1' then
       reg <= "00000";
     elsif clk'event and clk = '1' then
       if INIT = '1' then
         if Modin = '1' then
           v_reg := reg + "00101";
         else
           v_reg := reg;
        end if;

        reg <= '0' & v_reg (4 downto 1);

      end if;
     end if;
    end process;

    Q <= reg (4 downto 1);
    Modout <= reg (0);


    Pozdrawiam
    JarekC
  • Poziom 10  
    Dziękuje twój kod działa. Popatrzyłem na twój kod dostosowałem do moich potrzeb i dział... przynajmniej tak wynika z przebiegów czasowy w następnym tygodniu sprawdzę to w a płycie czy przebiegi czasowe pokrywają się z pracą fizyczna ...
    Następne pytanie:

    Jak zamienić mój kod w VHDL-u / Verilog-u na jeden bloczek (symbol) w schematic-u... bo muszę przyznać że pisanie jednego pliku łączącego w VHDL-u jest uciążliwe i można często się pomylić czy łączeniu sygnałów... A schematic ułatwia sprawę :)
  • Poziom 30  
    Niestety tu ci nie pomogę, nie używam schematów, zawsze całość piszę w VHDLu.

    Pozdrawiam
    JarekC