[QUARTUS] Narzędzia do obróbki układów programowalnych

Tu jest miejsca na dyskusje nad innymi programami wspomagającymi prace elektronika przy projektowaniu pcb itp. ale również można tu wstawiać tematy związane z innymi programami typu CAD

Moderator: ZbeeGin

Regulamin forum
Temat należy poprzedzić nazwa programu ujętą w kwadratowe nawiasy np. [KiCAD]
Awatar użytkownika
gaweł
Expert
Expert
Posty: 616
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

[QUARTUS] Narzędzia do obróbki układów programowalnych

Postautor: gaweł » poniedziałek 11 cze 2018, 13:44

QUARTUS
środowisko projektowe dla układów
PLD firmy ALTERA

ql_qrts00.jpg


...zamykam drzwi, spalę wszystkie mosty...https://www.youtube.com/watch?v=kaaKo99j3QM

Oprogramowanie do realizacji projektów w strukturach programowalnych oferowanych przez firmę Altera można pobrać ze strony internetowej (http://www.altera.com). Aktualnie dostępne oprogramowanie Quartus, wersja 9.0, nie wymaga licencji. Starsze wersje, które można znaleźć na płytach CD i DVD dołączanych przykładowo do czasopisma „Elektronika Praktyczna” wymagają właściwej licencji. Z tego powodu pokazany jest sposób uzyskania licencji.
ql_qrts01.png
Po wejściu na stronę internetową należy najechać myszką na „Downloads & Licensing”. Spowoduje to pojawienie się nowego menu, z którego należy wybrać opcję: „Quartus II Web Edition (Free)”. Pobranie wersji instalacyjnej oprogramowania wymaga zalogowania się (z ewentualną rejestracją, jeżeli realizowane jest to po raz pierwszy). Sugeruje to informacja na stronie:
ql_qrts02.png
Klikając na odpowiedni przycisk „Download” przechodzimy do autoryzacji.
ql_qrts03.png
Mając utworzone w serwisie Altery konto, należy wpisać w „User Name” oraz „Password” odpowiednie dane i nacisnąć przycisk „Sign-In”. W przeciwnym wypadku należy utworzyć konto klikając na „Create Account”.
Po zalogowaniu się w serwisie uzyskana jest możliwość pobrania wersji instalacyjnej oprogramowania.
ql_qrts04.png
W tym celu, na dole strony, należy kliknąć na „Click to Download Your File Now” oraz następnie na „Zapisz”.
ql_qrts05.png
Po ściągnięciu pliku należy uzyskać licencję na używanie oprogramowanie. Plik licencji zostanie przysłany do nas ze strony Altery drogą e-mail (jako załącznik). Czasami może to trochę potrwać.
Licencja pozwalająca używać oprogramowanie Quartus jest udzielana na 6 miesięcy i jest „przywiązana” do komputera. Do uzyskania licencji należy kliknąć na „License your software”.
ql_qrts06.png
Otwiera to kolejną stronę.
ql_qrts07.png
gdzie należy wybrać „Quartus – II Web Edition”.
Na następnej stronie należy kliknąć na „Quartus II Web Edition software and the ModelSim-Altera Web Edition software”.
ql_qrts08.png
Otwiera to kolejną stronę.
ql_qrts09.png
Do uzyskania licencji należy podać numer karty sieciowej komputera, w którym będzie uruchamiane oprogramowanie (w rzeczywistości przywiązanie licencji do komputera jest przywiązaniem do numeru karty sieciowej). Numer ten uzyskuje się w następujący sposób.
W oknie programu cmd.exe należy użyć polecenie: ipconfig -all.
ql_qrts10.png
Poszukiwany numer to „Adres fizyczny”. Jest to sześciobajtowa liczba w zapisie szesnastkowym. W tym przypadku to 00-0D-61-0D-DC-BA. Należy wpisać ją w odpowiednim okienku (już bez kresek) oraz zaznaczyć odpowiednie opcje.
ql_qrts11.png
Po kliknięciu na „Continue” pozostało cierpliwie trochę poczekać, procedura uzyskania licencji chwilowo jest zakończona.
ql_qrts12.png
Samo zainstalowanie oprogramowania nie sprawia problemów (poza tym, że to trochę trwa).
Otrzymany drogą e-mail plik licencji należy umieścić w kartotece quartus, która znajduje się w strukturze kartotek c:\altera. Przy pierwszym uruchomieniu programu QUARTUS, należy wskazać plik licencji.
ql_qrts13.png
W tym celu należy wybrać opcję „Tools” i następnie „License Setup”.
ql_qrts14.png
Otwiera to kolejne okno, w którym w polu „License file:” należy podać nazwę pliku licencji lub korzystając z przycisku „...” wskazać właściwy plik. Operację licencjonowania należy zakończyć przyciskiem „OK”.
Po zakończeniu procesu licencjonowania, program Quartus jest gotowy do pracy. Można teraz przystąpić do opracowania przykładowego projektu, który zostanie uruchomiony w zestawie DE2. Będzie to licznik binarny wyświetlający wynik w postaci czterech liczb w zapisie szesnastkowym.
ql_qrts28.jpg
Tworząc pierwszy projekt należy z menu „File” wybrać opcję „New Project Wizard”.
ql_qrts15.png
i w okienku dialogowym określić niezbędne szczegóły:
ql_qrts16.png
W polu „What is the working ….” należy podać nazwę kartoteki przeznaczonealtera jako wynik instalacji oprogramowania,j na projekt. Z powodu, że używana jest wersja oprogramowania o symbolu v7.2, na dysku znajduje się następująca struktura kartotek:
  • c:\altera jako wynik instalacji oprogramowania,
  • w niej lokalnie kartoteka 72sp1 jako wynik instalacji oprogramowania,
  • w niej lokalnie kartoteka quartus jako wynik instalacji oprogramowania,
  • w niej lokalnie kartoteka project utworzona ręcznie na przechowywanie projektów.
W polu „What is the name of this project” podać nazwę projektu (automatycznie jest zaproponowana nazwa dla pliku komponentu głównego, najwyższego w hierarchii). Klikając na „Next” przechodzimy do kolejnego etapu specyfikacji projektu. Może to być żądanie potwierdzenia utworzenia nowego katalogu na projekt.
ql_qrts17.png
W kolejnym kroku do projektu można dołączyć istniejące pliki (jeżeli takie są).
ql_qrts18.png
Po naciśnięciu przycisku „Next” przechodzimy do kolejnej planszy pozwalającej określić użyty układ PLD.
ql_qrts19.png
W użytym zestawie znajduje się układ z rodziny Cyclone II o symbolu EP2C35F672 i taki należy zaznaczyć na liście dostępnych układów. Wybór zakończony jest przyciskiem „Next”.
ql_qrts20.png
Kolejna plansza: przycisk „Next”. Został utworzony pusty (nie zawierający żadnych plików źródłowych) projekt. W kolejnym kroku należy utworzyć i dodać do projektu nowy plik zawierający opis w języku VHDL. W tym celu należy użyć opcji „File” i „New”.
ql_qrts21.png
To otwiera kolejne okienko dialogowe pozwalające na określenie wszystkich niezbędnych szczegółów.
ql_qrts22.png
Należy wybrać „VHDL File” na oznaczenie, że nowotworzony plik zawierać będzie opis w języku VHDL. Plik automatycznie zostaje otwarty do edycji jako pusty. W dalszej kolejności z klawiatury należy wprowadzić jego treść.
ql_qrts23.png
Po utworzeniu treści pliku należy zapisać go na dysku. W tym celu należy wybrać opcję „File” oraz „Save as”. W kolejnym okienku dialogowym należy podać nazwę pliku, jaka zostanie mu nadana.
W identyczny sposób należy utworzyć kolejny plik zawierający opis komponentu (projekt składa się z dwóch komponentów: głównego oraz transkodera liczb 4-bitowych na postać wymaganą przez wyświetlacze 7-segmentowe.
Mając gotowe wszystkie pliki wchodzące w skład projektu nożna dokonać jego syntezy. W tym celu należy wybrać opcję „Processing” i następnie „Start Compilation”. Poprawna synteza zakończona jest następującym komunikatem.
ql_qrts24.png
Uzyskane w wyniku przetwarzania dane jeszcze nie nadają się do zaprogramowania układu PLD, gdyż nie jest jeszcze szczegółowo określone przyporządkowanie sygnałów sprzęgających komponent główny do fizycznych wyprowadzeń układu. Należy utworzyć odpowiedni plik określający przyporządkowania. Można to cierpliwie wyklikać (posługując się dokumentacją zestawu startowego DE2) lub „pójść na skróty”. Należy pobrać z internetu plik opisujący wszystkie możliwe dla zestawu uruchomieniowego wyprowadzenia. Posługując się google nie jest to zbyt skomplikowane, plik nazywa się „DE2_pin_assignments.csv”. Za pomocą dowolnego edytora, z pliku należy usunąć niepotrzebne zapisy (istniejące opisy wyprowadzeń są wystarczająco czytelne by pozostawić tylko niezbędne: sygnał zegarowy, sygnał resetu oraz przyłączenie wyświetlacza 7-segmentowego) jednocześnie zmieniając jego nazwę na właściwą dla projektu cnt.csv. W dalszej kolejności należy „poinformować oprogramowanie” o przyporządkowaniu poszczególnym sygnałom komponentu głównego właściwych wyprowadzeń. Należy wybrać opcję „Assignments” oraz „Import Assigments”.
ql_qrts25.png
To otworzy okienko dialogowe pozwalające na wskazanie właściwego pliku. Klikając na przycisk „...” obok pola „File name” oprogramowanie umożliwi wskazanie właściwego pliku.
ql_qrts26.png
ql_qrts27.png
Po tej operacji należy przeprowadzić syntezę układu (już zawierającą właściwe przyporządkowanie wyprowadzeń). Jej wynikiem jest utworzenie pliku zawierającego dane do skonfigurowania układu PLD. Operację programowania, jako czynność umieszczenia odpowiednich danych wewnątrz układu, również realizuje oprogramowanie QUARTUS. W tym celu należy wybrać opcję „Tools” i następnie „Programmer”.
ql_qrts29.png
Wbudowany w oprogramowanie QUARTUS programator może posiłkować się róznymi rozwiązaniami technicznymi. Zestaw uruchomieniowy DE2 ma wbudowany standardowy (JTAG) interfejs programujący, który jest przyłączony do komputera poprzez złącze USB. Przy pierwszym uruchomieniu programu obsługującego interfejs JTAG należy go odpowiednio skonfigurować. W tym celu należy kliknąć na przycisk „Hardware Setup”.
ql_qrts30.png
W kolejnym okienku w polu „Currenty selected hardware” wybrać „USB-Blaster” (taki interfejs znajduje się w zestawie DE2). Po określeniu niezbędnych parametrów można przystąpić do operacji programowania.
ql_qrts31.png
By uruchomić proces programowania należy kliknąć na przycisk „Start”. W polu „Progress” będzie pokazywany stan zaawansowania operacji. Po jej zakończeniu można podziwiać działanie.
ql_qrts32.jpg
Plik modułu głównego [Cnt.vhd]:

Kod: Zaznacz cały

(…)
library IEEE ;
use IEEE.STD_LOGIC_1164.ALL ;
use IEEE.STD_LOGIC_ARITH.ALL ;
use IEEE.STD_LOGIC_UNSIGNED.ALL ;

entity Cnt is port ( Clk : in std_logic ;
                     Reset : in std_logic ;
                     Disp1 : out std_logic_vector ( 6 downto 0 ) ;
                     Disp2 : out std_logic_vector ( 6 downto 0 ) ;
                     Disp3 : out std_logic_vector ( 6 downto 0 ) ;
                     Disp4 : out std_logic_vector ( 6 downto 0 ) ;
                     Disp5 : out std_logic_vector ( 6 downto 0 ) ;
                     Disp6 : out std_logic_vector ( 6 downto 0 ) ;
                     Disp7 : out std_logic_vector ( 6 downto 0 ) ;
                     Disp8 : out std_logic_vector ( 6 downto 0 ) ) ;
end Cnt ;

architecture Behavioral of Cnt is

  component HexConv port ( Tetr : in std_logic_vector ( 3 downto 0 ) ;
                           Segm : out std_logic_vector ( 6 downto 0 ) ) ;
  end component ;

  signal FClk : std_logic ;
  signal FDivCnt : std_logic_vector ( 15 downto 0 ) ;
  signal PClk : std_logic ;
  signal PDivCnt : std_logic_vector ( 7 downto 0 ) ;
  signal BinCnt : std_logic_vector ( 15 downto 0 ) ;

begin
  PClk <= PDivCnt ( 7 ) ;
  FClk <= FDivCnt ( 15 ) ;

  PDivInstance : process ( Reset , Clk )
  begin
    if Reset = '0' then
      PDivCnt <= ( others => '0' ) ;
    else
      if Clk'event and Clk = '0' then
        PDivCnt <= PDivCnt + 1 ;
      end if ;
    end if ;
  end process ;

  FDivInstance : process ( Reset , PClk )
  begin
    if Reset = '0' then
      FDivCnt <= ( others => '0' ) ;
    else
      if PClk'event and PClk = '0' then
        FDivCnt <= FDivCnt + 1 ;
      end if ;
    end if ;
  end process ;

  CntInstance : process ( Reset , FClk )
  begin
    if Reset = '0' then
      BinCnt <= ( others => '0' ) ;
    else
      if FClk'event and FClk = '0' then
        BinCnt <= BinCnt + 1 ;
      end if ;
    end if ;
  end process ;

  Disp1Instance : HexConv port map ( Tetr => BinCnt ( 3 downto 0 ) ,
                                     Segm => Disp1 ) ;

  Disp2Instance : HexConv port map ( Tetr => BinCnt ( 7 downto 4 ) ,
                                     Segm => Disp2 ) ;

  Disp3Instance : HexConv port map ( Tetr => BinCnt ( 11 downto 8 ) ,
                                     Segm => Disp3 ) ;

  Disp4Instance : HexConv port map ( Tetr => BinCnt ( 15 downto 12 ) ,
                                     Segm => Disp4 ) ;

  Disp5 <= ( others => '1' ) ;
  Disp6 <= ( others => '1' ) ;
  Disp7 <= ( others => '1' ) ;
  Disp8 <= ( others => '1' ) ;

end Behavioral ;
oraz moduł pomocniczy [HexhConv.vhd]:

Kod: Zaznacz cały

(…)
library IEEE ;
use IEEE.STD_LOGIC_1164.ALL ;
use IEEE.STD_LOGIC_ARITH.ALL ;
use IEEE.STD_LOGIC_UNSIGNED.ALL ;

entity HexConv is port ( Tetr : in std_logic_vector ( 3 downto 0 ) ;
                         Segm : out std_logic_vector ( 6 downto 0 ) ) ;
end HexConv ;

architecture Behavioral of HexConv is

begin
-- przyporządkowanie segmentów w Segments
--      0
--     --- 
--  5 |   | 1
--     ---   <- 6
--  4 |   | 2
--     ---
--      3
  with Tetr select
    Segm <= "1111001" when "0001" ,  --1
            "0100100" when "0010" ,  --2
            "0110000" when "0011" ,  --3
            "0011001" when "0100" ,  --4
            "0010010" when "0101" ,  --5
            "0000010" when "0110" ,  --6
            "1111000" when "0111" ,  --7
            "0000000" when "1000" ,  --8
            "0010000" when "1001" ,  --9
            "0001000" when "1010" ,  --A
            "0000011" when "1011" ,  --b
            "1000110" when "1100" ,  --C
            "0100001" when "1101" ,  --d
            "0000110" when "1110" ,  --E
            "0001110" when "1111" ,  --F
            "1000000" when others ;  --0

end Behavioral ;
Plik określający przyporządkowanie wyprowadzeń [cnt.csv]:

Kod: Zaznacz cały

# Quartus II Version 5.1 Internal Build 160 09/19/2005 TO Full Version,
# File: D:\de2_pins\de2_pins.csv,
# Generated on: Wed Sep 28 09:40:34 2005,

# Note: The column header names should not be changed if you wish to import this .csv file into the Quartus II software.,

To,Location
Disp1[0],PIN_AF10
Disp1[1],PIN_AB12
Disp1[2],PIN_AC12
Disp1[3],PIN_AD11
Disp1[4],PIN_AE11
Disp1[5],PIN_V14
Disp1[6],PIN_V13
Disp2[0],PIN_V20
Disp2[1],PIN_V21
Disp2[2],PIN_W21
Disp2[3],PIN_Y22
Disp2[4],PIN_AA24
Disp2[5],PIN_AA23
Disp2[6],PIN_AB24
Disp3[0],PIN_AB23
Disp3[1],PIN_V22
Disp3[2],PIN_AC25
Disp3[3],PIN_AC26
Disp3[4],PIN_AB26
Disp3[5],PIN_AB25
Disp3[6],PIN_Y24
Disp4[0],PIN_Y23
Disp4[1],PIN_AA25
Disp4[2],PIN_AA26
Disp4[3],PIN_Y26
Disp4[4],PIN_Y25
Disp4[5],PIN_U22
Disp4[6],PIN_W24
Disp5[0],PIN_U9
Disp5[1],PIN_U1
Disp5[2],PIN_U2
Disp5[3],PIN_T4
Disp5[4],PIN_R7
Disp5[5],PIN_R6
Disp5[6],PIN_T3
Disp6[0],PIN_T2
Disp6[1],PIN_P6
Disp6[2],PIN_P7
Disp6[3],PIN_T9
Disp6[4],PIN_R5
Disp6[5],PIN_R4
Disp6[6],PIN_R3
Disp7[0],PIN_R2
Disp7[1],PIN_P4
Disp7[2],PIN_P3
Disp7[3],PIN_M2
Disp7[4],PIN_M3
Disp7[5],PIN_M5
Disp7[6],PIN_M4
Disp8[0],PIN_L3
Disp8[1],PIN_L2
Disp8[2],PIN_L9
Disp8[3],PIN_L6
Disp8[4],PIN_L7
Disp8[5],PIN_P9
Disp8[6],PIN_N9
Reset,PIN_G26
Clk,PIN_N2
Oryginalny plik de2_pin_assignments.csv (można go znaleźć w internecie) zawiera opisy wyprowadzeń, do których przyłączone są elementy wchodzące w skład zestawu uruchomieniowego. Odpowiednie opisy dotyczą:
  • SW – przełączniki,
  • DRAM_xxx – pamięć dynamiczna SDRAM,
  • FL_xxx – pamięć FLASH,
  • HEX0 .. HEX7 – poszczególne cyfry wyświetlacza 7-segmentowego,
  • KEY – przyciski klawiatury,
  • LEDR – diody LED czerwone,
  • LEDG – diody LED zielone,
  • CLOCK_27 – sygnał zegarowy 27MHz,
  • CLOCK_50 – sygnał zegarowy 50MHz,
  • EXT_CLOCK – zewnętrzny sygnał zegarowy,
  • PS_xxx – złącze PS,
  • UART_xxx – interfejs szeregowy RS232,
  • LCD_xxx – moduł wyświetlacza LCD,
  • SRAM_xxx – pamięć statyczna RAM,
  • OTG_xxx – interfejs USB,
  • VGA_xxx – generator sygnału dla monitorów VGA
  • TD_xxx – dekoder TV,
  • AUD_xxx – kodek AUDIO,
  • ENET_xxx – interfejs ethernet,
  • IRDA_xxx – interfejs IRDA,
  • SD_xxx – karta pamięci SD,
  • GPIO_xxx – złącze rozszerzeń.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Expert
Expert
Posty: 616
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [QUARTUS] Narzędzia do obróbki układów programowalnych

Postautor: gaweł » poniedziałek 11 cze 2018, 20:48

QUARTUS - Projekt SERAIL1
prosty nadajnik asynchronicznej
transmisji szeregowej


quartus_ii.png


Proste rozwiązanie kontrolera nadajnika asynchronicznej transmisji szeregowej zostaje zrealizowany w układzie FPGA oferowanym przez firmę Altera (dokładniej w środowisku zestawu DE2 z układem z rodziny CYCLONE II). Do realizacji projektu jest użyte oprogramowanie narzędziowe QUARTUS II w wersji 11.1.
Z założeń projektowych, układ ma za zadanie na żądanie (naciśnięcie odpowiedniego przycisku) wysłać 8-bitowy znak, który może być odebrany przez dowolne urządzenie mające możliwość odbierania danych szeregowych (przykładowo przez komputer PC z popularnym programem HyperTerminal). Z transmisją szeregową związane są przede wszystkim dwa parametry: prędkość transmisji (tu będzie 9600 bitów na sekundę) oraz tryb transmisji (tu będzie transmisja 8 bitów bez bitu parzystości z jednym bitem stopu).
Ogólną koncepcję przedstawia rysunek.
pic01.png
W skład projektu wchodzą dwa komponenty:
  • SERIALISE.VHD – komponent przeznaczony do realizacji wysłania pojedynczego znaku,
  • SERIAL1.VHD – komponent sterujący pracą podrzędnego komponentu (SERIALISE.VHD) oraz stanowiący interfejs komunikacyjny z użytkownikiem.
Komponent realizujący transmisję szeregową (SERIALISE.VHD) ma następujące sygnały sterujące:
  • SerialClk – sygnał zegarowy taktujący transmisję szeregową,
  • Reset – sygnał zerowania transmitera (stan aktywny: logiczne zero), po wyzerowaniu kontroler jest w stanie oczekiwania na zlecenie transmisji,
  • SendReq – sygnał żądania transmisji (stan aktywny: logiczne zero) – po wykryciu żądania transmisji, komponent zapamiętuje wysyłane dane (SendRegister) oraz przechodzi do realizacji wysłania szeregowo danych, po zakończeniu wysyłania ustawiany jest wskaźnik kończenia transmisji (SendReadyFlag) i układ przechodzi do oczekiwania na wysłanie kolejnego bajtu,
  • SendRegister – 8-bitowe dane do wysłania,
  • Sout – wyjście szeregowe nadajnika,
  • SendReadyFlag – wskaźnik zakończenia nadawania danych (stan aktywny: logiczne zero), wystąpienie stanu aktywnego jest sygnałem dla warstwy nadrzędnej, że kontroler jest gotowy do przyjęcia kolejnych danych do wysłania.
Automat sterujący konwersją danych z formatu równoległego na format szeregowy działa w oparciu o następujące stany:
  • IdleState – stan bezczynności (stan jałowy) jako stan oczekiwania na zlecenie transmisji danych,
  • SendBitStart – stan rozpoczęcia nadawania (nadanie bitu startu),
  • SendBitD0 – stan nadawania danych (nadawanie bitu o indeksie 0),
  • SendBitD1 – stan nadawania danych (nadawanie bitu o indeksie 1),
  • SendBitD2 – stan nadawania danych (nadawanie bitu o indeksie 2),
  • SendBitD3 – stan nadawania danych (nadawanie bitu o indeksie 3),
  • SendBitD4 – stan nadawania danych (nadawanie bitu o indeksie 4),
  • SendBitD5 – stan nadawania danych (nadawanie bitu o indeksie 5),
  • SendBitD6 – stan nadawania danych (nadawanie bitu o indeksie 6),
  • SendBitD7 – stan nadawania danych (nadawanie bitu o indeksie 7),
  • SendBitStop – stan nadawania bitu stopu,
  • SendEndBit – stan zakończenia nadawania i ustawienia wskaźnika gotowości do przyjęcia kolejnych danych.
Działanie automatu jest zrealizowane według grafu (rysunek poniżej). Po sygnale
pic02.png
zerującym automat ustawia się w stanie IdleState i pozostaje w tym stanie aż do wystąpienia zlecenia transmisji danych. W tym stanie na wyjściu szeregowym jest stan logicznej jedynki (cisza transmisyjna). Rozpoczęcie transmisji oznacza nadanie bitu startu (stan logicznego zera) i w dalszej kolejności bitów nadawanych danych (stan logiczny odpowiadający nadawanym danym). Po wysłaniu wszystkich bitów danych, automat przechodzi do nadania bitu stopu (stan logicznego zera) i przechodzi do sygnalizacji zakończenia transmisji danych. Po realizacji wszystkich czynności automat przechodzi do oczekiwania na zlecenie zadania kolejnych danych.
Tekst modułu jest następujący:

Kod: Zaznacz cały

(…)
entity Serialise is port ( SerialClk     : in std_logic ;
                           Reset         : in std_logic ;
                           SendReq       : in std_logic ;
                           SendRegister  : in std_logic_vector ( 7 downto 0 ) ;
                           SOut          : out std_logic ;
                           SendReadyFlag : out std_logic ) ;
end Serialise ;

architecture Behavioral of Serialise is

  type SerialTransmStateType is ( IdleState ,
                                  SendBitStart ,
                                  SendBitD0 ,
                                  SendBitD1 ,
                                  SendBitD2 ,
                                  SendBitD3 ,
                                  SendBitD4 ,
                                  SendBitD5 ,
                                  SendBitD6 ,
                                  SendBitD7 ,
                                  SendBitStop ,
                                  SendEndBit ) ;
--                           Definicja stanów automatu sterującego.
  signal ShiftReg : std_logic_vector ( 7 downto 0 ) ;
--                           Lokalny rejestr nadawanych danych, do tego rejestru
--                           zatrzaśnięte są dane w chwili wykrycia żądania transmisji.
  signal TransmState : SerialTransmStateType ;
--                           Aktualny stan automatu.
  signal Complete : std_logic ;
--                           Lokalny sygnał będący flagą zakończenia transmisji (tu
--                           jest jako zatrzask (latch), którego wyjście jest przekazane
--                           na zewnątrz komponentu jako sygnał SendReadyFlag.
  signal SendReqFlag : std_logic ;
--                           Lokalny sygnał żądania transmisj (jako rejestr typu zatrzask (latch).

begin

  SendReadyFlag <= Complete ;
 
  process ( Reset , SendReq , Complete )
--                           Realizacja obsługi wykrycia żądania transmisji. Sygnał
--                           zerowania Reset ustawia rejestr SendReqFlag do stanu
--                           logicznej jedynki (brak żądania transmisji). Wejściowy
--                           sygnał SendReq (zewnętrzne żądanie transmisji) generuje
--                           wewnętrzne żądanie transmisji pod warunkiem, że w
--                           bieżącej chwili automat nie realizuje transmisji (eliminuje
--                           kolejne zlecenie transmisji przed zakończeniem bieżącej
--                           transmisji). Dodatkowo rozwiązany jest problem
--                           przedłużającego się zlecenia żądania transmisji
--                           (przypadek, gdy wejściowy sygnał żądania transmisji
--                           jest nadal w stanie aktywnym pomimo, że zlecona
--                           transmisja została zakończona). Do kolejnego zlecenia
--                           transmisji zewnętrzny sygnał żądania nadawania musi
--                           zostać wycofany, w innym przypadku nie zostanie
--                           ustawiona flaga gotowości (zapobiega to nadawaniu
--                           w kółko tych samych danych w sytuacji, gdy zewnętrzny
--                           sygnał żądania transmisji jest zbyt mocno przedłużony w czasie).
  begin
    if Reset = '0' then
       SendReqFlag <= '1' ;
    else
      if SendReq = '0' then
        if Complete = '0' then
          SendReqFlag <= '1' ;
        else
          SendReqFlag <= '0' ;
        end if ;
      else
        if Complete = '0' then
          SendReqFlag <= '1' ;
        end if ;
      end if ;
    end if ;
  end process ;

  SerialiseAutomatInstance : process ( SerialClk , Reset )
--                           Realizacja automatu sterującego nadawaniem kolejnych
--                           bitów danych i sterowanie linią wyjściową SOut.
  begin
    if Reset = '0' then
      TransmState <= IdleState ;
      Complete <= '1' ;
      SOut <= '1' ;
    else
      if SerialClk'event and SerialClk = '0' then
        case TransmState is
          when IdleState =>
            Complete <= '1' ;
            SOut <= '1' ;
            if SendReqFlag = '0' then
              TransmState <= SendBitStart ;
            else
              TransmState <= IdleState ;
            end if ;
          when SendBitStart =>
            ShiftReg <= SendRegister ;
            Complete <= '0' ;
            SOut <= '0' ;
            TransmState <= SendBitD0 ;
          when SendBitD0 =>
            Complete <= '0' ;
            SOut <= ShiftReg ( 0 ) ;
            TransmState <= SendBitD1 ;
          when SendBitD1 =>
            Complete <= '0' ;
            SOut <= ShiftReg ( 1 ) ;
            TransmState <= SendBitD2 ;
          when SendBitD2 =>
            Complete <= '0' ;
            SOut <= ShiftReg ( 2 ) ;
            TransmState <= SendBitD3 ;
          when SendBitD3 =>
            Complete <= '0' ;
            SOut <= ShiftReg ( 3 ) ;
            TransmState <= SendBitD4 ;
          when SendBitD4 =>
            Complete <= '0' ;
            SOut <= ShiftReg ( 4 ) ;
            TransmState <= SendBitD5 ;
          when SendBitD5 =>
            Complete <= '0' ;
            SOut <= ShiftReg ( 5 ) ;
            TransmState <= SendBitD6 ;
          when SendBitD6 =>
            Complete <= '0' ;
            SOut <= ShiftReg ( 6 ) ;
            TransmState <= SendBitD7 ;
          when SendBitD7 =>
            Complete <= '0' ;
            SOut <= ShiftReg ( 7 ) ;
            TransmState <= SendBitStop ;
          when SendBitStop =>
            Complete <= '0' ;
            SOut <= '0' ;
            TransmState <= SendEndBit ;
          when SendEndBit =>
            Complete <= '1' ;
            SOut <= '1' ;
            TransmState <= IdleState ;
        end case ;
      end if ;
    end if ;
  end process ;

end Behavioral ;
Komponent SERIAL1.VHD jest komponentem zarządzającym pracą opisanego wyżej komponentu obsługi transmisji oraz zawiera elementy związane z interfejsem do komunikacji z użytkownikiem. Komunikacja ta stanowi:
  • obsługę przycisku zlecenia wysłania danych (po wysłaniu danych są one inkrementowane, przez co nadawane są kolejne znaki),
  • obsługę 8-cyfrowego 7-segmentowego wyświetlacza LED, co pozwala sygnalizować nadawane dane (dane są wyświetlane w formie binarnej),
  • sygnalizacji poprzez 4 lampki LED wybranych sygnałów sterujących.
Istotnym zadaniem tego komponentu jest wygenerowanie sygnału taktującego transmisją szeregową (ma to wpływ na prędkość transmisji).
Działanie komponentu oparte jest o automat sterujący, którego zadaniem jest wykrycie naciśnięcia odpowiedniego przycisku zlecającego nadanie pojedynczego znaku i następnie właściwe wygenerowania sygnału żądania transmisji dla komponentu SERIALISE.VHD, oczekiwanie na zakończenie transmisji bieżącego znaku (jako flaga gotowości z komponentu SERIALISE.VHD) i zinkrementowanie rejestru danych przed kolejnym wysłaniem.
Tekst modułu jest następujący:

Kod: Zaznacz cały

(...)
entity Serial1 is port ( Clk       : in std_logic ;
                         Reset     : in std_logic ;
                         InpKey    : in std_logic ;
                         SOut      : out std_logic ;
                         Disp1     : out std_logic_vector ( 6 downto 0 ) ;
                         Disp2     : out std_logic_vector ( 6 downto 0 ) ;
                         Disp3     : out std_logic_vector ( 6 downto 0 ) ;
                         Disp4     : out std_logic_vector ( 6 downto 0 ) ;
                         Disp5     : out std_logic_vector ( 6 downto 0 ) ;
                         Disp6     : out std_logic_vector ( 6 downto 0 ) ;
                         Disp7     : out std_logic_vector ( 6 downto 0 ) ;
                         Disp8     : out std_logic_vector ( 6 downto 0 ) ;
                         TraceLed0 : out std_logic ;
                         TraceLed1 : out std_logic ;
                         TraceLed2 : out std_logic ;
                         TraceLed3 : out std_logic ) ;
end Serial1 ;

architecture Behavioral of Serial1 is

  component Serialise port ( SerialClk     : in std_logic ;
                             Reset         : in std_logic ;
                             SendReq       : in std_logic ;
                             SendRegister  : in std_logic_vector (7 downto 0) ;
                             SOut          : out std_logic ;
                             SendReadyFlag : out std_logic ) ;
  end component ;

  type ReqAutomatStateType is ( ReqIdleState        ,
                                StartReq1State      ,
                                StartReq2State      ,
                                WaitToClerState     ,
                                WaitToCler2State    ,
                                EndState            ) ;
--                           Deklaracja stanów automatu sterującego:
--                           * ReqIdleState – stan bezczynności automatu
--                             (sygnał zerowania ustawia automat w tym stanie),
--                           * StartReq1State oraz StartReq2State – wygenerowanie
--                             sygnału żądania wysłania znaku jako sygnału zsynchronizowanego
--                             z sygnałem taktującym transmisją,
--                           * WaitToClerState – oczekiwania na flagę gotowości,
--                           * WaitToCler2State – oczekiwanie na zwolnienie przycisku
--                             żądania transmisji przed kolejnym zleceniem,
--                           * EndState – inkrementacja rejestru danych do następnego
--                           zlecenia transmisji i przejście do kolejnego oczekiwania na
--                           naciśnięcie przycisku zlecenia nadawania.
  signal ReqAutomatState : ReqAutomatStateType ;
  signal PClk : std_logic ;
  signal SpeedClk : std_logic ;
  signal InpKeyStable : std_logic ;
  signal TransferReq : std_logic ;
  signal ReadyFlag : std_logic ;
  signal PCntDivider : std_logic_vector ( 5 downto 0 ) ;
  signal SpeedDivider : std_logic_vector ( 6 downto 0 ) ;
  signal DataReg : std_logic_vector ( 7 downto 0 ) ;
  signal KeyReg : std_logic_vector ( 7 downto 0 ) ;

begin

  PrescallerDivInstance : process ( Reset , Clk )
--                           Wstępny podzielnik częstotliwości zegara (50 MHz).
  begin
    if Reset = '0' then
      PCntDivider <= ( others => '0' ) ;
    else
      if Clk'event and Clk = '0' then
        PCntDivider <= PCntDivider + 1 ;
      end if ;
    end if ;
  end process ;
  PClk <= PCntDivider ( 5 ) ;

  SpeedClk <= SpeedDivider ( 6 ) ;

  SpeedDivInstance : process ( Reset , PClk )
--                           Podzielnik częstotliwości sygnału zegarowego ze wstępnego
--                           podzielnika do wygenerowania sygnału taktującego transmisją
--                           szeregową dającą prędkość 9600 bitów na sekundę.
  begin
    if Reset = '0' then
      SpeedDivider <= ( others => '0' ) ;
    else
      if PClk'event and PClk = '0' then
        if SpeedDivider = "1010000" then
          SpeedDivider <= ( others => '0' ) ;
        else
          SpeedDivider <= SpeedDivider + 1 ;
        end if ;
      end if ;
    end if ;
  end process ;

  KeyInstance : process ( Reset , PClk )
--                           Usuwanie „dzwonienia” styków przycisku zlecenia transmisji.
  begin
    if Reset = '0' then
      KeyReg <= ( others => '1' ) ;
    else
      if PClk'event and PClk = '0' then
        KeyReg <= KeyReg  ( 6 downto 0 ) & InpKey ;
      end if ;
    end if ;
  end process ;

  InpKeyStable <= '0' when KeyReg = "00000000" else '1' ;
--                           Wygenerowanie stabilnego sygnału naciśnięcia przycisku.

  ControlInstance : process ( Reset , PClk )
--                           Automat sterujący procesem nadawania kolejnych danych.
  begin
    if Reset = '0' then
      TransferReq <= '1' ;
      ReqAutomatState <= ReqIdleState ;
      DataReg <= "01000000" ;
    else
      if PClk'event and PClk = '0' then
        case ReqAutomatState is
          when ReqIdleState =>
            if InpKeyStable = '0' then
              ReqAutomatState <= StartReq1State ;
              TransferReq <= '0' ;
            else
              ReqAutomatState <= ReqIdleState ;
              TransferReq <= '1' ;
            end if ;
          when StartReq1State =>
            if SpeedClk = '0' then
              ReqAutomatState <= StartReq1State ;
            else
              ReqAutomatState <= StartReq2State ;
            end if ;
          when StartReq2State =>
            if SpeedClk = '1' then
              ReqAutomatState <= StartReq2State ;
            else
              ReqAutomatState <= WaitToClerState ;
            end if ;
          when WaitToClerState =>
            TransferReq <= '1' ;
            ReqAutomatState <= WaitToCler2State ;
          when WaitToCler2State =>
            if InpKeyStable = '0' then
              ReqAutomatState <= WaitToCler2State ;
            else
              ReqAutomatState <= EndState ;
            end if ;
          when EndState =>
            if ReadyFlag = '1' then
              ReqAutomatState <= ReqIdleState ;
              DataReg <= DataReg + 1 ;
            else
              ReqAutomatState <= EndState ;
            end if ;
        end case ;
      end if ;
    end if ;
  end process ;

--                           Przyłączenie kontrolera transmisji szeregowej
--                           do komponentu sterującego.
  SerialInstance : Serialise port map ( SerialClk => SpeedClk ,
                                        Reset => Reset ,
                                        SendReq => TransferReq ,
                                        SendRegister => DataReg ,
                                        SOut => SOut ,
                                        SendReadyFlag => ReadyFlag ) ;
--                           Obsługa kolejnych cyfr wyświetlacza.
  with DataReg ( 7 ) select
    Disp8 <= "1111001" when '1' ,     --1
             "1000000" when others ;  --0
  with DataReg ( 6 ) select
    Disp7 <= "1111001" when '1' ,     --1
             "1000000" when others ;  --0
  with DataReg ( 5 ) select
    Disp6 <= "1111001" when '1' ,     --1
             "1000000" when others ;  --0
  with DataReg ( 4 ) select
    Disp5 <= "1111001" when '1' ,     --1
             "1000000" when others ;  --0
  with DataReg ( 3 ) select
    Disp4 <= "1111001" when '1' ,     --1
             "1000000" when others ;  --0
  with DataReg ( 2 ) select
    Disp3 <= "1111001" when '1' ,     --1
             "1000000" when others ;  --0
  with DataReg ( 1 ) select
    Disp2 <= "1111001" when '1' ,     --1
             "1000000" when others ;  --0
  with DataReg ( 0 ) select
    Disp1 <= "1111001" when '1' ,     --1
             "1000000" when others ;  --0
--                           Obsługa lampek LED do śledzenia wybranych sygnałów.
  TraceLed0 <= ReadyFlag ;
  TraceLed1 <= not TransferReq ;
  TraceLed2 <= InpKeyStable ;
  TraceLed3 <= not Reset ;
end Behavioral ;
Przyporządkowanie poszczególnych sygnałów komponentu do wybranych elementów zestawu DE2 jest następujące:
Sygnał → Element w DE2
Clk → Wbudowany generator sygnału zegarowego o częstotliwości 50MHz
Reset → Przycisk KEY 0
InpKey → Przycisk KEY 3
SOut → Wbudowany interfejs RS232 (UART_TXD)
Disp1 → Wyświetlacz HEX 0
Disp2 → Wyświetlacz HEX 1
Disp3 → Wyświetlacz HEX 2
Disp4 → Wyświetlacz HEX 3
Disp5 → Wyświetlacz HEX 4
Disp6 → Wyświetlacz HEX 5
Disp7 → Wyświetlacz HEX 6
Disp8 → Wyświetlacz HEX 7
TraceLed0 → Dioda LEDG0
TraceLed1 → Dioda LEDG2
TraceLed2 → Dioda LEDG3
TraceLed3 → Dioda LEDG1
Tekst pliku opisującego przyporządkowanie sygnałów do odpowiednich wyprowadzeń układu jest następujący:

Kod: Zaznacz cały

FPGA # Quartus II Version 5.1 Internal Build 160 09/19/2005 TO Full Version,
# File: D:\de2_pins\de2_pins.csv,
# Generated on: Wed Sep 28 09:40:34 2005,
# Note: The column header names should not be changed if you wish to import this .csv file into the Quartus II software.,
To,Location
Clk,PIN_N2
Reset,PIN_G26
InpKey,PIN_W26
SOut,PIN_B25
Disp1[0],PIN_AF10
Disp1[1],PIN_AB12
Disp1[2],PIN_AC12
Disp1[3],PIN_AD11
Disp1[4],PIN_AE11
Disp1[5],PIN_V14
Disp1[6],PIN_V13
Disp2[0],PIN_V20
Disp2[1],PIN_V21
Disp2[2],PIN_W21
Disp2[3],PIN_Y22
Disp2[4],PIN_AA24
Disp2[5],PIN_AA23
Disp2[6],PIN_AB24
Disp3[0],PIN_AB23
Disp3[1],PIN_V22
Disp3[2],PIN_AC25
Disp3[3],PIN_AC26
Disp3[4],PIN_AB26
Disp3[5],PIN_AB25
Disp3[6],PIN_Y24
Disp4[0],PIN_Y23
Disp4[1],PIN_AA25
Disp4[2],PIN_AA26
Disp4[3],PIN_Y26
Disp4[4],PIN_Y25
Disp4[5],PIN_U22
Disp4[6],PIN_W24
Disp5[0],PIN_U9
Disp5[1],PIN_U1
Disp5[2],PIN_U2
Disp5[3],PIN_T4
Disp5[4],PIN_R7
Disp5[5],PIN_R6
Disp5[6],PIN_T3
Disp6[0],PIN_T2
Disp6[1],PIN_P6
Disp6[2],PIN_P7
Disp6[3],PIN_T9
Disp6[4],PIN_R5
Disp6[5],PIN_R4
Disp6[6],PIN_R3
Disp7[0],PIN_R2
Disp7[1],PIN_P4
Disp7[2],PIN_P3
Disp7[3],PIN_M2
Disp7[4],PIN_M3
Disp7[5],PIN_M5
Disp7[6],PIN_M4
Disp8[0],PIN_L3
Disp8[1],PIN_L2
Disp8[2],PIN_L9
Disp8[3],PIN_L6
Disp8[4],PIN_L7
Disp8[5],PIN_P9
Disp8[6],PIN_N9
TraceLed0,PIN_AE22
TraceLed1,PIN_W19
TraceLed2,PIN_V18
TraceLed3,PIN_AF22


Can you remember, remember my name
As I flow through your life
A thousand oceans I have flown
And cold spirits of ice
All my life
I am the echo of your past
I am returning, the echo of a point in time
And distant faces shine
A thousand warriors I have known
And laughing as the spirits appear
All your life
Shadows of another day
And if you hear me talking on the wind
You've got to understand
We must remain
Perfect Strangers
I know I must remain inside this silent well of sorrow
A strand of silver hanging through the sky
Touching more than you see
The voice of ages in your mind
Is aching with the dead of the night
Precious life
(your tears are lost in falling rain)
And if you hear me talking on the wind
You've got to understand
We must remain
Perfect Strangers
https://www.youtube.com/watch?v=gZ_kez7WVUU
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse


Wróć do „Inne”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość