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.

Spartan-6 Atlys XC6SLX45 - Prosty układ sekwencyjny - licznik impulsów zegara

09 Wrz 2014 16:16 1650 4
  • Poziom 6  
    Witam. Korzystam z układu programowalnego Atlys XC6SLX45 CSG324C. Mam problem z implementacją układu, który co takt zegara inkrementuje zawartość elementu pamiętającego i wysyła ją na port wyjścia. Podczas symulacji w programie ModelSim (ze środowiska ISE Webpack) otrzymuje prawidłowe wyniki, ale po implementacji w układzie Atlys, na jego diodach pojawiają się błędne wartości lub od razu wartość maksymalna. Kod VHDL jest krótki, więc zamieszczam go poniżej:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use ieee.numeric_std.all;

    entity Counter is
    Port ( Clk : in STD_LOGIC;
    Clr : in STD_LOGIC;
    DataOUT : out STD_LOGIC_VECTOR (3 downto 0));
    end Counter;

    architecture Behavioral of Counter is
    constant one : STD_LOGIC_VECTOR(3 downto 0) := "0001";
    signal value : STD_LOGIC_VECTOR(3 downto 0);

    begin
    process (Clk, Clr)
    begin
    if value = "UUUU" then
    value <= "0000";
    else
    DataOUT <= value;

    if Clr = '1' then
    value <= "0000";
    elsif Clk = '1' then
    if value < "1111" and value /= "UUUU" then
    value <= STD_LOGIC_VECTOR(unsigned(value) + unsigned(one));
    else
    null;
    end if;
    else
    null;
    end if;
    end if;
    end process;
    end Behavioral;

    Plik UCF ma następującą zawartość:

    NET "Clock" CLOCK_DEDICATED_ROUTE = FALSE;
    NET "Reset" CLOCK_DEDICATED_ROUTE = FALSE;
    NET "Clock" LOC = "L15";
    NET "Clock" PERIOD = 1000.0 ms HIGH 50%;
    NET "OUTPUT(0)" LOC = "U18";
    NET "OUTPUT(1)" LOC = "M14";
    NET "OUTPUT(2)" LOC = "N14";
    NET "OUTPUT(3)" LOC = "L14";
    NET "Reset" LOC = "N4";

    Dopiero zaczynam pracę z programowaniem układów FPGA. Bardzo proszę o pomoc, za którą z góry dziękuje.
    Pozdrawiam
  • PCBway
  • Poziom 27  
    przykladow na licznik w vhdl jest mnostwo, poszukaj i porownaj
    ze swoja wersja;

    napisales:
    Kod: vhdl
    Zaloguj się, aby zobaczyć kod

    co oznacza, ze value ma byc inkrementowane gdy Clk
    jest wysoki;
    chcesz zliczac Clk, powinienes reagowac na zbocze zegara, nie na poziom,
    musisz uzyc 'rising_edge';
    ---
    poprawiona literowka
    j.
  • PCBway
  • Poziom 6  
    Dzięki za informacje. Wstawiłem rising_edge w następujący sposób:

    Kod: vhdl
    Zaloguj się, aby zobaczyć kod


    Teraz problem polega na tym, że od razu na diodach pojawia się wartość maksymalna. Może popełniam błąd w pliku UCF przy definiowaniu wejścia zegara:

    NET "Clock" CLOCK_DEDICATED_ROUTE = FALSE;
    NET "Reset" CLOCK_DEDICATED_ROUTE = FALSE;
    NET "Clock" LOC = "L15";
    NET "Clock" PERIOD = 1000.0 ms HIGH 50%;
    NET "OUTPUT(0)" LOC = "U18";
    NET "OUTPUT(1)" LOC = "M14";
    NET "OUTPUT(2)" LOC = "N14";
    NET "OUTPUT(3)" LOC = "L14";
    NET "Reset" LOC = "N4";

    Bardzo proszę o przyjrzenie się powyższym wyprowadzeniom, głównie chodzi mi o wejście zegara "Clock".
  • Poziom 27  
    poszukaj i przestudiuj przyklady licznikow w vhdl, bo twoj
    kod - procz bledu "rising_edge" jest, powiedzmy, brzydki;

    nie jestem pewien czy dobrze cie rozumiem, ale to co masz w pliku
    ucf, konkretnie definicje okresu zegara, ma znaczenie tylko do
    analizy czasowej, nie definiuje faktycznej czestotliwosci;
    zapewne masz jakas plytke ewaluacyjna i na niej generator
    czestotliwosci, prawdopodobnie kilkadziesiat MHz, wiec twoj licznik
    osiaga max. wartosc w kilkadziesiat nanosekund;
    by widziec 'liczenie' na diodach musisz wczesniej podzielic
    wejsciowy zegar tak, by zejsc do 1-2 Hz;
    zmien licznik z 4-bitowego na np. 28 bitowy i wyswietlaj
    na diodach najstarsze bity;

    j.
  • Poziom 6  
    Teraz działa poprawnie. Dziękuje za pomoc.