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.

Pytanko dt. mrugania diody - verilog - spartan3

FirstStep 17 Sty 2009 15:13 1051 6
  • #1 17 Sty 2009 15:13
    FirstStep
    Poziom 12  

    Witam. Napisałem coś takiego:
    #####
    input clk;
    output led;

    reg [25:0] cnt;

    always @(posedge clk) begin
    cnt<=cnt+1;
    end

    assgin led=cnt[23];
    #####

    I teraz takie pytanko, jeżeli mam kwarc 50MHz, to czas z jakim dioda będzie mrugać 2^23/5*10^7. No ale jak zamieniam reg [25:0] cnt na reg [150:0] cnt to efekt mrugania jest taki sam. Jak to się dzieje? Przecież zegar musi przelecieć po wszystkich 150 bitach i zacząć od początku.

    Coś źle myślę, bo to nie działa.

    0 6
  • Pomocny post
    #2 17 Sty 2009 15:22
    marekos
    Poziom 15  

    musisz zmienić jeszcze tu

    assgin led=cnt[46];


    będzie dwa razy wolniej.

    0
  • Pomocny post
    #3 17 Sty 2009 15:54
    J.A
    Poziom 27  

    FirstStep napisał:
    /.../Jak to się dzieje?/.../


    zastanow sie nad takim 'kodem':

    reg [ 7:0] cnt1;
    reg [ 25:0] cnt2;
    reg [150:0] cnt3;

    always @(posedge clk) ckl1 <= clk1 +1; clk2 <= clk2 +1 ...

    assign led1 = cnt1[1];
    assign led2 = cnt2[1];
    assign led3 = cnt3[1];

    czy led1, led2, led3 beda mrugaly z rozna czestotliwoscia ?
    malo tego, jestem przekonany, ze w czasie optymalizacji
    kompilator zachowa tylko jeden licznik 2bitowy, reszte usunie;

    J.A

    0
  • #4 17 Sty 2009 16:24
    FirstStep
    Poziom 12  

    No nie będą mrugały z różną częstotliwością, ale to był właśnie problem z jakim się tutaj zwróciłem :] A odpowiedzi nie znam dalej, dlaczego tak się dzieje...

    Drogą dedukcji, w momencie przypisania cnt, licznik się zeruje, i tak na okrągło. Ale to raczej nie możliwe, bo jak przypisać wtedy inne wartości np cnt1[3], skoro by zawsze na cnt1[1] zerowało.

    0
  • Pomocny post
    #5 17 Sty 2009 16:40
    J.A
    Poziom 27  

    FirstStep napisał:
    /.../Jak to sie dzieje?/.../

    cnt[0] ma czestotliwosc 2x mniejsza od zegara,
    cnt[1] 4x mniejsza, cnt[2] 8x mniejsza itd,
    niezaleznie od tego, jak duzy jest licznik;
    tak to po prostu dziala;
    wiec zmiana cnt[25:0] na cnt[150:0] nie ma zadnego
    wplywu na cnt[23];
    jesli chcesz zmnienic czestotliwosc sygnalu wyjsciowego
    musisz zmienic numer bitu licznika ktory jest wyprowadzony
    na wyjscie, tak jak napisal marekos;

    J.A

    0
  • #6 17 Sty 2009 16:43
    FirstStep
    Poziom 12  

    Dzięki, "pomógł" poszło do obu. Pozdro.

    0
  • #7 17 Sty 2009 16:55
    J.A
    Poziom 27  

    FirstStep napisał:

    dziekujemy za 'pomogl' :)

    przeoczylem druga czesc pytania;
    Cytat:
    Drogą dedukcji, w momencie przypisania cnt, licznik się zeruje,
    i tak na okrągło. Ale to raczej nie możliwe/.../

    rzecz w tym, ze kompilator usuwa wszystko, co nie ma wplywu
    na jakies wyjscie, gdyby cnt[3] bylo gdzies uzyte, chocby posrednio,
    do sterowania jakims pinem wyjsciowym, to by sie zachowalo;
    w Twoim przykladzie wyjscie zalezy od cnt[23], cnt[23] zalezy
    od wartosci cnt[0]-cnt[22] i wartosci cnt[23] i od niczego wiecej,
    wiec jakikolwiek licznik nie zadeklarujesz i tak po optymalizacji
    'zachowa' sie tylko cnt[23:0], reszta 'do kosza';

    J.A

    0
  Szukaj w 5mln produktów