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.

Krążąca jedynka - projekt

05 Gru 2006 16:46 3068 9
  • Poziom 10  
    Witam.
    Wiecie moze jak w najprostszy sposob napisac w VHDL'u "krazaca jedynke"? Wiem, ze ma to byc rejestr i dekoder... Jednak nie wiem jak to napisac.
    Ogolnie mam do zrobienia projekt na plytce Spartan 3 - mam wybrac 8 czestotliwosci, na plytce jest kwarc. Najpierw jedynka ma przejsc przez wszystkie 8 diod z pierwsza czestotliwoscia, pozniej z druga, itd. - coraz szybciej. Po tym, jak przejdzie te 8 czestotliwosci nastepuje zliczanie od poczatku... I tak w nieskonczonosc.
    Ma ktos jakis pomysl?
    Z gory dziekuje za pomoc.
  • PCBway
  • Poziom 19  
    musisz stworzyć dzielnik częstotliwości o programowanej podziałce, coś jak:
    Code:

    entity trigering_freq_gen is port(
        tr_clk: in std_logic;
        data_bus: in std_logic_vector(3 downto 0);
        rst: in std_logic;
        clk: inout std_logic);
    end entity trigering_freq_gen;

    architecture arch of trigering_freq_gen is
       
    signal count: integer range 0 to 10000;

    signal rst_sig: std_logic;
       
    begin
       
        gen: process (tr_clk, rst_sig, rst, data_bus)
        begin
            if rising_edge(tr_clk) then
                if (rst='1') then
                    clk <= '0';
                    count <= 0;
                elsif (rst_sig = '1') then
                    count <= 0;
                    clk <= not clk;
                else
                    count <= count + 1;
                end if;
            end if;
        end process gen;
       
        rst_sig <= '1' when count >= (dev(conv_integer(data_bus))) else
                   '0';
    end architecture arch;


    gdzie data_bus jest indeksem tablicy dev
    Code:

    type arr is array (0 to 10) of integer;
    constant dev: arr:=(9999, 999, 499, 332, 249, 199, 168, 142, 124, 110, 99);


    ten dzielnik generuje sygnał zegara od 1k do 100k z krokiem co 10k
    czyli dla data_bus=0 jest 1k, dla 1 jest 10k itd.

    a do krążącej jedynki dajesz np. maszynę stanu, masz od razu załatwiony rejestr i dekoder

    czyli jakoś tak:
    Code:

    architecture arch of bleble
    type state is (jeden dwa, trzy, cztery, itd..);
    signal next_state, present_state: state;
    begin
        comb: process (present_state)
        begin
            case present_state is
                when jeden =>
                    led <= "00000001";
                    next_state => dwa;
                when dwa =>
                    led <= "00000010";
                when itd....
            end case;
        end process comb;
       
        synchro: process(clk)
        begin
            if rising_edge(clk) then
                present_state <= next_state;
            end if;
        end process synchro;
    end architecture arch;
  • Poziom 10  
    Dzieki za szybka odpowiedz :)
    Sprobuje to wszystko poskladac i jak beda jakies problemy to jeszcze napisze :)
  • PCBway
  • Poziom 17  
    pndemon: ten Twoj kod to chyba z konkursu jak napisac hello world w 300 liniach kodu :PPP

    masz internalne clocki i wszystki najgorsze praktyki jakie sie da

    przeciez krazaca jedynka to jest cos co jest na dzien dobry w cyfrowce, chcesz gosciowi wmowic ze nie da sie tego zrobic bez automatu??!!!

    ja bym to zrobil tak:


    process(clk)
    begin

    if reset='1' then
    jhonson <= "0001";
    elsif rising_edge(clk) then
    if jhonson(3)='1' then
    jhonson <= "0001";
    else
    jhonson <= jhonson(2 downto 0) & '0';
    end if;
    end if;

    end process;
  • Poziom 19  
    Wcale nie mówiłem, że nie da się tego inaczej zrobić, poza tym nie podoba mi się że w twoim procesie tak na prawdę nie występuję sygnał clk, a ty masz nadzieję, że to zadziała, otóż niektóre programy do syntezy/symulacji pomijają listy czułości i co wtedy?? Ja np. uczyłem się że coś takiego jest b. złą praktyką.

    Co do

    Cytat:
    masz internalne clocki i wszystki najgorsze praktyki jakie sie da

    to nie wiem za bardzo czego się to tyczy??
  • Poziom 17  
    pndemon napisał:
    Wcale nie mówiłem, że nie da się tego inaczej zrobić, poza tym nie podoba mi się że w twoim procesie tak na prawdę nie występuję sygnał clk, a ty masz nadzieję, że to zadziała,



    fakt byl bug juz poprawilem

    Dodano po 3 [minuty]:

    pndemon napisał:
    Co do

    Cytat:
    masz internalne clocki i wszystki najgorsze praktyki jakie sie da

    to nie wiem za bardzo czego się to tyczy??


    sygnal clk, jesli dobrze zrozumialem tworzysz zegar dwojka liczaca i a potem tymze zegarem clockujesz drugi modul, tak??
  • Poziom 19  
    Cytat:

    sygnal clk, jesli dobrze zrozumialem tworzysz zegar dwojka liczaca i a potem tymze zegarem clockujesz drugi modul, tak??


    Rozumiem, że mówisz o tym jak tworzony jest sygnał clk. Niestety nie znam innego sposobu na dzielnik częstotliwości jak tylko licznik, który zlicza do połowy zadanej częstotliwości, a potem zmienia sygnał clk na not clk.

    Ten moduł działa bez problemów przy 20 MHz, ale jeśli sądzisz, że jest 'nie ok' to z przyjemnością dowiem się o Twojej propozycji, w końcu nadal się uczę tego języka i wszelkie sugestie mile widziane.
  • Poziom 17  
    pndemon napisał:
    Cytat:

    sygnal clk, jesli dobrze zrozumialem tworzysz zegar dwojka liczaca i a potem tymze zegarem clockujesz drugi modul, tak??


    Rozumiem, że mówisz o tym jak tworzony jest sygnał clk. Niestety nie znam innego sposobu na dzielnik częstotliwości jak tylko licznik, który zlicza do połowy zadanej częstotliwości, a potem zmienia sygnał clk na not clk.

    Ten moduł działa bez problemów przy 20 MHz, ale jeśli sądzisz, że jest 'nie ok' to z przyjemnością dowiem się o Twojej propozycji, w końcu nadal się uczę tego języka i wszelkie sugestie mile widziane.


    nie tworzysz nowego zegara, caly projekt powinien chodzic na jednym zegarze (oczywiscie nie zawsze jest to mozliwe) natomiast ten clk ktory Ty tworzysz dwojka liczaca zamieniasz na enable.
  • Poziom 19  
    Cytat:
    nie tworzysz nowego zegara


    no a jak jest na płytce na 50MHz, to i tak musisz zrobić dzielnik


    Cytat:
    caly projekt powinien chodzic na jednym zegarze


    nie wiem jak to się ma do jednego z założeń projektowych, że częstotliwość mrugania ma się zmieniać

    Cytat:
    natomiast ten clk ktory Ty tworzysz dwojka liczaca zamieniasz na enable.


    mógłbyś to rozwinąć bo nie wiem za bardzo o co chodzi ;)
  • Poziom 17  
    pndemon napisał:
    Cytat:
    nie tworzysz nowego zegara


    no a jak jest na płytce na 50MHz, to i tak musisz zrobić dzielnik


    Cytat:
    caly projekt powinien chodzic na jednym zegarze


    nie wiem jak to się ma do jednego z założeń projektowych, że częstotliwość mrugania ma się zmieniać

    Cytat:
    natomiast ten clk ktory Ty tworzysz dwojka liczaca zamieniasz na enable.


    mógłbyś to rozwinąć bo nie wiem za bardzo o co chodzi ;)



    jesli masz za duzy zegar wejsciowy to uzywasz dcm-a do podzielenia tej wartosci np przez 2 i masz ladny zegar.

    generalnie metoda enabli jest starsza od fpga, zrob sobie counter podlacz jedno z wyjsci do en przerzutnika przesymuluj i zajarzysz.
    poszukaj tez cos na temat detektor zbocza (poszukaj moich postow - nie ma ich duzo- i juz gdzies rozpisywalem)

    internalne clocki rozwala Ci projekt poniewaz tworzysz w ten sposob asynchroniczny projekt (chyba ze jestes w tym dobry ;-) ).

    pamietaj tez ze dedykowanych linii zegarowych jest malo, do tego kazdy wykryty internal obkladanyh jest buforem bufg zeby zmniejszyc skew(zalezy tez od syntezera) ktorych np w virtexie I bylo tylko 4.

    poczytaj logi, stawiam piwo ze router napisal Ci ze masz low-skew lub tez zroutowal zegar niededykowana linia