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.

[VHDL]Symulacja układu. Układ mnożący pracuje na dwa sposoby

24 Lip 2010 23:03 1989 2
  • Poziom 9  
    Witam

    Mam zaprojektowany układ który wykonuje mnożenie z wykorzystaniem potoków. Układ zaprojektowany na podstawie przykładu ze strony Xilinxa (Link).
    Code:
    library IEEE;
    
    use IEEE.STD_LOGIC_1164.all;

    library IEEE_PROPOSED;
    use IEEE_PROPOSED.FIXED_FLOAT_TYPES.all;
    use IEEE_PROPOSED.FIXED_PKG.all;

    use work.HECA_defs.all;

    entity MULT is
      generic(
        A_HIGH : integer;
        A_LOW  : integer;
        B_HIGH : integer;
        B_LOW  : integer
      );
      port (
        Clk: in STD_LOGIC;
        A  : in STD_LOGIC_VECTOR;
        B  : in STD_LOGIC_VECTOR;
        Res: out STD_LOGIC_VECTOR
      );
    end MULT;

    architecture MULT_arch of MULT is         
      constant LEVELS  : integer := 2;
      constant RES_LOW : integer := min(A_LOW, B_LOW);
    --------------------------------------------------------------------------------
      type pipeline_registers is array (LEVELS-1 downto 0) of sfixed(
          sfixed_high(A_HIGH, A_LOW, '*', B_HIGH, B_LOW)
          downto sfixed_low(A_HIGH, A_LOW, '*', B_HIGH, B_LOW));
    --------------------------------------------------------------------------------
      signal sA       : sfixed(A_HIGH downto A_LOW);
      signal sB       : sfixed(B_HIGH downto B_LOW);
      signal pipeline : pipeline_registers;
    begin
      Res <= to_slv(resize(pipeline(LEVELS-1), pipeline(LEVELS-1)'high, RES_LOW,
                    fixed_wrap, fixed_truncate));

      process(Clk)
      begin
        if rising_edge(Clk) then
          sA <= to_sfixed(A, A_HIGH, A_LOW);
          sB <= to_sfixed(B, B_HIGH, B_LOW);
         
          pipeline(0) <= sA*sB;
         
          for i in 1 to LEVELS-1 loop
            pipeline(i) <= pipeline(i-1);
          end loop;
        end if;
      end process;
    end MULT_arch;

    Układ ten wykorzystuję, w różnych modułach projektu.
    W trakcie symulacji (Active-HDL 7.2) tych modułów zauważyłem, iż układ mnożący pracuje na dwa lekko różne sposoby. W jednym przypadku dane na sygnałach sA i sB dostępne są w drugim cyklu zegarowym, a w drugim przypadku dane dostępne są dopiero w tym samym cyklu zegarowym.
    [VHDL]Symulacja układu. Układ mnożący pracuje na dwa sposoby
  • VIP Zasłużony dla elektroda
    Zauważ, że sytuacja dotyczy tylko przejścia z A do sA w drugim module (w tym samym module jest opóźnienie jednego cyklu pomiędzy B i sB).

    Podejrzewam, że jest to symulacja behawioralna - może jest tutaj problem z jednoczesnym generowaniem i odczytem danych (na tym samym zboczu) przy zerowym opóźnieniu?

    Próbowałeś symulować na innym etapie (np. post-synthesis)?

    Pozdrawiam,
    Dr.Vee
  • Poziom 9  
    W drugim przypadku z symulacji nie ma opóźnienia dla odczytu wartości sygnału sB. Dane do sygnałów przypisywane są na zboczu narastającym, a symulacja rozpoczęta jest od wartości 0 na Clk.
    Oba układy z symulacji to jednostka MULT przedstawiona w pierwszym poście więc ta rozbieżność zachowania jest dla mnie dziwna bo to ciągle ten sam kawałek kodu.

    Przeprowadziłem dzisiaj jeszcze pewne testy i zauważyłem jedną rzecz. Zachowanie jednostki MULT zależy od tego na jakim poziomie znajduje się jej instancja.
    W pierwszym przypadku z przedstawionej symulacji jest to poziom drugi:
    Matrix_MULT -> CELL_CALC -> MULT
    W drugim przypadku jest to poziom pierwszy:
    iQuant -> MULT