logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak napisać krążącą jedynkę w VHDL na płytce Spartan 3?

brt32 05 Gru 2006 16:46 3791 9
REKLAMA
  • #1 3297752
    brt32
    Poziom 11  
    Posty: 12
    Ocena: 4
    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.
  • REKLAMA
  • #2 3297903
    pndemon
    Poziom 19  
    Posty: 444
    Pomógł: 35
    Ocena: 18
    musisz stworzyć dzielnik częstotliwości o programowanej podziałce, coś jak:
    
    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
    
    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:
    
    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;
    
  • REKLAMA
  • #3 3299256
    brt32
    Poziom 11  
    Posty: 12
    Ocena: 4
    Dzieki za szybka odpowiedz :)
    Sprobuje to wszystko poskladac i jak beda jakies problemy to jeszcze napisze :)
  • #4 3307864
    griva
    Poziom 17  
    Posty: 203
    Pomógł: 12
    Ocena: 1
    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;
  • #5 3307910
    pndemon
    Poziom 19  
    Posty: 444
    Pomógł: 35
    Ocena: 18
    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??
  • #6 3308214
    griva
    Poziom 17  
    Posty: 203
    Pomógł: 12
    Ocena: 1
    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??
  • REKLAMA
  • #7 3320112
    pndemon
    Poziom 19  
    Posty: 444
    Pomógł: 35
    Ocena: 18
    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.
  • REKLAMA
  • #8 3320248
    griva
    Poziom 17  
    Posty: 203
    Pomógł: 12
    Ocena: 1
    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.
  • #9 3320376
    pndemon
    Poziom 19  
    Posty: 444
    Pomógł: 35
    Ocena: 18
    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 ;)
  • #10 3321969
    griva
    Poziom 17  
    Posty: 203
    Pomógł: 12
    Ocena: 1
    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

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy implementacji w VHDL "krążącej jedynki" na płytce Spartan 3, gdzie sygnał logiczny '1' przesuwa się kolejno przez 8 diod LED z różnymi częstotliwościami, które stopniowo rosną, a następnie cykl się powtarza. Proponowane rozwiązania obejmują użycie rejestru przesuwnego typu Johnsona do generowania krążącej jedynki oraz programowalnego dzielnika częstotliwości do zmiany prędkości przesuwania sygnału. Podkreślono, że nie należy tworzyć nowych zegarów wewnętrznych, lecz korzystać z jednego głównego zegara i stosować sygnały enable do sterowania prędkością. Zwrócono uwagę na dobre praktyki projektowe w VHDL, takie jak poprawne definiowanie list czułości procesów i unikanie asynchronicznych zegarów, które mogą powodować problemy z syntezą i symulacją. Wskazano także na możliwość wykorzystania modułu DCM (Digital Clock Manager) do podziału częstotliwości zegara wejściowego 50 MHz na niższe wartości. Całość projektu powinna opierać się na licznikach i rejestrach przesuwających, a zmiana częstotliwości mrugania realizowana przez programowalny dzielnik taktowania.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA