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

Licznik i inne standardowe komponenty....

mariusz102102 24 Paź 2007 19:38 1182 3
  • #1 24 Paź 2007 19:38
    mariusz102102
    Poziom 11  

    Witam,
    Zainspirowany jednym z ponizszych postow (na temat licznika, zmiennych i tak dalej) mam kilka pytan:
    1. Czy istnieje cos takiego jaka standardowa biblioteka komponetow dla VHDL (odpowiednik STL w C++). Rozumiem, ze VHDL jest jezykiem nisko poziomowym, sprzetowym, uniwersalne elementy, zazwyczaj nie sa optymalne, itp.: Ale zeby nie mozna bylo napisac kilku uniwersalnych komponentow, niezaleznych od platformy sprzetowej, parametryzowalnych itp.: typu licznik, akumulator, akumulator z przesunieciem, mux, dmux, itp., ktore kazdy moglby uzywac ... smutne.
    Jesli sie myle to prosze o linki.


    2. Jakis czas temu szukalem w sieci uniwersalnego licznika. Nie udalo sie:(. Wiec po godzinie odkrywania "Ameryki" powstal ponizszy kod. Mozliwosc parametryzowania: liczby taktow, przesuniecia (po ilu taktach od RST na liczniku pojawi sie "0"). Co na ten temat sadzicie? :)

    Code:
    library IEEE;
    
    use IEEE.STD_LOGIC_1164.all;
    use IEEE.std_logic_unsigned.all;
    use IEEE.std_logic_arith.all;


    Library CommonTools;
    use CommonTools.OthersTools.all;

    entity counterOut is
       generic
          (
          GenTactsCount : natural;
          GenOffset     : natural
          );
       port (
          RST  : in std_logic;
          CLK  : in std_logic;
          out1 : out std_logic_vector(BitsToSpan(GenTactsCount)-1 downto 0)
          );
    end counterOut;

    --}} End of automatically maintained section

    architecture counterOut of counterOut is
       function GetStartValue(A_unused:natural) return natural is
          variable ret    : natural := 0;
          variable modRes : natural := 0;
       begin
          modRes := GenOffset mod GenTactsCount;
          if modRes=0 then
             ret := 0;
          else
             ret := GenTactsCount - modRes;
          end if;
         
          assert ret<GenTactsCount
          report "counterOut GetStartValue"
          severity FAILURE;
         
          return ret;
       end function;
       
       constant CStart     : natural := GetStartValue(0);
       signal   TEMP_Q     : std_logic_vector(BitsToSpan(GenTactsCount)-1 downto 0):=(others => '0');




       constant CtactCount : std_logic_vector(BitsToSpan(GenTactsCount)-1 downto 0):=CONV_STD_LOGIC_VECTOR(GenTactsCount-1, BitsToSpan(GenTactsCount));
       constant Coffset    : std_logic_vector(BitsToSpan(GenTactsCount)-1 downto 0):=CONV_STD_LOGIC_VECTOR(CStart         , BitsToSpan(GenTactsCount));
       
    begin
       assert CStart<GenTactsCount
       report "counterOut CStart<GenTactsCount:" &natural'image(CStart) &"<"&integer'image(GenTactsCount)
       severity FAILURE;
       
       assert GenTactsCount>0
       report "counterOut GenTactsCount>0: " & integer'image(GenTactsCount)
       severity FAILURE;
       
       process(CLK)
       begin
          if rising_edge(CLK) then
             if RST = '1' then
                TEMP_Q <= Coffset;
             else
                if TEMP_Q >= CtactCount then --if (CtactCount=2^n) synthysis tool should remove this line
                   TEMP_Q <= (others => '0');
                else
                   TEMP_Q <= TEMP_Q + 1;
                end if;           
             end if;
          end if;
       end process;
       out1 <= TEMP_Q ;
    end counterOut;
    -- body function BitsToSpan from CommonTools.OthersTools.all
       function BitsToSpan(num:positive) return natural is
          variable work:natural;
       begin
          work:=num-1;
          for i in 1 to 32 loop
             work:=work/2;
             if (work=0) then return i; end if;
          end loop;
          assert true
          report "BitsToSpan: Input too large" severity FAILURE;
          return 0;
       end;

    0 3
  • #2 25 Paź 2007 00:03
    J.A
    Poziom 27  

    mariusz102102 napisał:
    Czy istnieje cos takiego jaka standardowa biblioteka
    /.../

    pewnie w sieci mozna znalezc przykladowe realizacje wszelkich 'malych'
    komponentow, jak liczniki, multipleksery itp;
    weekend w internecie i mozesz miec pelen dysk takich rozwiazan;
    w ise i quartusie sa generatory typowych funkcji;
    w zasadzie nie rozumiem o co pytasz - oczekujesz jakiejs biblioteki
    bedacej rozszerzeniem vhdl czy verilog ?
    kto mialby to zrobic /i za ile/ ?
    kazdy zespol projektowy ma swoje biblioteki, oczywiscie
    ukladow nieco bardziej rozbudowanych niz licznik;
    sa tez firmy zyjace z projektowania i sprzedazy kodu RTL popularnych
    funkcji jak ddr-ram kontrolery, usb itp;

    o samym liczniku nic nie powiem, bo daleko mi do experta od vhdl;

    J.A

    0
  • #3 25 Paź 2007 00:31
    pndemon
    Poziom 19  

    Możesz skorzystać w ISE z Core Generatora, tam masz dużą ilość komponentów, od liczników do interfaców PCI, poza tym istnieje jeszcze language templates, tam jest wszystko ładnie pokazane. Są tam z zasadzie proste konstrukcje, ale za darmo to nikt Ci nie udostępni jakiś złożonych komponentów. Po za tym też nie bardzo wiem o co Ci chodzi bo przecież napisanie licznika to jakieś 5 linijek, a do parametryzacji służy generic. Co do kodu to pomijam analizę funkcji jakie napisałeś. Szczerze mówiąc nie interesowałem się nigdy specjalnie funkcjami bo w opisywaniu sprzętu na niewiele mogą się zdać, zakładam że zajmują się sprawdzaniem poprawności wprowadzanych danych parametrycznych (przy okazji dlaczego założyłeś że nie może być licznik większy niż 32 bity). Sam licznik nie podoba mi się z kilku powodów:
    - trój reset to nie reset i tylko psuje kod
    - wprowadzasz w strukturę licznika mechanizm go resetujący, do resetowania licznika służy wejście reset w przerzutnikach
    - stosujesz nierówność

    Moja rada - zsyntezuj to i zobacz co z tego powstało, ja sprawdziłem ;]

    0
  • #4 26 Paź 2007 12:24
    [g.d.]
    Poziom 18  

    mariusz102102 napisał:

    1. Czy istnieje cos takiego jaka standardowa biblioteka komponetow dla VHDL (odpowiednik STL w C++). Rozumiem, ze VHDL jest jezykiem nisko poziomowym, sprzetowym, uniwersalne elementy, zazwyczaj nie sa optymalne, itp.: Ale zeby nie mozna bylo napisac kilku uniwersalnych komponentow, niezaleznych od platformy sprzetowej, parametryzowalnych itp.: typu licznik, akumulator, akumulator z przesunieciem, mux, dmux, itp., ktore kazdy moglby uzywac ... smutne.
    Jesli sie myle to prosze o linki.


    Nie mi nie wiadomo o takiej bibliotece. VHDL pozwala no opis na rożnych poziomach abstrakcji trzema rodzajami opisu. Sprzetowy jest dopiero po syntezie i implementacji, w symulacji można go traktować jak skrypt interpretowany przez symulator.

    Od platformy muszą zależą komponenty realizowane w postaci bloków funkcjonalnych: pamieci, I/O, mnożarki, procesory itp.

    Wspomniany CoreGenerator czy Megafunctions, pozwalaja na automatyzację tworzenia podstawowych elementów, w szczególności tych zależnych od platformy sprzętowej.

    mariusz102102 napisał:

    2. Jakis czas temu szukalem w sieci uniwersalnego licznika. Nie udalo sie:(. Wiec po godzinie odkrywania "Ameryki" powstal ponizszy kod. Mozliwosc parametryzowania: liczby taktow, przesuniecia (po ilu taktach od RST na liczniku pojawi sie "0"). Co na ten temat sadzicie? :)


    No ok, jestem leniwy, nie chce mi sie tego czytać.

    pndemon napisał:

    Szczerze mówiąc nie interesowałem się nigdy specjalnie funkcjami bo w opisywaniu sprzętu na niewiele mogą się zdać,


    O ile pierwszą część zdania mogę sobie jakoś wytłumaczyć, ot tyle drugiej nie mogłem przemilczeć. Funkcje pozwalają wprowadzić hierarchie w kodzie i są w pełnii "supportowane" przez programy do syntezy.

    Może spróbuj sobie wyobrazić projekt w postaci pojedynczego modułu bez żadnych "podmodułów", najlepiej taki na kilka, kilkadziesiąt tysięcy linii. Całość z konieczności w jednym pliku, bez szans na zaadopotowanie w innych projektach. Tak wyglądalby projekt bez hierarchi.

    Tak samo bedzie wyglądać każde złożone przekształcenie np. FFT jeśli ropisze sie go linia po linii, a nie zamknie w parametryzowalnej funkcji.

    Owszem można mnożyć poziomy hierarchi projektu, tylko po co?

    0
  Szukaj w 5mln produktów