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

Symulacja post-route, skąd te pliki? Jak sie ich pozbyć?

25 Sty 2009 13:14 1215 6
  • Poziom 12  
    Witam,

    W przypadku symulacji post-route, pojawiają się dziwne (dla mnie) "piki". Nie rozumiem skąd się one wzięły, a chciałbym się ich pozbyć. Oto opis:

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

    entity pwm_5bits_B is
        Port (
                clk          :    in     STD_LOGIC;
                pwm_in      :    in      STD_LOGIC_VECTOR(4 downto 0);
                pwm_out       :    out   STD_LOGIC := '0');

    end pwm_5bits_B;

    architecture Behavioral of pwm_5bits_B is

       type color_5bits is array (0 to 31) of integer;
       
       signal counter    :    integer range 0 to 1952 := 0;
       
       signal color_B : color_5bits := (0,62,125,188,251,314,377,440,503,566,629,692,755,818,881,
                                        944,1007,1070,1133,1194,1259,1322,1385,1448,1511,1574,1637,
                                        1700,1763,1826,1889,1952);
                                        
    begin
       
       process (clk) is
       begin
          if (rising_edge(clk)) then
             if (counter=1952) then
                counter<=0;
             else
                counter<=counter+1;
             end if;
          end if;
       end process;
       
       process (counter) is
       begin
          if (color_B(CONV_INTEGER(pwm_in))=0) then
             pwm_out<='0';
          elsif (color_B(CONV_INTEGER(pwm_in))<counter) then
             pwm_out<='0';
          else
             pwm_out<='1';
          end if;
       end process;
       
    end architecture;


    W załączniku zrzut ekranu z symulacji z zaznaczonymi "pikami". Czas ich trwania wynosi 987 ps i 861 ps.

    Dziękuje za pomoc.

    Pozdrawiam
    Łukasz
  • PCBwayPCBway
  • Poziom 14  
    przeprowadziłem symulację u siebie i nie zauważyłem wskazanych szpilek :( ale proponuję trochę zmian:

    jeśli ma być to pwm o stałych współczynnikach to lepiej zadeklarować sygnał color_B jako constant. zamiast latch'y zostanie wygenerowana pamięć typu rozproszonego (distributed memory :)) .

    drugi process zostanie błędnie zsyntezowany ponieważ nie ma sygnału synchronizacji. ponadto przypisania warunkowe pochłoną bardzo dużo logiki..
    Code:
     process (counter) is
    
       begin
          if (color_B(CONV_INTEGER(pwm_in))=0) then
             pwm_out<='0';
          elsif (color_B(CONV_INTEGER(pwm_in))<counter) then
             pwm_out<='0';
          else
             pwm_out<='1';
          end if;
       end process;

    o wiele lepiej wygląda sprawa tak

    Code:
    process (clk) is
    
       begin
          if (rising_edge(clk)) then
                pwm_reg<=pwm_next;
          end if;
       end process;
       
       pwm_next   <= not pwm_reg when counter=color_B(CONV_INTEGER(pwm_in)) or counter=0 else
                   pwm_reg;
       
       pwm_out   <= pwm_reg;

    dodatkowe rejestry kontrolują przepływ danych, a logika sprowadza się do paru przerzutników i bramek ;)
  • PCBwayPCBway
  • Poziom 12  
    Faktycznie color_B poprawiłem na constant :). Co do Twojego opisu, niestety coś jest nie tak, sam nie wiem co dokładnie, bo do końca go nie rozumiem. Wyrzuciłeś część poza proces, jednocześnie synchronizując go ze zboczem narastającym clk.

    Nie dostałeś "szpilek" - dziwne - wykonałeś symulację post-route czy behawioralną ?

    Pozdrawiam
    Łukasz
  • Poziom 28  
    Lukee napisał:
    W przypadku symulacji post-route, pojawiają się dziwne (dla mnie) "piki"/.../

    ten problem przewijal sie juz przez elektrode;
    chodzi o to, ze przy przejsciu licznika od wartosci np. ff do 100
    przez chwile na wejsciu ukladu porownujacego stan licznika
    i color_B(CONV_INTEGER(pwm_in) moze pojawic sie dowolna
    wartosc miedzy 0 a 1ff, zaleznie od opoznien sciezek i sygnalu
    zegarowego;
    jest to normalne i zwykle [ale nie zawsze] nie jest to grozne,
    jesli akurat w Twoim przypadku nie mozesz zaakceptowac takich
    szpilek, to musisz zmienic pwm_out z sygnalu czysto kombinacyjnego
    na rejestr, czyli zamiast:
    process (counter) is
    napisac:
    process (clk) is
    begin
    if (rising_edge(clk))
    _greis_ napisał:
    przeprowadziłem symulację u siebie i nie zauważyłem wskazanych szpilek

    zapewne, jak podejrzewa Lukee, zrobiles symulacje rtl, a nie p&r;
    Cytat:
    jeśli ma być to pwm o stałych współczynnikach to lepiej zadeklarować sygnał color_B jako constant.
    zamiast latch'y zostanie wygenerowana pamięć typu rozproszonego

    tego nie rozumiem, dlaczego latche maja byc zamienione na pamiec ?
    moim zdaniem nie bedzie ani latch'y, ani pamieci przy takim napisaniu kodu;
    oczywiscie sugestia, by stale deklarowac jako stale, jest sluszna :);
    Code:
    pwm_next   <= not pwm_reg when counter=color_B(CONV_INTEGER(pwm_in)) 
    
                                      or counter=0 else  pwm_reg;


    to faktycznie wyglada lepiej, ale nie jest dokladym odpowiednikiem
    funkcji, ktora napisal Lukee, wyjscie bedzie inne dla pwm_in = 0;

    J.A
  • Poziom 14  
    J.A. napisał:

    tego nie rozumiem, dlaczego latche maja byc zamienione na pamiec ?
    moim zdaniem nie bedzie ani latch'y, ani pamieci przy takim napisaniu kodu

    tego ja nie rozumiem :) to w takim razie gdzie miałoby się znaleźć dane o tym sygnale ???:idea:
    moim skromnym zdaniem wygląda to mniej więcej tak..
    każdy slice (w przypadku xilixna) posiada wbudowane dwie tablice rekonfigurowalne F i G, które służą do tworzenia funkcji logicznych do bodajże 4 zmiennych.
    owa pamięć może posłużyć do tworzenia a) funkcji kombinacyjnych albo b) rejestrów albo c) pamięci rozproszonej (!).
    dla pytania, gdzie mogłaby się znaleźć sygnał typu constant po syntezie odpowiedź jest najbliżej bramki c :D

    jeśli nie mam racji, to z wielką ochotą wysłucham prawidłowej odpowiedzi :)
  • Pomocny post
    Poziom 28  
    _greis_ napisał:
    /.../owa pamięć może posłużyć do tworzenia
    a) funkcji kombinacyjnych/.../ albo
    c) pamięci rozproszonej (!).
    zgadza sie;

    Cytat:
    b) rejestrów
    nie zgadza sie, rejestr to dodatkowy, niezalezny element slice;

    jesli napiszesz "if (in=2) then out <= 1" else out <= "0",
    to look-up table bedzie wypelniona tak, ze pod adresem '2'
    bedzie jedynka, pod reszta adresow zera, nie ma potrzeby
    pamietania stalej '2' w latch'ach czy osobnej pamieci;

    a najlepiej napisac sobie przykladowy, ale maly kod,
    ktory porownuje wejscie z kilkoma stalymi i zaleznie
    od porownania ustawia jakies wyjscia i popatrzec w
    'technology view' [nie wiem, jak sie to w ise naprawde nazywa,
    ale z pewnoscia jest taka mozliwosc] jak kod zostal
    zrealizowany w hardware;

    J.A
  • Poziom 14  
    znalazłem fragment który rozwiew moje wszelie wątpliwości:

    Cytat:

    /.../ROM (read-only memory) is a combinational circuit and has no internal
    state. Its output depends only on its input (i.e., address). There is no real embedded ROM in a Spartan-3 device, but it can be emulated by a combinational circuit or a single-port RAM with the write operation disabled. The content of the ROM can be expressed as a constant in the HDL code and the values are loaded to the RAM when the device is programmed.

    i dalej będzie ciekawiej
    Cytat:

    /.../ROM cannot be realized by a block RAM. It is actually synthesized as a combinational circuit with the logic cells. The code can be considered as another form of a selected signal assignment or case statement. This type of ROM is feasible only for a small table.