{"id":20943,"date":"2023-04-17T05:00:00","date_gmt":"2023-04-17T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=20943"},"modified":"2023-04-18T10:06:44","modified_gmt":"2023-04-18T08:06:44","slug":"wprowadzenie-do-opisu-sprzetu-w-ukladach-fpga-z-wykorzystaniem-jezyka-vhdl","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/wprowadzenie-do-opisu-sprzetu-w-ukladach-fpga-z-wykorzystaniem-jezyka-vhdl\/","title":{"rendered":"Wprowadzenie do opisu sprz\u0119tu w uk\u0142adach FPGA z wykorzystaniem j\u0119zyka VHDL"},"content":{"rendered":"\n<p>Wraz z rozwojem technologii obserwujemy r\u00f3wnie\u017c wzrost oczekiwa\u0144 u\u017cytkownik\u00f3w wobec nowych urz\u0105dze\u0144. Coraz cz\u0119\u015bciej spotykamy rozwi\u0105zania wykorzystuj\u0105ce algorytmy sztucznej inteligencji, zaawansowane techniki cyfrowego przetwarzania sygna\u0142\u00f3w czy strumieniowe przetwarzanie danych. Wymagana w tych obszarach moc obliczeniowa bywa trudna do osi\u0105gni\u0119cia z wykorzystaniem nawet wielordzeniowych procesor\u00f3w. <strong>Alternatyw\u0105 dla procesor\u00f3w<\/strong> w implementacji tego typu algorytm\u00f3w, ze wzgl\u0119du na mo\u017cliwo\u015b\u0107 zr\u00f3wnoleglenia oblicze\u0144 i potokowego przetwarzania danych, <strong>s\u0105 uk\u0142ady FPGA<\/strong> (ang. Field Programmable Gate Array).<\/p>\n\n\n\n<p>Na pocz\u0105tku artyku\u0142u zaprezentuj\u0119 opisy poziom\u00f3w abstrakcji od sprz\u0119tu w programowaniu oraz miejsce j\u0119zyk\u00f3w VHDL i Verilog w tym zestawieniu. Nast\u0119pnie om\u00f3wi\u0119 ide\u0119 i architektur\u0119 uk\u0142ad\u00f3w FPGA. W dalszej cz\u0119\u015bci przedstawi\u0119 spos\u00f3b opisu podstawowych konstrukcji w j\u0119zyku VHDL.<\/p>\n\n\n\n<p>Artyku\u0142 jest przeznaczony dla ka\u017cdego, kto jest zainteresowany nauk\u0105 j\u0119zyka VHDL i wymaga jedynie podstawowej wiedzy na temat techniki cyfrowej oraz dowolnego j\u0119zyka programowania.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Poziomy abstrakcji od sprz\u0119tu w programowaniu<\/strong><\/h2>\n\n\n\n<p>Wi\u0119kszo\u015b\u0107 os\u00f3b pracuj\u0105cych w obszarze system\u00f3w wbudowanych wykorzystuje w swojej pracy jeden z kilku j\u0119zyk\u00f3w programowania. Istnieje wiele technologii r\u00f3\u017cni\u0105cych si\u0119 mi\u0119dzy innymi poziomem abstrakcji od sprz\u0119tu. W systemach wbudowanych mo\u017cemy je podzieli\u0107 na kilka grup:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>J\u0119zyki programowania wysokiego poziomu oraz j\u0119zyki skryptowe:<ul><li>Python,<\/li><li>Java,<\/li><li>C#.<\/li><\/ul><\/li><li>J\u0119zyki programowania aplikacji:<ul><li>C,<\/li><li>C++.<\/li><\/ul><\/li><li>J\u0119zyki programowania sterownik\u00f3w i firmware:<ul><li>C,<\/li><li>Assembler.<\/li><\/ul><\/li><\/ul>\n\n\n\n<p><strong>J\u0119zyki programowania wysokiego poziomu<\/strong> charakteryzuj\u0105 si\u0119 najmniejsz\u0105 zale\u017cno\u015bci\u0105 od hardware\u2019u, na kt\u00f3rym uruchamiana jest aplikacja. Posiadaj\u0105 w\u0142asne interpretery lub wirtualne \u015brodowiska. Programista nie musi si\u0119 przejmowa\u0107 zagadnieniami niskopoziomowymi (przydzielaniem pami\u0119ci czy konfiguracj\u0105 sprz\u0119tu) i mo\u017ce skupi\u0107 si\u0119 na projektowaniu algorytm\u00f3w. Ta grupa j\u0119zyk\u00f3w \u015bwietnie nadaje si\u0119 do <strong>tworzenia interfejs\u00f3w u\u017cytkownika<\/strong> lub wysokopoziomowego opisu skomplikowanych algorytm\u00f3w niemaj\u0105cych wymaga\u0144 dotycz\u0105cych pracy w \u015bcis\u0142ym re\u017cimie czasowym.<\/p>\n\n\n\n<p><strong>J\u0119zyki programowania C i C++<\/strong> wykorzystuje si\u0119 mi\u0119dzy innymi do <strong>tworzenia aplikacji pracuj\u0105cych w systemie operacyjnym<\/strong>. Pozwalaj\u0105 one na wi\u0119ksz\u0105 kontrol\u0119 nad przydzielaniem pami\u0119ci ni\u017c<br>w przypadku j\u0119zyk\u00f3w programowania wysokiego poziomu, a tak\u017ce na wykorzystanie mechanizm\u00f3w systemowych, takich jak komunikacja mi\u0119dzyprocesowa czy metody synchronizacji. W tych j\u0119zykach mog\u0105 by\u0107 tworzone wirtualne \u015brodowiska i interpretery dla j\u0119zyk\u00f3w programowania wysokiego poziomu.<\/p>\n\n\n\n<p><strong>Na ni\u017cszej warstwie tworzone s\u0105 sterowniki i firmware<\/strong>. Sterowniki to programy z jednej strony operuj\u0105ce bezpo\u015brednio na sprz\u0119cie (czyli na pami\u0119ci i rejestrach uk\u0142ad\u00f3w peryferyjnych), a z drugiej strony posiadaj\u0105ce API (ang. Application Programming Interface) dla aplikacji tworzonych na wy\u017cszych warstwach. S\u0105 swojego rodzaju interfejsem pomi\u0119dzy aplikacjami a sprz\u0119tem.<\/p>\n\n\n\n<p>Na podobnym poziomie abstrakcji tworzony jest firmware, z t\u0105 jednak r\u00f3\u017cnic\u0105, \u017ce wykonywany jest bez u\u017cycia systemu operacyjnego. Firmware to na przyk\u0142ad oprogramowanie mikrokontroler\u00f3w. Charakterystyczna dla tego typu program\u00f3w jest <strong>silna zale\u017cno\u015b\u0107 od sprz\u0119tu<\/strong>. Na tym poziomie oprogramowanie najcz\u0119\u015bciej pisane jest w j\u0119zyku C. Mo\u017cliwe jest r\u00f3wnie\u017c tworzenie aplikacji w j\u0119zyku assembler, jednak wymaga to szczeg\u00f3\u0142owej znajomo\u015bci architektury procesora oraz jego listy instrukcji.<\/p>\n\n\n\n<p>Na ni\u017cszej warstwie ni\u017c sterowniki i firmware jest ju\u017c tylko hardware. S\u0105 to na przyk\u0142ad uk\u0142ady peryferyjne procesor\u00f3w i mikrokontroler\u00f3w takie jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>interfejsy szeregowe (UART, SPI, I2C),<\/li><li>liczniki,<\/li><li>kontrolery PWM (ang. Pulse width Modulation),<\/li><li>uk\u0142ady DMA (ang. Direct Memory Access).<\/li><\/ul>\n\n\n\n<p>Hardware\u2019em jest r\u00f3wnie\u017c sam procesor sk\u0142adaj\u0105cy si\u0119 mi\u0119dzy innymi z:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>dekodera instrukcji,<\/li><li>licznika programu,<\/li><li>licznika instrukcji,<\/li><li>rejestr\u00f3w procesora,<\/li><li>jednostki arytmetyczno-logicznej (ALU).<\/li><\/ul>\n\n\n\n<p>To w\u0142a\u015bnie na tym poziomie abstrakcji \u2013 czyli w samej warstwie sprz\u0119towej \u2013 tworzone s\u0105 projekty w uk\u0142adach FPGA.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Czym s\u0105 uk\u0142ady FPGA?<\/strong><\/h2>\n\n\n\n<p>Skr\u00f3t FPGA oznacza Field-Programmable Gate Array. Nazwa ta bardzo dobrze oddaje istot\u0119 tych uk\u0142ad\u00f3w. <strong>S\u0105 to macierze bramek<\/strong> (Gate Array) <strong>i przerzutnik\u00f3w,<\/strong> kt\u00f3re mo\u017cemy \u0142\u0105czy\u0107 w zdefiniowany przez nas spos\u00f3b. Fraza \u201eField-Programmable\u201d odnosi si\u0119 do mo\u017cliwo\u015bci zmiany tych po\u0142\u0105cze\u0144 po przeprogramowaniu. Z wykorzystaniem j\u0119zyka VHDL lub Verilog opisujemy struktury z\u0142o\u017cone<br>z pojedynczych uk\u0142ad\u00f3w cyfrowych. Opis ten mo\u017ce by\u0107 tworzony na jednym z trzech poziom\u00f3w abstrakcji:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Poziom bramek logicznych \u2013 to najni\u017cszy poziom, w kt\u00f3rym definiujemy uk\u0142ady cyfrowe poprzez po\u0142\u0105czenia pomi\u0119dzy poszczeg\u00f3lnymi bramkami i przerzutnikami. Jest to dobry punkt startowy w nauce j\u0119zyka VHDL lub Verilog poniewa\u017c pozwala zrozumie\u0107 jak opisywane struktury s\u0105 realizowane w sprz\u0119cie.<\/li><li>Poziom transferu mi\u0119dzy rejestrowego (ang. Register Transfer Level, RTL) \u2013 to najcz\u0119\u015bciej wybierany poziom abstrakcji w projektach FPGA. Pozwala skupi\u0107 si\u0119 na tworzeniu bardziej z\u0142o\u017conych konstrukcji (np. licznik\u00f3w czy maszyn stan\u00f3w). Ta metoda z jednej strony wymaga od projektanta rozumienia realizacji sprz\u0119towej opisywanych struktur, co pozwala na optymalne wykorzystanie dost\u0119pnych zasob\u00f3w sprz\u0119towych, a z drugiej strony nie wymaga planowania ka\u017cdego pojedynczego po\u0142\u0105czenia pomi\u0119dzy elementami uk\u0142adu.<\/li><li>Poziom algorytmiczny \u2013 nazywany te\u017c High-Level Synthesis, jest to poziom abstrakcji pozwalaj\u0105cy na tworzenie algorytm\u00f3w w j\u0119zykach programowania (takich jak C czy C++), kt\u00f3re s\u0105 t\u0142umaczone na odpowiadaj\u0105ce im struktury sprz\u0119towe. Niestety, takie podej\u015bcie <strong>nie pozwala na precyzyjne kontrolowanie zale\u017cno\u015bci czasowych<\/strong> (co jest jedn\u0105 z kluczowych zalet FPGA), a utworzone w ten spos\u00f3b konstrukcje nie s\u0105 optymalne pod wzgl\u0119dem zu\u017cycia zasob\u00f3w sprz\u0119towych.<\/li><\/ul>\n\n\n\n<p>Aby zrozumie\u0107, w jaki spos\u00f3b mo\u017cliwa jest konwersja opisu tekstowego na hardware, konieczna jest znajomo\u015b\u0107 architektury uk\u0142ad\u00f3w FPGA.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Architektura uk\u0142ad\u00f3w FPGA<\/strong><\/h2>\n\n\n\n<p>Przyk\u0142adow\u0105 architektur\u0119 uk\u0142ad\u00f3w FPGA przedstawia Ryc. 1.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/1-2.png\"><img decoding=\"async\" width=\"1024\" height=\"700\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/1-2-1024x700.png\" alt=\"Przyk\u0142adowa architektura uk\u0142adu FPGA\" class=\"wp-image-20944\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/1-2-1024x700.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/1-2-300x205.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/1-2-768x525.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/1-2-1536x1050.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/1-2.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 1 <a href=\"https:\/\/www.logic-fruit.com\/blog\/fpga\/fpga-design-architecture-and-applications\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Przyk\u0142adowa architektura uk\u0142adu FPGA<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<p>Mo\u017cemy wyr\u00f3\u017cni\u0107 kilka podstawowych element\u00f3w:<em><\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Konfigurowalne bloki logiczne (ang. Configurable Logic Blocks, CLB) \u2013 s\u0105 to grupy przerzutnik\u00f3w, bramek logicznych i multiplekser\u00f3w potrzebnych do realizacji podstawowych uk\u0142ad\u00f3w kombinacyjnych i sekwencyjnych.<\/li><li>Sie\u0107 po\u0142\u0105cze\u0144 \u2013 s\u0105 to fizyczne \u015bcie\u017cki pomi\u0119dzy wszystkimi CLB, kt\u00f3rych po\u0142\u0105czenie jest konfigurowane za pomoc\u0105 kluczy.<\/li><li>Klucze programowalne \u2013 s\u0105 to elementy pozwalaj\u0105ce na sterowanie po\u0142\u0105czeniami pomi\u0119dzy r\u00f3\u017cnymi CLB w celu budowania wi\u0119kszych struktur z pojedynczych bramek<br>i przerzutnik\u00f3w.<\/li><li>Sie\u0107 doprowadzenia zegar\u00f3w \u2013 doprowadza do ka\u017cdego CLB zegar w spos\u00f3b zapewniaj\u0105cy jak najmniejsze r\u00f3\u017cnice w czasach propagacji.<\/li><li>Bloki wej\u015b\u0107\/wyj\u015b\u0107 \u2013 umo\u017cliwiaj\u0105 komunikacj\u0119 z urz\u0105dzeniami zewn\u0119trznymi.<\/li><\/ul>\n\n\n\n<p>Przyk\u0142ad budowy konfigurowalnych blok\u00f3w logicznych przedstawia Ryc. 2. CLB sk\u0142ada si\u0119<br>z cz\u0119\u015bci kombinacyjnej, widocznej po lewej stronie, z\u0142o\u017conej z bramek logicznych (LUT, ang. Look-Up Table). W \u015brodkowej cz\u0119\u015bci rysunku umieszczony jest przerzutnik posiadaj\u0105cy, poza wej\u015bciem i wyj\u015bciem, po\u0142\u0105czenia do sieci zegarowej i sygna\u0142u resetu. Po prawej stronie grafiki jest multiplekser, kt\u00f3ry wybiera sygna\u0142 wyj\u015bciowy w zale\u017cno\u015bci od tego czy wykorzystano tylko cz\u0119\u015b\u0107 kombinacyjn\u0105 CLB czy r\u00f3wnie\u017c sekwencyjn\u0105.<\/p>\n\n\n\n<p>Bloki te w uk\u0142adach r\u00f3\u017cnych producent\u00f3w mog\u0105 r\u00f3\u017cni\u0107 si\u0119 liczb\u0105 i konfiguracj\u0105 przerzutnik\u00f3w, bramek czy multiplekser\u00f3w. Pozwala to na efektywniejsze wykorzystanie zasob\u00f3w sprz\u0119towych w procesach t\u0142umaczenia opisu sprz\u0119tu na po\u0142\u0105czenia pomi\u0119dzy blokami (procesy syntezy i implementacji).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/2-2.png\"><img decoding=\"async\" width=\"301\" height=\"190\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/2-2.png\" alt=\"Przyk\u0142adowy konfigurowalny blok logiczny (CLB)\" class=\"wp-image-20946\"\/><\/a><figcaption>Ryc. 2 <a href=\"https:\/\/www.fpgakey.com\/wiki\/details\/51\" rel=\"nofollow\" >Przyk\u0142adowy konfigurowalny blok logiczny (CLB)<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Etapy konwersji opisu tekstowego<\/strong><\/h2>\n\n\n\n<p>Konwersja tekstowego opisu w j\u0119zyku VHDL lub Verilog na wynikowy plik wgrywany do matrycy sk\u0142ada si\u0119 z dw\u00f3ch g\u0142\u00f3wnych etap\u00f3w. Dostarczane przez producent\u00f3w matryc IDE (ang. Integrated Development Environment) zwykle pozwala na wywo\u0142anie obu etap\u00f3w przy u\u017cyciu jednego przycisku.<\/p>\n\n\n\n<p>Pierwszym z nich jest <strong>synteza<\/strong>, kt\u00f3ra polega na zamianie tekstu na netlist\u0119 zawieraj\u0105c\u0105 struktur\u0119 opart\u0105 na przerzutnikach i bramkach, jednak bez przydzielania ich w konkretne obszary uk\u0142adu scalonego. Ten etap mo\u017cna por\u00f3wna\u0107 do rysowania schematu ideowego przez projektanta obwod\u00f3w elektronicznych.<\/p>\n\n\n\n<p>Kolejnym krokiem jest <strong>implementacja<\/strong>. Ten etap polega na pobraniu netlisty i przydzieleniu przerzutnik\u00f3w, multiplekser\u00f3w i bramek do konkretnych CLB oraz utworzeniu po\u0142\u0105cze\u0144 mi\u0119dzy nimi. Mo\u017cna to por\u00f3wna\u0107 do rysowania PCB (ang. Printed Circuit Board) na podstawie schematu ideowego. Jest to proces iteracyjny, zwykle trwaj\u0105cy najd\u0142u\u017cej. Po ustaleniu wst\u0119pnego rozmieszczenia i po\u0142\u0105cze\u0144 obliczane s\u0105 op\u00f3\u017anienia mi\u0119dzy sygna\u0142ami i zegarami.<\/p>\n\n\n\n<p>W przypadku, gdy kt\u00f3re\u015b po\u0142\u0105czenie wprowadza zbyt du\u017ce op\u00f3\u017anienie, zmieniane jest wst\u0119pnie przydzielone rozmieszczenie i proces powtarza si\u0119 do uzyskania optymalnego wyniku. Nast\u0119pnie generowany jest plik, kt\u00f3rym nale\u017cy zaprogramowa\u0107 uk\u0142ad FPGA.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>J\u0119zyk VHDL<\/strong><\/h2>\n\n\n\n<p>VHDL (ang. Very High Speed Integrated Circuit Hardware Description Language) jest j\u0119zykiem opisu sprz\u0119tu wykorzystywanym <strong>do projektowania kombinacyjnych i sekwencyjnych uk\u0142ad\u00f3w cyfrowych w uk\u0142adach FPGA<\/strong>, a tak\u017ce cyfrowych uk\u0142adach scalonych (ASIC, ang. Application-Specific Integrated Circuit). Sk\u0142adni\u0105 przypomina nieco j\u0119zyk programowania Pascal. Charakterystyczn\u0105 cech\u0105 VHDL-a jest <strong>brak wra\u017cliwo\u015bci na wielko\u015b\u0107 liter<\/strong>. W dalszej cz\u0119\u015bci om\u00f3wimy kolejne sekcje w przyk\u0142adowym pliku projektu w VHDL.[3]<\/p>\n\n\n\n<p>Na pocz\u0105tku nale\u017cy zadeklarowa\u0107 wykorzystywane w projekcie biblioteki. Podstawow\u0105 bibliotek\u0105 jest IEEE.STD_LOGIC_1164. Zawiera ona definicje podstawowych typ\u00f3w (np. <em>std_logic i std_logic_vector, natural, integer) <\/em>oraz interpretacj\u0119 wykonywanych na nich operacji.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/a.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/a.png\" alt=\"library IEEE\" class=\"wp-image-20948\" width=\"840\" height=\"82\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/a.png 895w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/a-300x29.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/a-768x76.png 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Kolejna sekcja jest definicj\u0105 port\u00f3w opisywanego komponentu. W tej cz\u0119\u015bci opisujemy powi\u0105zanie wej\u015b\u0107 i wyj\u015b\u0107 komponentu. W przysz\u0142o\u015bci zostan\u0105 one po\u0142\u0105czone z portami samej matrycy FPGA lub innymi komponentami w projekcie. Mo\u017cna powiedzie\u0107, \u017ce jest to swojego rodzaju API.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/nowy2.png\"><img decoding=\"async\" width=\"917\" height=\"271\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/nowy2.png\" alt=\"entity\" class=\"wp-image-21046\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/nowy2.png 917w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/nowy2-300x89.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/nowy2-768x227.png 768w\" sizes=\"(max-width: 917px) 100vw, 917px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Nast\u0119pna sekcja dotyczy architektury komponentu. Sk\u0142ada si\u0119 ona z dw\u00f3ch cz\u0119\u015bci oddzielonych s\u0142owem kluczowym <em>begin<\/em>. Przed jego wyst\u0105pieniem umieszczamy definicje sygna\u0142\u00f3w, niestandardowych typ\u00f3w oraz komponent\u00f3w opisanych w oddzielnych plikach. Sygna\u0142y mo\u017cemy wyobra\u017ca\u0107 sobie jako po\u0142\u0105czenia elektryczne pomi\u0119dzy bramkami i przerzutnikami. Mo\u017cemy je zdefiniowa\u0107 jako pojedyncze linie (<em>std_logic<\/em>) lub wektory z\u0142o\u017cone z kilku lini (<em>std_logic_vector<\/em>). Dla za\u0142\u0105czanych komponent\u00f3w konieczne jest zadeklarowanie port\u00f3w.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/c.png\"><img decoding=\"async\" width=\"931\" height=\"287\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/c.png\" alt=\"architecture Behavioral of DFlipFlop is\" class=\"wp-image-20952\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/c.png 931w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/c-300x92.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/c-768x237.png 768w\" sizes=\"(max-width: 931px) 100vw, 931px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Po s\u0142owie <em>begin<\/em> rozpoczyna si\u0119 sekcja opisu sprz\u0119tu. Zawiera ona konstrukcje i po\u0142\u0105czenia uk\u0142ad\u00f3w cyfrowych oraz osadzanie (czyli powi\u0105zanie port\u00f3w z sygna\u0142ami) zewn\u0119trznych komponent\u00f3w. Po\u0142\u0105czenia wykonywane poza procesem przypisuj\u0105 wej\u015bcia i wyj\u015bcia poszczeg\u00f3lnych element\u00f3w do sygna\u0142\u00f3w wewn\u0119trznych. Mo\u017cliwe w tej sekcji jest r\u00f3wnie\u017c definiowanie uk\u0142ad\u00f3w kombinacyjnych z\u0142o\u017conych z bramek logicznych.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"893\" height=\"439\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/nowy.png\" alt=\"begin\" class=\"wp-image-21042\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/nowy.png 893w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/nowy-300x147.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/nowy-768x378.png 768w\" sizes=\"(max-width: 893px) 100vw, 893px\" \/><\/figure>\n\n\n\n<p>Wewn\u0105trz procesu mo\u017cemy definiowa\u0107 zar\u00f3wno uk\u0142ady synchroniczne (wykorzystuj\u0105ce przerzutniki taktowane zegarem) jak i kombinacyjne (z\u0142o\u017cone z bramek logicznych). W tym przypadku przedstawiono struktur\u0119 przerzutnika typu D. Lista czu\u0142o\u015bci umieszczona w nawiasach za s\u0142owem kluczowym <em>process<\/em> nie ma znaczenia dla realizacji sprz\u0119towej, ale niesie wa\u017cne informacje dla symulatora. Informuje, kiedy przeprowadzi\u0107 symulacj\u0119 procesu. Brak sygna\u0142u na li\u015bcie czu\u0142o\u015bci oznacza, \u017ce jego zmiana nie wp\u0142ywa na wykonanie procesu i nie jest wymagana jego analiza. Pozwala to przyspieszy\u0107 symulacje unikaj\u0105c sytuacji, w kt\u00f3rych symulator sprawdza ka\u017cdy proces w ka\u017cdym kroku czasowym.<\/p>\n\n\n\n<p>W dalszej cz\u0119\u015bci artyku\u0142u przyjrzymy si\u0119 bardziej szczeg\u00f3\u0142owo opisom podstawowych uk\u0142ad\u00f3w w sekcji architektury.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podstawowe bloki i przyk\u0142ady w kodzie<\/strong><\/h2>\n\n\n\n<p>Znaj\u0105c struktur\u0119 plik\u00f3w projektu, mo\u017cemy przej\u015b\u0107 do przedstawienia implementacji podstawowych blok\u00f3w. Ich znajomo\u015b\u0107 jest konieczna do tworzenia bardziej skomplikowanych struktur i na ich wyja\u015bnieniu skupia si\u0119 niniejszy artyku\u0142.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Bramki logiczne<\/strong><\/h3>\n\n\n\n<p>Bramki logiczne to uk\u0142ady cyfrowe posiadaj\u0105ce jedno wyj\u015bcie, kt\u00f3rego stan jest zale\u017cny od jednego lub wi\u0119kszej liczby wej\u015b\u0107. Poni\u017cszy fragment kodu w VHDL przedstawia konstrukcje u\u017cywane do implementacji poszczeg\u00f3lnych bramek logicznych.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/e.png\"><img decoding=\"async\" width=\"865\" height=\"272\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/e.png\" alt=\"architecture Behavioral of Gates is\" class=\"wp-image-20956\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/e.png 865w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/e-300x94.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/e-768x241.png 768w\" sizes=\"(max-width: 865px) 100vw, 865px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>W tabelach poni\u017cej przedstawiono zale\u017cno\u015b\u0107 wyj\u015b\u0107 poszczeg\u00f3lnych bramek logicznych od stan\u00f3w na ich wej\u015bciach. Wyj\u015bcie bramki NOT jest negacj\u0105 wej\u015bcia. W przypadku bramki AND na wyj\u015bciu pojawi si\u0119 stan wysoki jedynie w sytuacji, gdy na obu wej\u015bciach r\u00f3wnie\u017c b\u0119dzie stan wysoki. Wyj\u015bcie bramki OR b\u0119dzie logiczn\u0105 jedynk\u0105, gdy przynajmniej jedno z jej wej\u015b\u0107 b\u0119dzie jedynk\u0105. Podobnie dzia\u0142a bramka XOR (eXclusive OR) z wykluczeniem przypadku, gdy oba wej\u015bcia b\u0119d\u0105 w stanie wysokim.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/tab.1.png\"><img decoding=\"async\" width=\"196\" height=\"134\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/tab.1.png\" alt=\"Tablica prawdy dla bramki NOT\" class=\"wp-image-20959\"\/><\/a><figcaption>Tab. 1 Tablica prawdy dla bramki NOT<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/tab.2.png\"><img decoding=\"async\" width=\"291\" height=\"178\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/tab.2.png\" alt=\"Tablica prawdy dla bramki AND\" class=\"wp-image-20961\"\/><\/a><figcaption>Tab. 2 Tablica prawdy dla bramki AND<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/tab.3.png\"><img decoding=\"async\" width=\"291\" height=\"179\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/tab.3.png\" alt=\"Tablica prawdy dla bramki OR\" class=\"wp-image-20963\"\/><\/a><figcaption>Tab. 3 Tablica prawdy dla bramki OR<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/tab.4.png\"><img decoding=\"async\" width=\"292\" height=\"180\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/tab.4.png\" alt=\"Tablica prawdy dla bramki XOR\" class=\"wp-image-20965\"\/><\/a><figcaption>Tab. 4 Tablica prawdy dla bramki XOR<\/figcaption><\/figure><\/div>\n\n\n\n<p>Na Ryc. 3 przedstawiono realizacj\u0119 sprz\u0119tow\u0105 umieszczonego wcze\u015bniej opisu w VHDL. Podstawowe funkcje logiczne zrealizowano z u\u017cyciem s\u0142\u00f3w kluczowych <em>not, and, or <\/em>i<em> xor<\/em>. Do wej\u015b\u0107 bramek przypisano wej\u015bcia projektowanego komponentu o nazwach <strong>Input1<\/strong>, <strong>Input2A<\/strong>, <strong>Input2B<\/strong>, <strong>Input3A<\/strong>, <strong>Input3B<\/strong>,<strong> Input4A<\/strong>, <strong>Input4B<\/strong>. Operator przypisania <strong>&lt;=<\/strong> s\u0142u\u017cy do po\u0142\u0105czenia wyj\u015b\u0107 bramek opisanych w omawianym fragmencie kodu po prawej stronie operatora do sygna\u0142u po jego lewej stronie.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/3.jpg\"><img decoding=\"async\" width=\"625\" height=\"601\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/3.jpg\" alt=\"Realizacja sprz\u0119towa funkcji logicznych w FPGA\" class=\"wp-image-20968\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/3.jpg 625w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/3-300x288.jpg 300w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/a><figcaption>Ryc. 3 Realizacja sprz\u0119towa funkcji logicznych w FPGA<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przerzutniki<\/strong><\/h2>\n\n\n\n<p>Przerzutniki to uk\u0142ady posiadaj\u0105ce dwa stabilne stany wyj\u015bciowe. Dzi\u0119ki temu mog\u0105 przechowywa\u0107 informacje i bywaj\u0105 nazywane elementami pami\u0119ciowymi. W uk\u0142adach FPGA najcz\u0119\u015bciej stosowany jest przerzutnik typu D. Jego dzia\u0142anie polega na przepisaniu stanu wej\u015bcia (<strong>D<\/strong>) na wyj\u015bcie (<strong>Q<\/strong>) tylko w \u015bci\u015ble okre\u015blonych momentach \u2013 na ka\u017cdym narastaj\u0105cym zboczu zegara (<strong>CLK<\/strong>). Stan wyj\u015bcia zostaje podtrzymany na ca\u0142y kolejny cykl sygna\u0142u taktuj\u0105cego. Dodatkowo przerzutnik taki ma wej\u015bcie kasuj\u0105ce (<strong>CLR<\/strong>), kt\u00f3re pozwala na wykonanie resetu. Przyk\u0142ad procesu w VHDL opisuj\u0105cego przerzutnik wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/f.png\"><img decoding=\"async\" width=\"894\" height=\"317\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/f.png\" alt=\"process\" class=\"wp-image-20970\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/f.png 894w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/f-300x106.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/f-768x272.png 768w\" sizes=\"(max-width: 894px) 100vw, 894px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Charakterystyczna dla przerzutnika struktura to umieszczona wewn\u0105trz procesu instrukcja warunkowa. Jedna z ga\u0142\u0119zi dotyczy resetu przerzutnika \u2013 definiuje, czy reset b\u0119dzie wywo\u0142ywany stanem niskim, czy wysokim oraz jaki stan zostanie ustawiony na wyj\u015bciu.<\/p>\n\n\n\n<p>Druga ga\u0142\u0105\u017a zawiera w warunku funkcj\u0119 <strong><em>rising_edge<\/em><\/strong><em>(clk).<\/em> Jest to informacja dla syntezera, jaki sygna\u0142 ma zosta\u0107 pod\u0142\u0105czony do wej\u015bcia zegarowego przerzutnika. W ga\u0142\u0119zi tej zdefiniowano, jaki sygna\u0142 zostanie pod\u0142\u0105czony do wej\u015bcia <strong>D<\/strong> przerzutnika, a jaki do jego wyj\u015bcia <strong>Q<\/strong>. Podobnie jak w przypadku bramek, po lewej stronie operatora przypisania mamy wyj\u015bcie przerzutnika, a po prawej stronie jego wej\u015bcie.<\/p>\n\n\n\n<p>Wynikow\u0105 struktur\u0119 przedstawiono na kolejnym rysunku.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/4.jpg\"><img decoding=\"async\" width=\"621\" height=\"299\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/4.jpg\" alt=\"Realizacja sprz\u0119towa przerzutnika w FPGA\" class=\"wp-image-20972\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/4.jpg 621w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/4-300x144.jpg 300w\" sizes=\"(max-width: 621px) 100vw, 621px\" \/><\/a><figcaption>Ryc. 4 Realizacja sprz\u0119towa przerzutnika w FPGA<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Multipleksery<\/strong><\/h2>\n\n\n\n<p>Multipleksery to uk\u0142ady pozwalaj\u0105ce na wyb\u00f3r jednego spo\u015br\u00f3d kilku sygna\u0142\u00f3w wej\u015bciowych i po\u0142\u0105czenie go z wyj\u015bciem. To, kt\u00f3ry z sygna\u0142\u00f3w wej\u015bciowych zostanie wybrany, zale\u017cy od stanu wej\u015bcia steruj\u0105cego (<strong>S<\/strong>). Wej\u015bcie to jest wektorem z\u0142o\u017conym z takiej ilo\u015bci bit\u00f3w, jaka jest wymagana do zaadresowania wszystkich wej\u015b\u0107. Definicja multipleksera w VHDL mo\u017ce wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/g.png\"><img decoding=\"async\" width=\"892\" height=\"251\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/g.png\" alt=\"with select\" class=\"wp-image-20974\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/g.png 892w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/g-300x84.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/g-768x216.png 768w\" sizes=\"(max-width: 892px) 100vw, 892px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Pozwala na realizacj\u0119 zale\u017cno\u015bci opisanej w Tab. 5. Efekt utworzenia takiej struktury mo\u017cna zaobserwowa\u0107 na Ryc. 5.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/tab.5.png\"><img decoding=\"async\" width=\"212\" height=\"131\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/tab.5.png\" alt=\"Zale\u017cno\u015b\u0107 komutacji sygna\u0142\u00f3w w multiplekserze od stanu na wej\u015bciu steruj\u0105cym\" class=\"wp-image-20976\"\/><\/a><figcaption>Tab. 5 Zale\u017cno\u015b\u0107 komutacji sygna\u0142\u00f3w w multiplekserze od stanu na wej\u015bciu steruj\u0105cym<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/5.png\"><img decoding=\"async\" width=\"504\" height=\"244\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/5.png\" alt=\"Realizacja sprz\u0119towa multipleksera w FPGA\" class=\"wp-image-20996\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/5.png 504w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/5-300x145.png 300w\" sizes=\"(max-width: 504px) 100vw, 504px\" \/><\/a><figcaption>Ryc. 5 Realizacja sprz\u0119towa multipleksera w FPGA<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0141\u0105czenie podstawowych blok\u00f3w<\/strong><\/h2>\n\n\n\n<p>Przedstawione wcze\u015bniej podstawowe bloki mo\u017cemy \u0142\u0105czy\u0107 w wi\u0119ksze uk\u0142ady w celu realizacji bardziej z\u0142o\u017conych funkcji. Przyk\u0142adowy projekt zawieraj\u0105cy kilka podstawowych konstrukcji om\u00f3wionych w tym artykule jest dost\u0119pny w za\u0142\u0105czniku pod nazw\u0105 <strong><em>GatesAndFlipFlop.vhd<\/em><\/strong>.<\/p>\n\n\n\n<p>Na pocz\u0105tku pliku umieszczono deklaracje bibliotek oraz definicj\u0119 port\u00f3w. Komponent posiada kilka wej\u015b\u0107 (<strong>Input1<\/strong>&#8230;<strong>Input4B, SelectInput<\/strong>) oraz jedno wyj\u015bcie (<strong>Output1<\/strong>). Porty <strong>clk<\/strong> i <strong>rstn<\/strong> to odpowiednio sygna\u0142 zegarowy i sygna\u0142 resetu dla cz\u0119\u015bci sekwencyjnej uk\u0142adu. Po\u0142\u0105czenia wewn\u0119trzne wykonano za pomoc\u0105 sygna\u0142\u00f3w, kt\u00f3rych deklaracje umieszczono przed s\u0142owem kluczowym <em>begin<\/em> w sekcji architektury.&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<p>W dalszej cz\u0119\u015bci wej\u015bcia komponentu zosta\u0142y przypisane do wej\u015b\u0107 czterech bramek logicznych, a porty wyj\u015bciowe bramek przypisano do sygna\u0142\u00f3w wewn\u0119trznych. Nast\u0119pnie wyj\u015bcia z bramek trafiaj\u0105 na wej\u015bcia multipleksera. W zale\u017cno\u015bci od stanu wej\u015bcia steruj\u0105cego <strong>SelectInput<\/strong> na wyj\u015bciu multipleksera pojawi si\u0119 wynik jednej z czterech funkcji logicznych. W ostatniej cz\u0119\u015bci architektury wyj\u015bcie multipleksera jest \u201ezatrzaskiwane\u201d w takt zegara przez umieszczony za nim przerzutnik.<\/p>\n\n\n\n<p>Uzyskan\u0105 struktur\u0119 przedstawiono na Ryc. 6.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/6.jpg\"><img decoding=\"async\" width=\"919\" height=\"460\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/6.jpg\" alt=\"Realizacja sprz\u0119towa uk\u0142adu z\u0142o\u017conego z bramek, multipleksera i przerzutnika\" class=\"wp-image-20981\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/6.jpg 919w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/6-300x150.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/6-768x384.jpg 768w\" sizes=\"(max-width: 919px) 100vw, 919px\" \/><\/a><figcaption>Ryc. 6 Realizacja sprz\u0119towa uk\u0142adu z\u0142o\u017conego z bramek, multipleksera i przerzutnika<\/figcaption><\/figure><\/div>\n\n\n\n<p>Dla powy\u017cszego projektu przeprowadzono symulacj\u0119, a jej wyniki przedstawiono na Ryc. 7.<\/p>\n\n\n\n<p>Do przerzutnika doprowadzony jest sygna\u0142 zegarowy (<strong>clk<\/strong>) o sta\u0142ej cz\u0119stotliwo\u015bci oraz sygna\u0142 resetu (<strong>rstn<\/strong>). Reset jest aktywowany poziomem niskim na linii <strong>rstn<\/strong> i utrzymywany przez pierwsze 100 nanosekund symulacji. Po zmianie stanu linii <strong>rstn<\/strong> na wysoki przerzutnik przenosi na wyj\u015bcie stan swojego wej\u015bcia na ka\u017cdym narastaj\u0105cym zboczu zegara <strong>clk<\/strong>.<\/p>\n\n\n\n<p>Do ka\u017cdej z bramek doprowadzono sygna\u0142y (<strong>Input1<\/strong>&#8230;<strong>Input4B<\/strong>) zmieniaj\u0105ce si\u0119 w przedstawiony na wykresie spos\u00f3b, powoduj\u0105c zmian\u0119 stanu pod\u0142\u0105czonych do multipleksera wyj\u015b\u0107 bramek&nbsp;(<strong>InternalSignal1<\/strong>&#8230;<strong>InternalSignal4<\/strong>). Wej\u015bcie steruj\u0105ce multipleksera (<strong>SelectInput<\/strong>) jest zmieniane w taki spos\u00f3b, aby po kolei \u0142\u0105czy\u0107 wyj\u015bcia poszczeg\u00f3lnych bramek z wej\u015bciem przerzutnika. Na symulacji momenty zmiany warto\u015bci wej\u015bcia steruj\u0105cego oznaczono z wykorzystaniem pionowych kursor\u00f3w.<\/p>\n\n\n\n<p>W okresie pomi\u0119dzy 100 nanosekund a 140 nanosekund do wyj\u015bcia multipleksera doprowadzony jest sygna\u0142 z wyj\u015bcia bramki NOT. W kolejnych przedzia\u0142ach czasowych \u2013 z wyj\u015b\u0107 odpowiednio bramek AND, OR i XOR. Przebiegi sygna\u0142\u00f3w na wej\u015bciach bramek dobrano tak, aby poda\u0107 na nie ka\u017cd\u0105 mo\u017cliw\u0105 kombinacj\u0119 wej\u015b\u0107.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<p>W ostatnim etapie wyj\u015bcie multipleksera (<strong>MuxOutput<\/strong>) trafia na wej\u015bcie <strong>D<\/strong> przerzutnika. W efekcie mo\u017cemy zaobserwowa\u0107 przesuni\u0119cie pomi\u0119dzy wyj\u015bciem multipleksera (<strong>MuxOutput<\/strong>) a wyj\u015bciem <strong>Q<\/strong> przerzutnika (<strong>Output1<\/strong>) o dok\u0142adnie jeden cykl zegara.<\/p>\n\n\n\n<p>Z&nbsp;wykorzystaniem takich symulacji mo\u017cliwa jest analiza dzia\u0142ania uk\u0142adu w poszczeg\u00f3lnych punktach projektu. Ze wzgl\u0119du na d\u0142ugi czas trwania proces\u00f3w syntezy i implementacji, kt\u00f3rych wej\u015bciem jest projekt w VHDL, a wyj\u015bciem plik wgrywany do uk\u0142adu FPGA, symulacje s\u0105 kluczowym narz\u0119dziem pozwalaj\u0105cym na weryfikacj\u0119 dzia\u0142ania komponentu jeszcze przed rozpocz\u0119ciem wspomnianych proces\u00f3w.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/7.jpg\"><img decoding=\"async\" width=\"1024\" height=\"474\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/7-1024x474.jpg\" alt=\"Wyniki symulacji uk\u0142adu z\u0142o\u017conego z bramek, multipleksera i przerzutnika\" class=\"wp-image-20983\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/7-1024x474.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/7-300x139.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/7-768x356.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/7.jpg 1041w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 7 Wyniki symulacji uk\u0142adu z\u0142o\u017conego z bramek, multipleksera i przerzutnika<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Zako\u0144czenie<\/strong><\/h2>\n\n\n\n<p>W artykule, poza kwestiami zwi\u0105zanymi bezpo\u015brednio z FPGA, zosta\u0142o przedstawione zestawienie r\u00f3\u017cnych poziom\u00f3w abstrakcji i wskazanie granicy pomi\u0119dzy sprz\u0119tem a oprogramowaniem. Istotne jest, aby nie traktowa\u0107 kodu w VHDL tak, jak programu wykonywanego sekwencyjnie, a raczej jako metod\u0119 na modelowanie i \u0142\u0105czenie uk\u0142ad\u00f3w cyfrowych.<\/p>\n\n\n\n<p>Maj\u0105c na uwadze te aspekty, du\u017co \u0142atwiej zrozumie\u0107, czym s\u0105 uk\u0142ady FPGA, a znaj\u0105c podstawowe konstrukcje, mo\u017cliwe jest tworzenie uk\u0142ad\u00f3w cyfrowych na poziomie RTL, co powala grupowa\u0107 przerzutniki w rejestry, a bramki w funkcje logiczne.<\/p>\n\n\n\n<p>Umo\u017cliwia to tworzenie struktur takich jak liczniki, mno\u017cniki czy maszyny stan\u00f3w, a nawet procesory czy bloki obliczeniowe. Z wykorzystaniem odpowiednio du\u017cej liczby CLB mo\u017cna zaprojektowa\u0107 hardware, pozwalaj\u0105cy zr\u00f3wnolegli\u0107 obliczenia w algorytmach sztucznej inteligencji [4] czy budowa\u0107 tory przetwarzania sygna\u0142\u00f3w z\u0142o\u017cone z kilku modu\u0142\u00f3w po\u0142\u0105czonych kaskadowo jak w OFDM [5] czy innych systemach radiowych [6].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Bibliografia<\/strong><\/h2>\n\n\n\n<p>[1] <a href=\"https:\/\/www.logic-fruit.com\/blog\/fpga\/fpga-design-architecture-and-applications\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >FPGA Design, Architecture and Applications<\/a>, Dheeraj Punia, 07.12.2021<\/p>\n\n\n\n<p>[2] <a href=\"https:\/\/www.fpgakey.com\/wiki\/details\/51\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >FPGAkey.com<\/a><\/p>\n\n\n\n<p>[3] <a href=\"https:\/\/ieeexplore.ieee.org\/document\/4772740?tp=&amp;isnumber=4772739&amp;arnumber=4772740&amp;punumber=4772738\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >IEEE Standard VHDL Language Reference Manual<\/a><\/p>\n\n\n\n<p>[4] S. Yin et al., <a href=\"https:\/\/ieeexplore.ieee.org\/stamp\/stamp.jsp?tp=&amp;arnumber=8328868\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >A high throughput acceleration for hybrid neural networks with efficient resource management on FPGA<\/a>, IEEE Trans. Comput.-Aided Design Integr. Circuits Syst., vol. 38, no. 4, pp. 678\u2013691, Apr. 2019<\/p>\n\n\n\n<p>[5] Mohamed Salah, Abdel-Halim Zekry, Mohammed Kamel, <a href=\"https:\/\/ieeexplore.ieee.org\/stamp\/stamp.jsp?tp=&amp;arnumber=7050447\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >An efficient FPGA implementation of OFDM physical layer for SDR-based applications<\/a>, 2014 10th International Computer Engineering Conference (ICENCO) <\/p>\n\n\n\n<p>[6] Q. Zhang, L. Cheng and C. Yin, <a href=\"https:\/\/ieeexplore.ieee.org\/stamp\/stamp.jsp?tp=&amp;arnumber=7015037\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Design of Multichannel Dual-frequency Digital Receiver based on FPGA,<\/a> 2014 12th International Conference on Signal Processing, (ICSP), Hangzhou, 2014, pp. 403-407<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p><strong>Za\u0142\u0105cznik: <\/strong><\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-c912ccfa-88bf-4355-96d8-36a5286531eb\" href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/GatesAndFlipFlop.txt\">GatesAndFlipFlop<\/a><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/GatesAndFlipFlop.txt\" class=\"wp-block-file__button\" download aria-describedby=\"wp-block-file--media-c912ccfa-88bf-4355-96d8-36a5286531eb\">Pobierz<\/a><\/div>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Na naszym blogu znajdziesz r\u00f3wnie\u017c <a aria-label=\"inne artyku\u0142y obszaru Embedded (opens in a new tab)\" href=\"https:\/\/sii.pl\/blog\/all\/embedded\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">inne artyku\u0142y obszaru Embedded<\/a>. <\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;20943&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;3&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 3)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Wprowadzenie do opisu sprz\u0119tu w uk\u0142adach FPGA z wykorzystaniem j\u0119zyka VHDL&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 3)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Wraz z rozwojem technologii obserwujemy r\u00f3wnie\u017c wzrost oczekiwa\u0144 u\u017cytkownik\u00f3w wobec nowych urz\u0105dze\u0144. Coraz cz\u0119\u015bciej spotykamy rozwi\u0105zania wykorzystuj\u0105ce algorytmy sztucznej inteligencji, &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/wprowadzenie-do-opisu-sprzetu-w-ukladach-fpga-z-wykorzystaniem-jezyka-vhdl\/\">Continued<\/a><\/p>\n","protected":false},"author":500,"featured_media":20987,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":11,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[563,1677,1528,1678],"class_list":["post-20943","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-embedded","tag-fpga","tag-jezyk-programowania","tag-vhdl"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/Wprowadzenie-do-opisu-sprzetu-w-ukladach-FPGA-z-wykorzystaniem-jezyka-VHDL-.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20943"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/500"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=20943"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20943\/revisions"}],"predecessor-version":[{"id":21054,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20943\/revisions\/21054"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/20987"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=20943"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=20943"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=20943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}