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

Miernik częstotliwości program VHDL

16 Gru 2008 21:05 4749 29
  • Poziom 9  
    Witam wszystkich. Mam problem z napisaniem programu do miernika czestotliwosci. Miernik ten ma mierzyc czestotliwosc z sieci. Miernik ma miec 3 wyswietlacze 7-mio segmentowe, na ktorych ma wyswietlac f w zakresie 0,1 do 99,9 Hz. Czegos juz sie nauczylem w vhdl-u, ale mam problem ktorego nie umiem rozwiazac.
    1. Otoż w syntezie wyskakuje mi cos takiego: "SHARED variables are not supported for synthesis." Nie wiem co mam juz zrobic.
    2. Nie wiem tez jak dalej zmienic kod z real( chodzi o wynik czestotliwosci fx, ktory jest chyba dobrze obliczony w tym programie) na kod wyswietlacza 7-mio segm.
    Jezeli moglibyscie pomoc forumowicze bylbym wdzieczny, bo mi juz nic do glowy nie przychodzi. P.S mam ten program napisac na zaliczenie, a kompletnie zielony jestem:(





    Oto ten program:
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    -- Uncomment the following lines to use the declarations that are
    -- provided for instantiating Xilinx primitive components.
    --library UNISIM;
    --use UNISIM.VComponents.all;

    entity czes is
    Port ( Tx : in std_logic;
    Tw : in std_logic;
    UpLED : out std_logic_vector(6 downto 0);
    MdLED : out std_logic_vector(6 downto 0);
    LdLED : out std_logic_vector(6 downto 0));
    end czes;

    architecture Behavioral of czes is
    signal count : std_logic_vector(9 downto 0);
    shared variable TMP4 : std_logic_vector(3 downto 0);
    shared variable TMP8 : std_logic_vector(7 downto 0);
    shared variable TMP12 : std_logic_vector(11 downto 0);
    shared variable licznik : std_logic_vector(9 downto 0);
    shared variable Tx2 : real;
    shared variable fx : real;

    FUNCTION vec2int(licznik:std_logic_vector(9 downto 0)) return real is
    variable Result : real:=0.0;
    variable TMP : real:=1.0;

    begin

    if licznik'length=0 then
    return Result;
    end if;
    for i in licznik'reverse_range loop
    if licznik(i)='1' then
    Result:=Result +TMP;
    end if;
    TMP:=TMP*2.0;
    end loop;
    return Result;
    end vec2int;

    begin

    process (Tx,count)
    begin
    if Tx = '0' then
    count<="0000000000";
    elsif (Tw='1' and Tw'Event) then
    licznik:=count+1;
    end if;
    end process;


    process (Tx)

    begin
    if Tx = '0' and Tx'Event then
    Tx2:=vec2int(licznik)/1000.0;
    fx:=1.0/Tx2;
    end if;

    end process;


    end Behavioral;






    Po zsyntezowaniu wyskakuje cos takiego:
    Compiling vhdl file C:/Xilinx/bin/Czestotliwosciomierz/czes.vhd in Library work.
    ERROR:HDLParsers:3258 - C:/Xilinx/bin/Czestotliwosciomierz/czes.vhd Line 21. SHARED variables are not supported for synthesis.
    ERROR:HDLParsers:3258 - C:/Xilinx/bin/Czestotliwosciomierz/czes.vhd Line 22. SHARED variables are not supported for synthesis.
    ERROR:HDLParsers:3258 - C:/Xilinx/bin/Czestotliwosciomierz/czes.vhd Line 23. SHARED variables are not supported for synthesis.
    ERROR:HDLParsers:3258 - C:/Xilinx/bin/Czestotliwosciomierz/czes.vhd Line 24. SHARED variables are not supported for synthesis.
    ERROR:HDLParsers:3258 - C:/Xilinx/bin/Czestotliwosciomierz/czes.vhd Line 25. SHARED variables are not supported for synthesis.
    ERROR:HDLParsers:3258 - C:/Xilinx/bin/Czestotliwosciomierz/czes.vhd Line 26. SHARED variables are not supported for synthesis.
  • PCBway
  • Pomocny post
    Poziom 28  
    Witam,

    Aby ktoś Ci pomógł w pierwszej kolejności opisz dokładniej układ.
    W programie jest zero komentarzy, nie zmuszaj forumowiczów do
    wymyślania o ci chodziło

    Co to są za sygnały Tx, Tw?
    Mogę się tylko domyślać że Tw to zegar, a Tx to sygnał mierzony.
    Jaka jest częstotliwość zegara.

    Shared variable są obsługiwane tylko w VHDL93, ich używanie przez programistów bez dużego doświadczenie może prowadzić do sporych problemów.

    Cytat z sieci:
    Shared variables are useful for system level modeling or object oriented programing"

    "VHDL '93 introduced shared variables which are available to more than one process. Like ordinary VHDL variables, their assignments take effect immediately. However, caution must be exercised when using shared variables because multiple processes making assignments to the same shared variable can lead to unpredictable behavior if the assignments are made concurrently. The VHDL ‘93 standard does not define the value of a shared variable it two or more processes make assignments in the same simulation cycle."

    Tak samo używanie zmiennych real w tak prostym programie mija się z celem.

    Najpierw należy zastanowić się jak ma działać układ.
    Dla prostego miernika f zaproponowałbym następujący układ:

    1. wstępny dzielnik zegara (Tw)
    2. następnie połączone kaskadowo trzy liczniki liczące w zakresie 0-9
    odpowiadające za dziesiąte części,jednostki i dziesiątki wyniku
    3. do każdego licznika dołączony konwerter na kod 7-segmetowy.

    JarekC
  • PCBway
  • Poziom 9  
    Witam.
    Przepraszam Jarku, faktycznie nie podalem szczegolow.
    Tw-zegar, Tx-sygnal mierzony. Czestotliwosc zegara to fw=1kHz. Jak juz pisalem jest to w ogole moj pierwszy kontakt z VHDL i dlatego prosze o pomoc. Gdzies wyczytalem, ze lepiej jest wprowadzic variable zamiast signal, stad tak zrobilem. A real wprowadzilem wlasnie dlatego zeby wynik byl zapisany w formacie np 50.0 Hz. No i wlasnie kolejna sprawa... Jarku zaproponowales licznik liczacy... tylko jak to ma wygladac w VHDL-u?
  • Pomocny post
    VIP Zasłużony dla elektroda
    Czyli przeżyłeś zderzenie z rzeczywistością ;)

    Typ real (a zwłaszcza operacje arytmetyczne na zmiennych i sygnałach tego typu) i zmienne współdzielone nie są wspierane przez narzędzia do syntezy. Jedyne gdzie możesz ich używać, to symulacje.

    Zamiast pisać projekt w stylu programu komputerowego zastanów się najpierw, jak powinna wygląć implementacja takiego miernika częstotliwości (najprostsza to bramkowany licznik z wyjściem BCD + dekoder 7segmentowy). Jak już będziesz wiedział, to opisujesz działanie każdej części i łączysz je za pomocą sygnałów. Koniec zadania :)

    Pozdrawiam,
    Dr.Vee
  • Poziom 9  
    Ok wiem juz mniej wiecej jak to ma wygladac, nawet gdzies znalazlem podobny program miernika czestotliwosci. Tylko ze tam wynik jest zapisywany na 2 wyswietlaczach i nie ma problemu.m Zreszta w sumie nie chodzi o ilosc wyswietlaczy, tylko o sposob w jaki mam zliczyc dziesiętne czesci czestotliwosci. Jak to mozna zrobic za pomoca licznika? Jakis powielacz czestotliwosci?
  • Pomocny post
    Poziom 11  
    po przekonwertowaniu napiecia z Gniazda Elektrycznego na jakies napięcia do fpga , zrobilbym to tak

    1. robisz dzielnik cz. (1 sekunda) i mierzysz ile impulsow sie pojawilo
    poprzez jakis licznik
    2. liczby dziesiatek i jednosci masz juz wtedy zalatwione
    3. po kazdym zliczeniu impulsu , puszczasz nastepny timer , ktory sie resetuje gdy napotkamy na nastepny impuls,
    4. jak nadejdzie clock z 1s dzielnika to sprawdzasz stan tego mniejszego licznika, i przeskalowujesz to na dziesiatna czesc Hz ,

    ten mniejszy licznik mozesz zrobic na 100Hz lub 10Hz zalezy jak bardzo chcesz miec dokladny wynik ;)

    to sa przemyslenia przy fajce jak popelnilem jakies bledy w mysleniu to pewnie ktos mnie poprawi

    Pozdrawiam
    Lukian
  • Pomocny post
    Poziom 27  
    moze uda mi sie opisac to troche jasniej niz Lukian;
    zakladamy, ze masz jakas czestotliwosc bedaca wzorcem
    czasu z kwarcu lub generatora;
    musisz zrobic licznik A modulo N, gdzie liczba N odpowiada
    ilosci impulsow wzorcowej czestotliwosci przypadajacej na 0.1 sek;
    nastepnie robisz 3 identyczne liczniki B,C,D liczace od 0 do 9;
    laczac je ze soba w kaskade A->B->C->D w taki sposob,
    ze licznik nastepny zwieksza swa wartosc o 1 gdy poprzedni
    doliczy do swojego 'konca' masz dokladnie to, co chcesz
    osiagnac, licznik B pokazuje dziesiate czesci sekundy,
    C sekundy, D dziesiatki sekund;
    J.A

    Dodano po 58 [minuty]:

    --------
    oczywiscie - myslac pewnie wciaz o wlasnie skonczonym meczu
    Lecha - pomylilem sekundy z hercami i napisalem glupstwa;
    J.A
  • Pomocny post
    Poziom 11  
    Hmm skoro pomyliles sek z hz to oznacza ze chciales napisac 0.1Hz , teraz problem wg mnie jest w tym ze pomiar bedzie trwal 1/0.1 = 10sek , moim zamiarem byl zatrzasniecie jednego licznika bcd (2 cyfry - 8 bit) zegarem 1 Hz, a drugi licznik taktowany 0.1Hz wlączał sie co impuls z czestotliwosci mierzonej czyli okolo 50 razy , gdy 1 sekunda minie to odczytuje stan mniejszego licznika zeby okreslic dziesietne czesci :)
  • Pomocny post
    Poziom 28  
    Witam

    Przy podanych założeniach tzn. częstotliwość mierzona 0-100Hz,
    częstotliwość wzorcowa 1kHz mamy tylko wielokrotność x10.
    Propozycje Lukian21 i J.A są w tym przypadku nie do zrealizowania.
    Pozostaje bramkowanie 10s.

    Pozdrawiam
    JarekC
  • Pomocny post
    Poziom 11  
    hm dlaczego :) ten 1khz dziele 1000 razy i mam hertza i liczy jednosci i dziesiatki a drugi licznik dziele 10000 razy i badam ile czasu minelo od ostatniego impulsu .. moze ja nie widze jakiejs trywialnej rzeczy :) wiec czekam na odpowiedz :)
  • Pomocny post
    Poziom 28  
    Może nie do końca zrozumiałem Twoją ideę.

    Założenia:
    mierzony sygnał 49.9 Hz czyli okres =0.02004008s
    sygnał wzorcowy 1khz (okres 1ms)

    Jeżeli 1khz/1000 mamy 1Hz bramkujemy nim sygnał mierzony i mamy zliczonych 49 impulsów.

    Jeżeli chcesz dzielić 1khz/10000 i zliczać dalej (499 impulsów) to dostajesz 0.1Hz czyli bramkowanie 10s.

    Natomiast jeżeli chciałbyś zmierzyć kiedy pojawi się pierwszy impuls po
    zamknięciu bramki (a w naszym przypadku pojawi się po 40us) to czym
    chcesz go zmierzyć jeżeli sygnał wzorcowy ma okres 1ms. Po za tym
    zmierzysz czas a nie f.

    Jeżeli byłby dostępna odpowiednio wysoka f wzorcowa to można
    myśleć o pomiarze okresu (sygnał mierzony otwiera bramkę a my
    zliczamy ilość impulsów wzorcowych). Ale aby wyświetlić f potrzebujemy
    wykonać operację 1/T w uP bez problemu w FPGA trochę więcej zabawy.
    A myślę że nie o to chodzi w tym projekcie.

    JarekC
  • Poziom 9  
    Witam, dziekuje bardzo za pomoc. A wiec juz wiele rzeczy stalo sie jasnych, ale nadal brakuje mi jednego rozwiazania. Ale zanim to, to musze jeszcze cos wytlumaczyc. Otoz, Jarku, czestotliwosc zegara, podalem 1kHz, ale nie jest ona z gory narzucona. Natomiast zamiar mialem wlasnie taki, zeby zmierzyc okres, a pozniej przeliczyc to na czestotliwosc. Chcialem to zrobicdlatego ze czas pomiaru bylby duzy(10s). Natomiast stad wzial sie problem z tym typem real. Mo i wlasnie, o to chodzi, jak policzyc ta wartosc po przecinku:(
  • Poziom 14  
    jeżeli móglbym dorzucić swoje trzy grosz to proponuje znacznie prostsze rozwiązanie:

    na dowolnym zboczu rosnącym mierzonego sygnał włączamy nazwijmy to stoper na 10s i zaczynamy zliczanie kolejnych zboczy rosnących. po upływie 10 sekund wyłączamy zliczanie i dla sygnału 0,1Hz do 99,9Hz powinna pojawić się liczba trzycyfrowa (zakładam zliczacznie dziesiętne).. to jest właśnie wartość w hertzach częstotliwości mierzonego sygnału (brakuje tylko kropki przed najmniej znaczącą wartością :))

    oto przykład
    mam sygnał 10,2 Hz (98ms). w oknie 10 sekundowym które jest nastawione na rosnące zbocze tegoż sygału zostanie zliczonych dokładnie 102 zboczy rosnących, ponieważ 10sek/98ms=102 :)

    jest to pierwsze co przyszło mi do głowy więc możliwe że popełniłem jakiś bład logiczny..:?:

    ps. okno 10 sek daje nam gwarancje precyzji dziesiątyc części hertza, tak jak okno 100 sek setnych częsci herza
  • Poziom 9  
    Tak, ale nadal czas pomiaru wynosi 10 sekund
  • Pomocny post
    Poziom 28  
    >> _greis_

    Była o tym wcześniej mowa. Jest to najbardziej standardowy pomiar f,
    ale ma tą wadę że dla niskich f trzeba stosować długie czasy pomiaru.

    >Przemekdz

    Niekoniecznie trzeba stosować real/float.

    Przy nowych założeniach
    f wzorcowa 10 khz
    f mierzona 1-100Hz

    Dla 1 Hz zliczymy 10000 impulsów, dla 50hz 2000 impulsów, dla 99.9hz 1001 impulsów. (X= ilość impulsów)

    Teraz wykonujemy działanie na liczbach całkowitych:
    1000000/X (reszta nas nie interesuje)

    dla 1Hz mamy 1000000/10000 ->010
    dla 50Hz mamy 1000000/2000 ->500
    dla 99Hz mamy 1000000/1001 ->999

    Teraz tylko konwersja Bin2Bcd i na wyświetlacz. Kropka zwsze w tym samym miejscu (na drugim wyświetlaczu).
    W innym wątku podałem link do algorytmu i kod VHDL.

    Czyli mamy operację dzielenia liczby 20-bitowej przez liczbę 13-bitową.
    Można przyjąć że dzielimy 32-bity przez 16-bitów.

    Teraz pytanie czy możesz korzystać z gotowych bibliotek,
    czy musisz napisać "ręcznie".

    Dzisiaj wieczorem sprawdzę jak zareaguje kompilator na funkcję
    dzielenia przy standardowych bibliotekach.

    JarekC
  • Poziom 9  
    Jarku to brzmi logicznie nawet. Sprobuje w ta strone pojsc. Dam znac jak juz cos wykombinuje. Zauwazylem jednak blad, bo w takim razie aby to dzialalo tak jak mowisz to fw musi byc rowne 100kHz. Wtedy faktycznie dla 99,9 Hz bedzie zliczanych 1001 impulsow, no i analogicznie. Chyba sie nie pomylilem:)

    Dodano po 4 [godziny] 46 [minuty]:

    A więc zrobilem cos takiego:



    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    entity licznik is
    Port ( Tx : in std_logic;
    Tw : in std_logic;
    UpLED : out std_logic_vector (6 downto 0);
    MdLED : out std_logic_vector (6 downto 0);
    LdLED : out std_logic_vector (6 downto 0));
    end licznik;

    architecture Behavioral of licznik is


    signal licznik : std_logic_vector (19 downto 0);
    signal wynik : std_logic_vector (19 downto 0);
    signal czestotliwosc : std_logic_vector (19 downto 0);

    function BCD2LED(BCD:std_logic_vector(2 downto 0)) return std_logic_vector is
    variable TMP : std_logic_vector ( 6 downto 0);
    begin
    if BCD = "0000" then TMP:="1000000"; --0
    elsif BCD = "0001" then TMP:="1111001"; --1
    elsif BCD = "0010" then TMP:="0100100"; --2
    elsif BCD = "0011" then TMP:="0110000"; --3
    elsif BCD = "0100" then TMP:="0011001"; --4
    elsif BCD = "0101" then TMP:="0010010"; --5
    elsif BCD = "0110" then TMP:="0000010"; --6
    elsif BCD = "0111" then TMP:="1111000"; --7
    elsif BCD = "1000" then TMP:="0000000"; --8
    elsif BCD = "1001" then TMP:="0010000"; --9
    else
    TMP:="0111111";
    end if;
    return TMP;
    end BCD2LED;

    begin

    process (Tx,Tw)

    begin
    if Tx = '0' and Tx'Event then
    licznik <= "00000000000000000000";
    elsif (Tw = '1' and Tw'Event) then
    wynik <= licznik;
    wynik <= wynik + 1;
    end if;
    licznik <= wynik;
    if licznik > 1000000 then
    UpLED <= "0111111";
    MdLED <= "0111111";
    LdLED <= "0111111";
    end if;
    end process;


    process (Tx)
    begin
    if Tx = '0' and Tx'Event then
    czestotliwosc <= 1000000/licznik;
    end if;
    end process;
    end Behavioral;






    nawet fajnie to wyglada, ale wyskoczyl jeden blad. "/ can not have such operands in this context." czyli po prostu w typie std_logic_vector nie mozna dzielic:( musialbym chyba zmienic zawartosc licznika na integer i pozniej podzielic dopiero, no i nastepnie zamienic ten wynik na bcd i znow zmienic na kod wyswietlacza siedmiosegmentowego. Dobrze rozumiem? Tylko ze wtedy tak mi sie wydaje, do sygnalu "czestotliwosc" nie bedxzie mozna przypisac wartosci z funkcji zmiany vec2int.
  • Poziom 9  
    No to poradzilem sobie chlopaki juz z tym integerem.
    Program wyglada tak:



    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    entity miernik is
    Port ( Tx : in std_logic;
    Tw : in std_logic;
    UpLED : out std_logic_vector (6 downto 0);
    MdLED : out std_logic_vector (6 downto 0);
    LdLED : out std_logic_vector (6 downto 0));
    end miernik;

    architecture Behavioral of miernik is


    signal licznik : std_logic_vector (19 downto 0);
    signal licz : std_logic_vector (19 downto 0);
    signal wynik : std_logic_vector (19 downto 0);
    signal czestotliwosc : integer;
    signal count : std_logic_vector (11 downto 0);

    function BCD2LED(BCD:std_logic_vector(3 downto 0)) return std_logic_vector is
    variable TMP : std_logic_vector ( 6 downto 0);
    begin
    if BCD = "0000" then TMP:="1000000"; --0
    elsif BCD = "0001" then TMP:="1111001"; --1
    elsif BCD = "0010" then TMP:="0100100"; --2
    elsif BCD = "0011" then TMP:="0110000"; --3
    elsif BCD = "0100" then TMP:="0011001"; --4
    elsif BCD = "0101" then TMP:="0010010"; --5
    elsif BCD = "0110" then TMP:="0000010"; --6
    elsif BCD = "0111" then TMP:="1111000"; --7
    elsif BCD = "1000" then TMP:="0000000"; --8
    elsif BCD = "1001" then TMP:="0010000"; --9
    else
    TMP:="0111111";
    end if;
    return TMP;
    end BCD2LED;

    function vec2int(licz : std_logic_vector) return integer is
    variable RESULT: integer:=0;
    variable TMP: integer:=1;
    begin
    if licz'length = 0
    then return RESULT;
    end if;
    for i in licz'reverse_range loop
    if licz(i)='1'
    then RESULT:=RESULT+TMP;
    end if;
    TMP:=TMP*2;
    end loop;
    return RESULT;
    end vec2int;




    begin

    process (Tx, Tw, licznik) <------------------TU JEST BŁĄD

    begin
    if Tx = '0' and Tx'Event then
    licznik <= "00000000000000000000";
    elsif (Tw = '1' and Tw'Event) then
    wynik <= licznik + 1;
    end if;
    licz <= wynik;
    if licz > 1000000 then
    UpLED <= "0111111";
    MdLED <= "0111111";
    LdLED <= "0111111";
    end if;
    end process;


    process (Tx)
    variable czes : integer;
    begin

    if Tx = '0' and Tx'Event then
    czes := vec2int(licz);
    end if;
    czestotliwosc <= czes;
    end process;

    process (Tx, czestotliwosc)
    variable BCD2 : std_logic_vector (3 downto 0);
    begin
    if Tx = '0' and Tx'Event then

    if czestotliwosc > 8 then BCD2:="1001"; --9
    elsif czestotliwosc > 7 then BCD2:="1000"; --8
    elsif czestotliwosc > 6 then BCD2:="0111"; --7
    elsif czestotliwosc > 5 then BCD2:="0110"; --6
    elsif czestotliwosc > 4 then BCD2:="0101"; --5
    elsif czestotliwosc > 3 then BCD2:="0100"; --4
    elsif czestotliwosc > 2 then BCD2:="0011"; --3
    elsif czestotliwosc > 1 then BCD2:="0010"; --2
    elsif czestotliwosc > 0 then BCD2:="0001"; --1
    else BCD2:="0000"; --0
    end if;
    count(3 downto 0)<=BCD2;

    if czestotliwosc > 89 then BCD2:="1001"; --9
    elsif czestotliwosc > 79 then BCD2:="1000"; --8
    elsif czestotliwosc > 69 then BCD2:="0111"; --7
    elsif czestotliwosc > 59 then BCD2:="0110"; --6
    elsif czestotliwosc > 49 then BCD2:="0101"; --5
    elsif czestotliwosc > 39 then BCD2:="0100"; --4
    elsif czestotliwosc > 29 then BCD2:="0011"; --3
    elsif czestotliwosc > 19 then BCD2:="0010"; --2
    elsif czestotliwosc > 9 then BCD2:="0001"; --1
    else BCD2:="0000"; --0
    end if;
    count(7 downto 4)<=BCD2;

    if czestotliwosc > 899 then BCD2:="1001"; --9
    elsif czestotliwosc > 799 then BCD2:="1000"; --8
    elsif czestotliwosc > 699 then BCD2:="0111"; --7
    elsif czestotliwosc > 599 then BCD2:="0110"; --6
    elsif czestotliwosc > 499 then BCD2:="0101"; --5
    elsif czestotliwosc > 399 then BCD2:="0100"; --4
    elsif czestotliwosc > 299 then BCD2:="0011"; --3
    elsif czestotliwosc > 199 then BCD2:="0010"; --2
    elsif czestotliwosc > 99 then BCD2:="0001"; --1
    else BCD2:="0000"; --0
    end if;
    count(11 downto 8)<=BCD2;
    end if;
    end process;


    process (Tx)
    begin
    if Tx = '0' and Tx'Event then
    UpLED<=BCD2LED(count(11 downto 8));
    MdLED<=BCD2LED(count(7 downto 4));
    LdLED<=BCD2LED(count (3 downto 0));
    end if;
    end process;

    end Behavioral;





    Tylko jesczze wyskakuje jeden blad: Signal wynik cannot be synthesized, bad synchronous description.


    Czego tutaj nie widze?
  • Pomocny post
    Poziom 28  
    Witam,

    Masz w jednym procesie dwa sygnały zegarowe jest to niedozwolone.
    Jeżeli usuniesz ten błąd pojawi się następny "Multi source" informujący o tym
    że z dwóch procesów próbujesz wysterować linie UpLED,MdLed,LdLED.
    Jest to również niedozwolone.
    Jest jeszcze parę innych błędów natury logicznej. Układ nie będzie działał tak jak założyłeś.
    Niestety VHDL to nie C. I pomimo że, jest to język wysokiego poziomu
    to trzeba trochę patrzyć z perspektywy sprzętu.

    Za bardzo komplikujesz sobie układ, namnożyło Ci się zmiennych i procesów. Pomyśl jak byś to zrobił np. na układach TTL

    Jeszcze kilka uwag natury ogólnej. Stosuj znaczniki BBCode aby w poście
    kod programu był wyróżniony. Stosuj także formatowanie kodu (wcięcia)
    gdyż jest mało czytelny.

    Pozdrawiam i kibicuję.
    JarekC
  • Poziom 9  
    Kurcze probowalem to zmienic, aby niebylo dwoch sygnalow zegarowych, ale jakos nie mam pomyslu jak to zmienic. Poza tym znalazlem na necie pdf-a, którego autorem jest chyba jakis prof. i w jego programie do czestotliwosciomierza tez zliczanie impulsow i zapisywanie ich do licznika odbywa sie w jednym "procesie" a na liscie inicjalizacyjnej tego procesu tez sa dwa wejscia zegarowe: Reset i InpSignal, oba sa formatu in std_logic
  • Pomocny post
    Poziom 27  
    Przemekdz napisał:
    /.../probowalem to zmienic, aby nie bylo dwoch sygnalow zegarowych/.../


    problem jest w tym, ze sygnal ktory ma zerowac licznik asynchronicznie
    [a przy okazji - musi byc asynchronicznie ? - to jest generalnie
    niebezpieczna praktyka] napisales tak, jakby to byl zegar;
    Code:

      oryginal

    process (Tx, Tw, licznik)
    begin
      if Tx = '0' and Tx'Event then  <---- TU JEST BLAD
         licznik <= "00000000000000000000";
      elsif (Tw = '1' and Tw'Event) then
         wynik <= licznik + 1;

       powinno byc tak [o ile dobrze podpowiada mi moja znajomosc vhdl]

    process (Tx, Tw, licznik)
    begin
     if (Tx = '0') then 
        licznik <= "00000000000000000000";
     elsif (Tw = '1' and Tw'Event) then
        wynik <= licznik + 1;


    to tylko uwaga do problemu 'wielu zegarow', jak zauwazyl
    wczesniej JarekC masz wiecej klopotliwych zapisow;

    J.A
  • Poziom 9  
    kurcze czyli jaki powienien byc zapis w tym wierszu?

    Dodano po 1 [godziny] 21 [minuty]:

    To moze to bedzie dobrze bo w sumie juz nie ma bledow, jest za to masa warningow, ale to chyba przejdzie:






    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    entity miernik is
    Port ( Tx : in std_logic;
    Tw : in std_logic;
    UpLED : out std_logic_vector (6 downto 0);
    MdLED : out std_logic_vector (6 downto 0);
    LdLED : out std_logic_vector (6 downto 0));
    end miernik;

    architecture Behavioral of miernik is


    signal licznik : std_logic_vector (19 downto 0);
    signal wynik : std_logic_vector (19 downto 0);
    signal czestotliwosc : integer;
    signal count : std_logic_vector (11 downto 0);

    function BCD2LED(BCD:std_logic_vector(3 downto 0)) return std_logic_vector is
    variable TMP : std_logic_vector ( 6 downto 0);
    begin
    if BCD = "0000" then TMP:="1000000"; --0
    elsif BCD = "0001" then TMP:="1111001"; --1
    elsif BCD = "0010" then TMP:="0100100"; --2
    elsif BCD = "0011" then TMP:="0110000"; --3
    elsif BCD = "0100" then TMP:="0011001"; --4
    elsif BCD = "0101" then TMP:="0010010"; --5
    elsif BCD = "0110" then TMP:="0000010"; --6
    elsif BCD = "0111" then TMP:="1111000"; --7
    elsif BCD = "1000" then TMP:="0000000"; --8
    elsif BCD = "1001" then TMP:="0010000"; --9
    else
    TMP:="0111111";
    end if;
    return TMP;
    end BCD2LED;

    function vec2int(licz : std_logic_vector) return integer is
    variable RESULT: integer:=0;
    variable TMP: integer:=1;
    begin
    if licz'length = 0
    then return RESULT;
    end if;
    for i in licz'reverse_range loop
    if licz(i)='1'
    then RESULT:=RESULT+TMP;
    end if;
    TMP:=TMP*2;
    end loop;
    return RESULT;
    end vec2int;

    begin

    process (Tx, Tw, licznik)

    begin
    if Tx = '0' then
    licznik <= "00000000000000000000";
    UpLED<=BCD2LED(count(11 downto 8));
    MdLED<=BCD2LED(count(7 downto 4));
    LdLED<=BCD2LED(count (3 downto 0));
    elsif (Tw = '1' and Tw'Event) then
    wynik <= licznik + 1;
    end if;
    if wynik > 1000000 then
    UpLED <= "0111111";
    MdLED <= "0111111";
    LdLED <= "0111111";
    end if;
    end process;


    process (Tx)
    variable czes : integer;
    begin

    if Tx = '0' and Tx'Event then
    czes := vec2int(wynik);
    end if;
    czestotliwosc <= czes;
    end process;

    process (Tx, czestotliwosc)
    variable BCD2 : std_logic_vector (3 downto 0);
    begin
    if Tx = '0' and Tx'Event then

    if czestotliwosc > 899 then BCD2:="1001"; --9
    elsif czestotliwosc > 799 then BCD2:="1000"; --8
    elsif czestotliwosc > 699 then BCD2:="0111"; --7
    elsif czestotliwosc > 599 then BCD2:="0110"; --6
    elsif czestotliwosc > 499 then BCD2:="0101"; --5
    elsif czestotliwosc > 399 then BCD2:="0100"; --4
    elsif czestotliwosc > 299 then BCD2:="0011"; --3
    elsif czestotliwosc > 199 then BCD2:="0010"; --2
    elsif czestotliwosc > 99 then BCD2:="0001"; --1
    else BCD2:="0000"; --0
    end if;
    count(11 downto 8)<=BCD2;

    if czestotliwosc > 89 then BCD2:="1001"; --9
    elsif czestotliwosc > 79 then BCD2:="1000"; --8
    elsif czestotliwosc > 69 then BCD2:="0111"; --7
    elsif czestotliwosc > 59 then BCD2:="0110"; --6
    elsif czestotliwosc > 49 then BCD2:="0101"; --5
    elsif czestotliwosc > 39 then BCD2:="0100"; --4
    elsif czestotliwosc > 29 then BCD2:="0011"; --3
    elsif czestotliwosc > 19 then BCD2:="0010"; --2
    elsif czestotliwosc > 9 then BCD2:="0001"; --1
    else BCD2:="0000"; --0
    end if;
    count(7 downto 4)<=BCD2;

    if czestotliwosc > 8 then BCD2:="1001"; --9
    elsif czestotliwosc > 7 then BCD2:="1000"; --8
    elsif czestotliwosc > 6 then BCD2:="0111"; --7
    elsif czestotliwosc > 5 then BCD2:="0110"; --6
    elsif czestotliwosc > 4 then BCD2:="0101"; --5
    elsif czestotliwosc > 3 then BCD2:="0100"; --4
    elsif czestotliwosc > 2 then BCD2:="0011"; --3
    elsif czestotliwosc > 1 then BCD2:="0010"; --2
    elsif czestotliwosc > 0 then BCD2:="0001"; --1
    else BCD2:="0000"; --0
    end if;
    count(3 downto 0)<=BCD2;


    end if;
    end process;

    end Behavioral;
  • Pomocny post
    Poziom 27  
    Przemekdz napisał:
    To moze to bedzie dobrze bo/.../

    raczej nie oczekuj, ze ktos bedzie analizowal kod i wylapie
    bledy, skompiluj i zrob symulacje;
    ewentualnie podaj choc kilka pierwszych warning;
    ale moze jestem zbytnim pesymista i ktos jednak poswieci
    swoj czas na te analize;
    J.A
  • Poziom 9  
    Warningi mam takie:


    WARNING:Xst:1426 - The value init of the FF/Latch czes_4 hinder the constant cleaning in the block miernik.
    You should achieve better results by setting this init to 0.
    WARNING:Xst:1426 - The value init of the FF/Latch czes_0 hinder the constant cleaning in the block miernik.
    You should achieve better results by setting this init to 1.
    WARNING:Xst:1293 - FF/Latch <czes_26> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_25> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_24> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_23> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_22> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_21> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_20> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_19> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_18> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_17> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_16> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_15> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_14> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_13> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_12> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_11> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_10> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_9> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_8> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_7> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_6> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_5> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_1> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_3> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_2> is constant in block <miernik>.
    Library "C:/Xilinx/data/librtl.xst" Consulted
    WARNING:Xst:1293 - FF/Latch <count_11> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <count_10> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <count_9> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <count_8> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <count_7> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <count_6> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <count_5> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <count_4> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <mdled_6_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <mdled_5_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <mdled_0_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <upled_3_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <upled_1_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <upled_5_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <mdled_1_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <mdled_2_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <upled_6_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <mdled_4_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <mdled_3_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <upled_2_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <upled_4_0> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <upled_0_0> is constant in block <miernik>.
  • Pomocny post
    Poziom 28  
    Witam,

    W większości twój układ nic nie robi gdyż sygnał "licznik" jest tylko
    zerowany i nie zmienia swojej wartości. Tym samym sygnały wynik, czes i
    częstotliwosc są również stałymi.

    Pozdrawiam
    JarekC
  • Pomocny post
    Poziom 27  
    Przemekdz napisał:
    Warningi mam takie/.../

    umieszczenie warningow pomoglo ... :)

    widzisz to, o czym pisze JarekC?
    Code:

    if Tx = '0' then
    licznik <= "00000000000000000000";
    /.../
    elsif (Tw = '1' and Tw'Event) then
    wynik <= licznik + 1;

    efekt jest taki, ze licznik jest zawsze '0'
    a wynik = 0+1;
    o tym posrednio informuja pierwsze 2 warningi:
    The value init of the FF/Latch czes_4 hinder the constant cleaning
    You should achieve better results by setting this init to 0.

    znaczy to mniej wiecej tyle, ze robisz jakies operacje na czes,
    a koniec koncow wartosc tego obiektu i tak jest stala, wiec kompilator
    sugeruje, by od razu te stala przypisac;

    moze przyda ci sie taka uwaga - podziel caly projekt na mniejsze
    moduly, skompiluj jeden modul i zrob symulacje, jak bedzie dzialac
    tak, jak sie spodziewasz, zrob to samo z nastepnym;
    na koncu polacz je w jedna calosc;

    J.A
  • Poziom 9  
    Pomyslalem jedynie nad czyms takim, aby zamiast liniii:

    wynik <= licznik + 1;

    napisac:



    licznik <= licznik + 1;
    wynik <= licznik;


    i dalej nic nie zmieniac
    Ale jeszcze wiecej warningow sie porobilo:



    Analyzing Entity <miernik> (Architecture <behavioral>).
    WARNING:Xst:819 - D:/cwiczenia_z_vhdla/vhdl/licznik.vhd line 59: The following signals are missing in the process sensitivity list:
    count<11>, count<10>, count<9>, count<8>, count<7>, count<6>, count<5>, count<4>, count<3>, count<2>, count<1>, count<0>, wynik.
    Entity <miernik> analyzed. Unit <miernik> generated.


    =========================================================================
    * HDL Synthesis *
    =========================================================================

    Synthesizing Unit <miernik>.
    Related source file is D:/cwiczenia_z_vhdla/vhdl/licznik.vhd.
    WARNING:Xst:737 - Found 7-bit latch for signal <upled>.
    WARNING:Xst:737 - Found 7-bit latch for signal <mdled>.
    WARNING:Xst:737 - Found 7-bit latch for signal <ldled>.
    Found 16x7-bit ROM for internal node.
    Found 16x7-bit ROM for internal node.
    Found 16x7-bit ROM for internal node.
    Found 21-bit comparator greater for signal <$n0101> created at line 71.
    Found 14-bit adder for signal <$n0106> created at line 50.
    Found 29-bit adder for signal <$n0109> created at line 50.
    Found 30-bit adder for signal <$n0111> created at line 50.
    Found 28-bit adder for signal <$n0113> created at line 50.
    Found 29-bit adder for signal <$n0115> created at line 50.
    Found 27-bit adder for signal <$n0117> created at line 50.
    Found 28-bit adder for signal <$n0119> created at line 50.
    Found 26-bit adder for signal <$n0121> created at line 50.
    Found 27-bit adder for signal <$n0123> created at line 50.
    Found 25-bit adder for signal <$n0125> created at line 50.
    Found 26-bit adder for signal <$n0127> created at line 50.
    Found 24-bit adder for signal <$n0129> created at line 50.
    Found 25-bit adder for signal <$n0131> created at line 50.
    Found 23-bit adder for signal <$n0133> created at line 50.
    Found 24-bit adder for signal <$n0135> created at line 50.
    Found 22-bit adder for signal <$n0137> created at line 50.
    Found 23-bit adder for signal <$n0139> created at line 50.
    Found 21-bit adder for signal <$n0141> created at line 50.
    Found 22-bit adder for signal <$n0143> created at line 50.
    Found 20-bit adder for signal <$n0145> created at line 50.
    Found 21-bit adder for signal <$n0147> created at line 50.
    Found 19-bit adder for signal <$n0149> created at line 50.
    Found 20-bit adder for signal <$n0151> created at line 50.
    Found 18-bit adder for signal <$n0153> created at line 50.
    Found 19-bit adder for signal <$n0155> created at line 50.
    Found 17-bit adder for signal <$n0157> created at line 50.
    Found 18-bit adder for signal <$n0159> created at line 50.
    Found 16-bit adder for signal <$n0161> created at line 50.
    Found 17-bit adder for signal <$n0163> created at line 50.
    Found 15-bit adder for signal <$n0165> created at line 50.
    Found 16-bit adder for signal <$n0167> created at line 50.
    Found 32-bit comparator greater for signal <$n0170> created at line 95.
    Found 32-bit comparator greater for signal <$n0171> created at line 95.
    Found 32-bit comparator greater for signal <$n0172> created at line 96.
    Found 32-bit comparator greater for signal <$n0173> created at line 97.
    Found 32-bit comparator greater for signal <$n0174> created at line 98.
    Found 32-bit comparator greater for signal <$n0175> created at line 99.
    Found 32-bit comparator greater for signal <$n0176> created at line 100.
    Found 32-bit comparator greater for signal <$n0177> created at line 101.
    Found 32-bit comparator greater for signal <$n0178> created at line 102.
    Found 32-bit comparator greater for signal <$n0179> created at line 108.
    Found 32-bit comparator greater for signal <$n0180> created at line 108.
    Found 32-bit comparator greater for signal <$n0181> created at line 109.
    Found 32-bit comparator greater for signal <$n0182> created at line 110.
    Found 32-bit comparator greater for signal <$n0183> created at line 111.
    Found 32-bit comparator greater for signal <$n0184> created at line 112.
    Found 32-bit comparator greater for signal <$n0185> created at line 113.
    Found 32-bit comparator greater for signal <$n0186> created at line 114.
    Found 32-bit comparator greater for signal <$n0187> created at line 115.
    Found 32-bit comparator greater for signal <$n0188> created at line 121.
    Found 32-bit comparator greater for signal <$n0189> created at line 121.
    Found 32-bit comparator greater for signal <$n0190> created at line 122.
    Found 32-bit comparator greater for signal <$n0191> created at line 123.
    Found 32-bit comparator greater for signal <$n0192> created at line 124.
    Found 32-bit comparator greater for signal <$n0193> created at line 125.
    Found 32-bit comparator greater for signal <$n0194> created at line 126.
    Found 32-bit comparator greater for signal <$n0195> created at line 127.
    Found 32-bit comparator greater for signal <$n0196> created at line 128.
    Found 13-bit adder for signal <$n0202> created at line 50.
    Found 12-bit register for signal <count>.
    Found 32-bit register for signal <czes>.
    Found 20-bit up counter for signal <licznik>.
    Found 20-bit register for signal <wynik>.
    Found 1072 1-bit 2-to-1 multiplexers.
    Summary:
    inferred 3 ROM(s).
    inferred 1 Counter(s).
    inferred 64 D-type flip-flop(s).
    inferred 32 Adder/Subtracter(s).
    inferred 28 Comparator(s).
    Unit <miernik> synthesized.


    =========================================================================
    HDL Synthesis Report

    Macro Statistics
    # ROMs : 3
    16x7-bit ROM : 3
    # Registers : 14
    1-bit register : 12
    20-bit register : 1
    32-bit register : 1
    # Latches : 3
    7-bit latch : 3
    # Counters : 1
    20-bit up counter : 1
    # Multiplexers : 33
    2-to-1 multiplexer : 33
    # Adders/Subtractors : 32
    14-bit adder : 1
    22-bit adder : 2
    21-bit adder : 2
    20-bit adder : 2
    19-bit adder : 2
    18-bit adder : 2
    17-bit adder : 2
    16-bit adder : 2
    15-bit adder : 1
    13-bit adder : 1
    29-bit adder : 2
    30-bit adder : 1
    28-bit adder : 2
    27-bit adder : 2
    26-bit adder : 2
    25-bit adder : 2
    24-bit adder : 2
    23-bit adder : 2
    # Comparators : 28
    21-bit comparator greater : 1
    32-bit comparator greater : 27

    =========================================================================

    =========================================================================
    * Low Level Synthesis *
    =========================================================================
    Library "C:/Xilinx/data/librtl.xst" Consulted
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0040>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0042>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0044>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0046>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0048>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0050>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0052>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0054>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0056>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0058>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0060>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0062>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0064>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0066>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I0> is unconnected in block <Mmux__n0068>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I29> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I1> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I2> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I3> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I4> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I5> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I6> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I7> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I8> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I9> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I10> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I11> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I12> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I13> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I14> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I15> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I16> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I17> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I18> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I19> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I20> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I21> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I22> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I23> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I24> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I25> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I26> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I27> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1290 - Hierarchical block <I28> is unconnected in block <Mmux__n0038>.
    It will be removed from the design.
    WARNING:Xst:1426 - The value init of the FF/Latch czes_31 hinder the constant cleaning in the block miernik.
    You should achieve better results by setting this init to 0.
    WARNING:Xst:1293 - FF/Latch <czes_29> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_28> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_26> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_25> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_27> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_30> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_20> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_21> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_22> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_23> is constant in block <miernik>.
    WARNING:Xst:1293 - FF/Latch <czes_24> is constant in block <miernik>.

    Optimizing unit <miernik> ...

    Mapping all equations...
    Loading device for application Xst from file 'v200.nph' in environment C:/Xilinx.
    Building and optimizing final netlist ...
    Found area constraint ratio of 100 (+ 5) on block miernik, actual ratio is 9.

    =========================================================================
    * Final Report *
    =========================================================================

    Device utilization summary:
    ---------------------------

    Selected Device : 2s200pq208-5

    Number of Slices: 210 out of 2352 8%
    Number of Slice Flip Flops: 94 out of 4704 1%
    Number of 4 input LUTs: 361 out of 4704 7%
    Number of bonded IOBs: 21 out of 144 14%
    Number of GCLKs: 2 out of 4 50%


    =========================================================================
    TIMING REPORT


    Clock Information:
    ------------------
    -----------------------------------+------------------------+-------+
    Clock Signal | Clock buffer(FF name) | Load |
    -----------------------------------+------------------------+-------+
    tw | BUFGP | 40 |
    tx | BUFGP | 54 |
    -----------------------------------+------------------------+-------+

    Timing Summary:
    ---------------
    Speed Grade: -5

    Minimum period: 13.397ns (Maximum Frequency: 74.644MHz)
    Minimum input arrival time before clock: 11.368ns
    Maximum output required time after clock: 8.128ns
    Maximum combinational path delay: No path found

    =========================================================================

    Completed process "Synthesize".

    Dodano po 2 [minuty]:

    BŁAGAM WAS NPISZCIE MI KOD PROGRAMU, BO JA TEGO NOE ZALICZE, DO 16 STYCZNIA MAM TO WYDRUKOWAC, ZABINDOWAC I ODDAC. PROSZE WAS NAPISZCIE JAK TO MAM ZROBIC, BO JA JUZ NIE MAM GLOWY DO TEGO:(
  • Pomocny post
    Poziom 28  
    Witam

    Jeżeli chcesz "gotowca" to daj ogłoszenie w dziale "Ogłoszenia Elektronika i Biznes Elektronika". Gotowe rozwiązania i wiedza kosztują.

    Ewentualnie pisz na prv.

    Pozdrawiam
    JarekC
  • Pomocny post
    Poziom 27  
    Przemekdz napisał:
    /.../DO 16 STYCZNIA MAM TO WYDRUKOWAC/.../

    w takiej sytuacji powinienes sie zastanawiac, jak dostac przedluzenie
    oddania pracy, o miesiac co najmniej;
    mimo ze slabo znam vhdl, to mam pare uwag - niestety te uwagi
    nie pomoga Ci zdazyc z tym projektem przed 16 stycznia
    Code:

    function vec2int(licz : std_logic_vector) return integer is
    variable RESULT: integer:=0;
    variable TMP: integer:=1;
      begin
       if licz'length = 0   then return RESULT;
       end if;
       for i in licz'reverse_range loop
          if licz(i)='1'
             then RESULT:=RESULT+TMP;
          end if;
       TMP:=TMP*2;
       end loop;
    return RESULT;
    end vec2int;

    to sie nie zsyntetyzuje, ale rozumiem, ze ta funkcja nie
    jest po to, by powstal jakis hardware, ale po to, by byla
    zgodnosc typow w liniach:
    'if czestotliwosc > 899 then BCD2';
    jesli mam racje, to w vhdl jest krotszy sposob na zamiane
    typow, rzutowanie, ale jak to zapisac nie pamietam, musisz
    sobie znalezc;
    Code:

    process (Tx, Tw, licznik)
    begin
       if Tx = '0' then
          licznik <= "00000000000000000000";
          UpLED   <= BCD2LED(count(11 downto 8));
          MdLED   <= BCD2LED(count( 7 downto 4));
          LdLED   <= BCD2LED(count( 3 downto 0));
       elsif (Tw = '1' and Tw'Event) then
          licznik <= licznik + 1;
          wynik   <= licznik;
       end if;
       if wynik > 1000000 then
          UpLED <= "0111111";
          MdLED <= "0111111";
          LdLED <= "0111111";
       end if;
    end process;

    po pierwsze
    nie wiem, po co masz 2 zmienne licznik i wynik, czemu
    nie mozesz operowac na jednej, i czy sobie zdajesz sprawe
    z tego, ze wynik jest zawsze o 1 mniejszy od licznik;

    po drugie
    if Tx = '0' then
    UpLED <= BCD2LED
    else if
    <nic o UpLED>
    ---
    skazujesz sie na to, ze kompilator ma sie sam domyslic,
    co ma zrobic z UpLED jesli Tx = 1
    oraz w sytuacji Tx = 0 i wynik > 1000000;
    moim zdaniem powinienes wyrzucic licznik i operowac
    tylko na wynik, sterowac licznik/wynik i UpLed, MdLED, LdLED
    w osobnych procesach;
    Code:

     if    czestotliwosc > 899 then BCD2:="1001"; --9
       /.../
      end if;
      count(11 downto 8) <= BCD2;

      if    czestotliwosc > 89 then BCD2:="1001"; --9
       /.../
      end if;
      count(7 downto 4) <= BCD2;
      /.../

    to nie jest procesor, linijki nie beda sie wykonywac
    po kolei i BCD2 nie bedzie przyjmowac kolejnych wartosci
    w wiare wykonywania kolejnych instrukcji;
    powinienes [chyba, nie zastanawialem sie nad tym dluzej]
    miec trzy osobne zmienne, cos takiego:

    Code:
     count(11 downto 8) <= BCD2_1; 
    
     count( 7 downto 4) <= BCD2_2;
     count( 3 downto 0) <= BCD2_3;

    ---------

    i na koniec - wydaje mi sie, ze algortm po prostu zlicza
    ilosc impulsow wzorca czasu podczas polowy okresu sygnalu
    mierzonego, a to nie jest pomiar czestotliwosci ale wielkosci
    bedacej jej odwrotnoscia;
    nie widze, w jaki sposob mozesz obejsc operacje dzielenia;
    [ale moze sie myle]
    wazne pytanie jest takie - ten projekt masz napisac
    i przesymulowac w ModelSim, czy zrobic synteze i pokazac
    dzialanie w hardware;
    jesli to pierwsze, to nie musisz sie przejmowac tym, czy
    dana operacja, w tym przypadku 1/x, jest 'syntetyzowalna',
    wazne jest, by byla 'symulowalna' a wydaje mi sie, ze
    dzielenie zapisane w kodzie RTL da sie symulowac;
    [jak zwykle, pewien nie jestem, moja praktyka ogranicza sie
    do prawdziwych fpga];
    jesli to drugie, to do dzielenia mozesz zastosowac hardware'owe
    moduly arytmetyczne istniejace zarowno w ise xilinxa jak
    i w quartus altery;

    J.A

    Dodano po 5 [godziny] 19 [minuty]:

    mam taki pomysl, wlasciwie zarys pomyslu na mierzenie
    czestotliwosci bez koniecznosci operacji dzielenia;
    pomysl opiera sie o pamiec wewnatrz fpga, ktora zawiera
    wzorce okresu dla roznych czestotliwosci;
    jesli:
    Fwz - czestotliwosc wzorcowa [powiedzmy 100MHz]
    Fmr - czestotliwosc mierzona [10MHz <= Fmr <= 20MHz,
    rozdzielczosc 0.1MHz]
    to mamy w pamieci raptem 100 wartosci okresu odpowiadajacych
    czestotliwosciom od 10MHz do 20MHz z krokiem 0.1MHz;

    trzeba zrobic tabelke 100 liczb odpowiadajacom okresom
    czestotliwosciom 10.0, 10.1, 10.2 ... 20MHz

    Code:
      czestotliwosc      okres[w jednostkach Fwz]
    
           20MHz     ->  T200 [liczba zliczen Fwz]
           19.9MHz   ->  T199
           19.8MHz   ->  T198
           ...
           10.1MHz   ->  T101
           10MHz     ->  T100


    przy zboczu sygnalu mierzonego ladujemy do licznika T200
    i z kazdym Twr [wzorzec] odejmujemy 1,
    jesli skonczy sie okres mierzonego sygnalu nim licznik sie wyzeruje,
    to mamy mierzona czestotliwosc co najmniej 20MHz;
    jesli licznik sie wyzeruje, a okres sygnalu mierzonego
    wciaz trwa, ladujemy do licznika [z pamieci] wartosc
    T200 - T199 i znow liczymy w dol,
    jesli okres sie skonczy przed wyzerowaniem licznika,
    mierzona czestotliwosc jest pomiedzy 20 a 19.9MHz,
    jesli nie, z pamieci do licznika ladujemy T199 - T198
    i liczymy dalej w dol;
    jesli okres sygnalu mierzonego skonczy sie, nim
    licznik sie wyzeruje, mierzona czestotliwosc jest
    miedzy 19.9Mhz a 19.8Mhz,
    jesli nie, do licznika z pamieci ladujemy kolejna wartosc
    T198 - T197 itd;

    nie mam watpliwosci, ze ten opis jest kiepski, ale algorytm
    wydaje mi sie poprawny, przy pojemnosciach pamieci nawet tanich
    fpga mozna zrobic pomiar calkiem szerokiego zakresu czestotliowsci
    z przyzwoita rozdzielczoscia, a policzenie zawartosci pamieci
    mozna zrobic nawet w excelu;
    jesli kogos zainteresowalo, moge [ale po 14.stycznia] zrobic
    opis bardziej zjadliwy, z jakimis rysunkami;

    J.A
  • Poziom 9  
    Dziekuje J.A za większą aktywnosc... Tak sobie mysle ze jednak chyba sprobuje oddac ten program, ktory napisalem, ale jeszcze kilka odpowiedzi.


    1. function vec2int(licz : std_logic_vector) return integer is
    variable RESULT: integer:=0;
    variable TMP: integer:=1;
    begin
    if licz'length = 0 then return RESULT;
    end if;
    for i in licz'reverse_range loop
    if licz(i)='1'
    then RESULT:=RESULT+TMP;
    end if;
    TMP:=TMP*2;
    end loop;
    return RESULT;
    end vec2int;



    to sie zsyntezowalo

    2. if czestotliwosc > 899 then BCD2:="1001"; --9
    /.../
    end if;
    count(11 downto 8) <= BCD2;

    if czestotliwosc > 89 then BCD2:="1001"; --9
    /.../
    end if;
    count(7 downto 4) <= BCD2;
    /.../


    Tutaj wydaje mi sie ze to pojdzie jednak linijkapo linijce, dlatego ze instrukcja "if" ma to do siebie, ze musi sie znajdowac wewnatrz procesu, a proces charakteryzuje sie tym, ze jego wnetrze jest wykonywane linijka po linijce, wiec chyba to by przeszlo.


    3. Jezeli chodzi o wewnetrzne wzorce okresu. Wydaje mi sie ze wtedy mimo wszystko czas pomiaru bedzie wynosil 10 sekund, a mysle ze to jest jednak za duzu czas.

    4. Przedstawiony przeze mnie program w zalozeniu byl jednak okresomierzem z racji wlasnie dluugiego pomiaru okresu


    Dziekuje J.A
  • Poziom 27  
    moze nie powinienem sie wypowiadac o vhdl przy swojej slabej
    znajomosci jezyka ...
    Przemekdz napisał:
    1. function vec2int(licz : std_logic_vector) return integer is
    variable RESULT: integer:=0;
    /.../
    to sie zsyntezowalo

    nie sadze ;)
    ta funkcja zamienia 0101 na liczbe calkowita 5,
    a reprezentacja liczby 5 w hardware jest 0101,
    moim zdaniem nie ma sie co zsyntetyzowac;
    Cytat:
    if czestotliwosc > 89 then BCD2:="1001"; --9
    /.../
    end if;
    count(7 downto 4) <= BCD2;
    Tutaj wydaje mi sie ze to pojdzie jednak linijka po linijce,
    dlatego ze instrukcja "if" ma to do siebie, ze musi sie znajdowac
    wewnatrz procesu, a proces charakteryzuje sie tym, ze jego wnetrze
    jest wykonywane linijka po linijce, wiec chyba to by przeszlo.

    masz racje, ale dlatego, ze zapis:
    Code:

     if    czestotliwosc > 89 then BCD2:="1001"; --9
     elsif czestotliwosc > 79 then BCD2:="1000"; --8
       /.../
     end if;
     count(7 downto 4)<=BCD2;

     if    czestotliwosc > 8 then BCD2:="1001"; --9
     elsif czestotliwosc > 7 then BCD2:="1000"; --8
      /.../
     end if;
     count(3 downto 0)<=BCD2;

    jest rownowazny zapisowi:
    Code:

     if    czestotliwosc > 89 then count(7 downto 4):="1001"; --9
     elsif czestotliwosc > 79 then count(7 downto 4):="1000"; --8
       /.../
     end if;

     if    czestotliwosc > 8 then count(3 downto 0):="1001"; --9
     elsif czestotliwosc > 7 then count(3 downto 0):="1000"; --8
      /.../
     end if;


    a nie dlatego, ze wnetrze procesu wykonuje sie linijka po linijce,
    sekwencyjnosc wykonywania linijek mozna zapewnic
    w symulatorze, ale jak to zrobic w rzeczywistym fpga ?

    Cytat:

    3. Jezeli chodzi o wewnetrzne wzorce okresu. Wydaje mi sie,
    ze wtedy mimo wszystko czas pomiaru bedzie wynosil 10 sekund,
    a mysle ze to jest jednak za duzu czas.


    oczywiscie, jezeli mierzony sygnal moze trwac 10 sekund, to nie
    wyobrazam sobie algorytmu, ktory w krotszym czasie przewidzi,
    czy to jest 10s, czy 8.7s;

    to co opisalem w watku o prawie identycznym tytule jest
    pomyslem na to, jak uniknac operacji dzielenia w fpga;

    J.A