{"id":488784,"date":"2016-10-21T22:47:12","date_gmt":"2016-10-21T21:47:12","guid":{"rendered":"http:\/\/antonpotocnik.com\/?p=488784"},"modified":"2017-08-25T15:40:46","modified_gmt":"2017-08-25T14:40:46","slug":"private-redpitaya-fpga-project-2-double-knight-rider-lights","status":"publish","type":"post","link":"https:\/\/antonpotocnik.com\/?p=488784","title":{"rendered":"Red Pitaya FPGA Project 2 \u2013 Knight Rider Lights"},"content":{"rendered":"<h2 style=\"text-align: justify;\">Introduction<\/h2>\n<p style=\"text-align: justify;\">A blinking LED is one thing, but a true light show is something one can actually be proud of. In the <a href=\"https:\/\/antonpotocnik.com\/?p=487360\" target=\"_blank\">previous post <\/a>we built a very simple FPGA program that made one LED\u00a0on Red Pitaya blink. For such a simple project we constructed the necessary logic by graphically connecting different blocks in Vivado&#8217;s <em>IP Integrator<\/em> without writing a single line of code. Of course, not all applications will be so simple and we will eventually have to learn hardware definition language (HDL). To get acquainted with Verilog HDL we will in this project build FPGA program for Red Pitaya where eight lights slide like in the cult series <a href=\"https:\/\/www.youtube.com\/watch?v=Mo8Qls0HnWo\" target=\"_blank\">the Knight Rider<\/a>.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.youtube.com\/watch?v=Mo8Qls0HnWo\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-488818 size-full\" src=\"https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/KnightRiderImg.jpg\" alt=\"knight_rider_img\" width=\"400\" height=\"81\" \/><\/a><\/p>\n<h2 style=\"text-align: justify;\">Verilog Module<\/h2>\n<p style=\"text-align: justify;\">In order to make Red Pitaya simulate Knight Rider light sequence we will use Verilog language to write a custom module that will provide logic behind the continuous light sequence. There are two popular hardware description languages: <a href=\"https:\/\/en.wikipedia.org\/wiki\/VHDL\" target=\"_blank\">VHDL <\/a>and <a href=\"https:\/\/en.wikipedia.org\/wiki\/Verilog\" target=\"_blank\">Verilog<\/a>. We will choose the later since most of the official Red Pitaya FPGA code is written in Verilog and because it is somewhat similar to C programming language which some readers might be familiar with. Once <em>knight_rider<\/em> module will be written we will test it and then incorporate it in the block design we created in the<a href=\"https:\/\/antonpotocnik.com\/?p=487360\" target=\"_blank\"> previous project<\/a>. We will also demonstrate how to use the parallel nature of a FPGA to create a double Knight Rider light sequence.<\/p>\n<p style=\"text-align: justify;\">To start off open or create LED blinker project 1 in Vivado as described in the <a href=\"https:\/\/antonpotocnik.com\/?p=487360\" target=\"_blank\">previous post<\/a>. Once the project is opened create a new source file (<em>Project Manager -&gt; Add Sources -&gt; Add or create design sources<\/em>), choose file type: <em>Verilog<\/em> and file name: <em>knight_rider<\/em>. When asked to set modules ports click OK and confirm to use default settings. Open the newly created source file by double clicking on the <em>knight_rider.v<\/em> under <em>Design Sources<\/em> in <em>Sources<\/em> tab.<\/p>\n<p style=\"text-align: justify;\">We are ready to enter our Verilog code. Replace the content of the file with the following code:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nmodule knight_rider(\r\n    input clk,\r\n    output &#x5B;7:0] led_out\r\n    );\r\n    \r\n    parameter LEDS_INIT = 10'b1100000000;\r\n    parameter DIR_INIT = 1;\r\n    \r\n    reg &#x5B;9:0] leds = LEDS_INIT; \/\/ register for led output\r\n    reg &#x5B;3:0] position = DIR_INIT*8; \/\/ state counter 0-15 \r\n    reg direction = DIR_INIT;   \/\/ direction indicator\r\n\r\n    always @ (posedge clk) \r\n    begin\r\n        if (direction == 0) begin\r\n            leds &lt;= leds &lt;&lt; 1;  \/\/ bit-shift leds register\r\n        end else begin\r\n            leds &lt;= leds &gt;&gt; 1;  \/\/ bit-shift leds register\r\n        end\r\n        position &lt;= position + 1;\r\n    end\r\n\r\n    always @*                  \/\/ change direction \r\n    begin        \r\n        if (position &lt; 8) begin      \/\/ in the second half \r\n            direction = 0;\r\n        end else begin\r\n            direction = 1;\r\n        end\r\n    end\r\n\r\n    assign led_out = leds&#x5B;8:1]; \/\/ wire output and leds register\r\n    \r\nendmodule\r\n<\/pre>\n<p style=\"text-align: justify;\">At the top of the code we first declare the module&#8217;s name<em> knight_rider<\/em> with <em>clk<\/em> as input and 8-bit wide <em>led_out <\/em>as output port<em>.<\/em> Below the module&#8217;s declaration we find definition of internal registers. Here, for example, <em>reg<\/em> <em>[3:0] position<\/em> means that <em>position<\/em> is a 4-bit register with<em> reg[3]<\/em> being the most- (MSB) and <em>reg[0]<\/em> being the least-significant bit (LSB). The <em>parameters LEDS_INIT<\/em> and <em>DIR_INIT<\/em> are constants defined at the design level.<\/p>\n<p style=\"text-align: justify;\">Below the internal register definitions one can find the first <em>always@(sensitivity_list)<\/em> block. This procedural block is executed at each change of the signals listed in the sensitivity list. In our case the block will be executed on each positive edge of the <em>clk<\/em> signal. Following the always statement is the <em>begin<\/em>&#8211;<em>end<\/em> block where the code is executed sequentially as we are used in the procedural programming. Keep in mind that the code will be ultimately implemented as logic circuits with gates, flip-flops and wires. In the same way there can be several independent circuits on the FPGA we can use several <em>always<\/em> blocks in a module, all running in parallel. A good practice is to write several short procedural blocks, for which it is almost possible to guess their implementation, and then connect them so they perform a task.<\/p>\n<p style=\"text-align: justify;\">Our first <em>always<\/em> block assigns a new value to <em>leds<\/em> and <em>position<\/em> registers at each clock cycle depending on the value of the <em>direction<\/em> register. We use bit-shift operators (&gt;&gt;, &lt;&lt;) to achieve Knight Rider&#8217;s sliding effect. In this block we only use <em>non-blocking assignment<\/em> (&lt;=) which assigns the values only when all the right-hand side expressions are evaluated, effectively at the end of the block. In this case the order of assignment is not defined and we should be careful that our code does not depend on that.<\/p>\n<p style=\"text-align: justify;\">The second <em>always<\/em> block is sensitive to any signals in the always block. During the first 8 clock cycles direction of bit-shifts will be towards the left and in the second 8 cycles direction will be towards the right. Since\u00a0<em>position<\/em> is a 4-bit register it will reset to 0 as soon as it will exceed its largest value (15). This will reset and start over the 16-count sequence where two lit LEDs move from one end to the other and back. In the second <em>always<\/em> block we use <em>blocking assignment<\/em> (=) to assign to <em>direction<\/em> register. As the name suggests this will block the execution until the right-hand side of the expression is evaluated and then immediately assign the value to the register on the left-hand side. In this way the register will be updated at the next line in code. Blocking assignment is usually used within the <em>always<\/em> blocks when we want to get a logic circuit made of gates and not latches or flip-flops. It is a good practice not to mix blocking and non-blocking assignments within one <em>always<\/em> block.<\/p>\n<p style=\"text-align: justify;\">The last line in the module uses the third assignment method using an <em>assign<\/em> keyword. This assignment is used to directly wire registers and ports or in our case the subset of bits from the <em>leds<\/em> register to the <em>led_out<\/em> port. Due to the direct wiring any change in the <em>leds<\/em> register will be immediately propagated to the output port.<\/p>\n<p style=\"text-align: justify;\">This was a very quick introduction to some of the Verilog language concepts. To get a more complete introduction there is a number of good\u00a0online tutorials and books that can help you. Some of the links can be found in the Literature section at the end of this post. Now, that we wrote our first module we need to test it.<\/p>\n<h2 style=\"text-align: justify;\">Simulation<\/h2>\n<p style=\"text-align: justify;\">We will use Vivado&#8217;s integrated <em>Simulator<\/em> to test the module\u00a0and\u00a0debug the code. Simulation is done using a new test bench module where we define a time dependent input signals, instantiate the module under test and collect the output signals. To create a test bench module click on <em>Add Sources<\/em> -&gt; <em>Add or create simulation sources<\/em>, then create a file with file type: Verilog and file name: <em>knight_rider_tb.v.<\/em> No ports need to be defined under Define Module dialog.<\/p>\n<p style=\"text-align: justify;\">Once the<em> knight_rider_tb.v<\/em> file is created open it and replace its content with the following code:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n`timescale 1ns \/ 1ps\r\n\r\nmodule knight_rider_tb();\r\n        \r\n    reg clock;\r\n    wire &#x5B;7:0] out;\r\n\r\n    knight_rider kr (.clk(clock),\r\n                     .led_out(out)\r\n                    );\r\n    \r\n    initial begin\r\n        clock = 0;\r\n        forever #1 clock = ~clock;\r\n    end\r\n    \r\nendmodule\r\n<\/pre>\n<p style=\"text-align: justify;\">The test bench module defines a register called <em>clock<\/em> and 8-bit wire called <em>out.<\/em> After the register and wire declaration we define (on line 8) an instance of <em>knight_rider<\/em> module with a name <em>kr<\/em> and connect register<em> clock<\/em> to knight_rider&#8217;s port <em>clk <\/em> and wire <em>out<\/em> to knight_rider&#8217;s port <em>led_out<\/em>. Note that we use <em>wire<\/em> for the <em>out <\/em>register since we only need to display it on the Simulator&#8217;s waveform graph.<\/p>\n<p style=\"text-align: justify;\">The final part of the test bench module is the <em>initial<\/em> block where we set the initial value of the clock register and then toggle it forever with 1 ns delay specified by <em>#1<\/em> after <em>forever<\/em> keyword. The unit of time and the simulation resolution is defined at the top of the code with the statement: <em>`timescale 1ns \/ 1ps<\/em>.<\/p>\n<p style=\"text-align: justify;\">We are ready to simulate the behavior of our module. Save the test bench file and set it as top by right clicking on the file in the <em>Source tab<\/em> and choose<em> Set as Top<\/em>. Next, we click on <em>Run Simulation<\/em> button on the left hand side of the window and choose <em>Run Behavioral Simulation. <\/em>To properly display the results use <em>View-&gt;Zoom in<\/em> or <em>View-&gt;<\/em><em>Zoom fit<\/em> functions to zoom in to the first 50 ns of the simulated waveform. You can also expand wire <em>out<\/em> to see the value of individual bits. We can add internal registers of <em>knight_rider<\/em> module to our waveform by dragging them from <em>knight_rider-&gt;kr<\/em> icon under <em>Scopes<\/em> panel to the list of signals at the left-hand side of the black waveform region. In the picture below you can see that we added <em>position<\/em> and <em>direction<\/em> registers. To update the waveform click on <em>Run-&gt;Restart<\/em> and <em>Run-&gt;Run For &#8230;<\/em>\u00a0buttons in the main menu. You can change the format of displayed numbers in the waveform by right clicking on the signal name in the waveform region and choosing for example <em>Radix -&gt; Unsigned Decimal<\/em>.<\/p>\n<div id=\"attachment_501950\" style=\"width: 1067px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-501950\" class=\"wp-image-501950 size-full\" src=\"https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_-1.png\" width=\"1057\" height=\"339\" srcset=\"https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_-1.png 1057w, https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_-1-300x96.png 300w, https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_-1-768x246.png 768w, https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_-1-1024x328.png 1024w\" sizes=\"auto, (max-width: 1057px) 100vw, 1057px\" \/><\/a><p id=\"caption-attachment-501950\" class=\"wp-caption-text\">knight_rider&#8217;s simulation waveform<\/p><\/div>\n<p style=\"text-align: justify;\">In Vivado we can also debug our code by inserting breakpoints in Verilog&#8217;s code. This can be done by clicking on the empty circles that appear right from the line numbers in Vivado&#8217;s text editor. Other debugging functions such as <em>Restart &#8230;<\/em>, <em>Run For &#8230;<\/em>, <em>Step<\/em>, <em>Break<\/em>, etc.\u00a0can be found in the toolbar or in the <em>Run<\/em> menu. Fore more information on simulation and debugging see <a href=\"https:\/\/www.xilinx.com\/support\/documentation\/sw_manuals\/xilinx2016_1\/ug937-vivado-design-suite-simulation-tutorial.pdf\" target=\"_blank\">Xilinx&#8217;s logic simulation tutorial<\/a>.<\/p>\n<p style=\"text-align: justify;\">After inspecting the simulated waveform we happily conclude that the <em>knight_rider<\/em> module performs as expected. We are ready to incorporate it into the block design.<\/p>\n<h3 style=\"text-align: justify;\">Block Design<\/h3>\n<p style=\"text-align: justify;\">Any module in the Vivado&#8217;s source folder can be added to the block diagram by right-clicking on the block design&#8217;s white canvas and choosing <em>Add Module &#8230;<\/em> Click on the <em>knight_rider<\/em> module and confirm. A new block with RTL icon appears in the block diagram. To incorporate it into the structure we connect <em>clk<\/em> port to the output of <em>xlslice_0<\/em> block and <em>led_out<\/em> port to the <em>led_o<\/em> external port as shown in the figure below. Note that from Vivado 2016.3 <em>util_ds_buf_1<\/em> and <em>util_ds_buf_2<\/em> have to be connected for a successful implementation.<br \/>\n<a href=\"https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-488821 size-full\" src=\"https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider.png\" alt=\"knight_rider\" width=\"1307\" height=\"611\" srcset=\"https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider.png 1307w, https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider-300x140.png 300w, https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider-768x359.png 768w, https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider-1024x479.png 1024w\" sizes=\"auto, (max-width: 1307px) 100vw, 1307px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">We can set the constant parameters of the module by double-clicking on the <em>knight_rider_0<\/em> block and setting the two parameters as shown below.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nLEDS_INIT = &quot;1100000000&quot;\r\nDIR_INIT = 0\r\n<\/pre>\n<p style=\"text-align: justify;\">Knight rider module uses all 8 available LEDs on the Red Pitaya board. To connect the module&#8217;s output to all of them we need to change the width of the external <em>led_o<\/em> port from currently 1 to 8 bits. This can be done by setting <em>led_o<\/em> port&#8217;s LEFT parameter to 7 under the port properties (select the <em>led_o<\/em> port on the block design and locate properties dialogue at the left-hand side of the <em>IP Integrator<\/em>). In the <em>xlslice_0<\/em> block set both <em>Din From<\/em> and <em>Din Down To<\/em> fields to 23.<\/p>\n<p style=\"text-align: justify;\">The project is ready for synthesis, implementation and generating bitstream. As we learned in the <a href=\"https:\/\/antonpotocnik.com\/?p=487360\" target=\"_blank\">previous project<\/a> copy the bitstream file to the linux home folder on Red Pitaya and write it to the FPGA using<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\ncat \/root\/tmp\/your_bitstream.bit &gt; \/dev\/xdevcfg\r\n<\/pre>\n<p style=\"text-align: justify;\">The LEDs on your Red Pitaya should now blink in the famous Knight Rider fashion.<\/p>\n<h2 style=\"text-align: justify;\">Double Knight Rider<\/h2>\n<p style=\"text-align: justify;\">We can make the another Knight Rider light sequence where two sets of light streams move in opposite, mirrored direction. This can be done by adding another instance of the <em>knight_rider<\/em> module to the block design. The input <em>clk<\/em> of the new block is connected to the same clock as the first <em>knight_rider<\/em> module. The outputs of the two modules have to be first joined by a vector logic OR block whose output is then wired to the <em>led_o<\/em> port. As we have learned in the <a href=\"https:\/\/antonpotocnik.com\/?p=487360\" target=\"_blank\">previous project<\/a> the vector logic block can be found under Xilinx&#8217;s IP cores (Right click on the white block design canvas and choose <em>Add IP &#8230;<\/em>). It will perform a pair-wise logic operation for each pair of elements in the two input vectors. To get a mirrored behavior of the second <em>knight_rider<\/em> block its parameters should be set as<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nLEDS_INIT = &quot;0000000011&quot;\r\nDIR_INIT = 1\r\n<\/pre>\n<p style=\"text-align: justify;\">The block design for the Double Knight Rider is shown in the following figure. Note that from Vivado 2016.3 <em>util_ds_buf_1<\/em> and <em>util_ds_buf_2<\/em> have to be connected for a successful implementation.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-489283 size-full\" src=\"https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_.png\" width=\"1271\" height=\"466\" srcset=\"https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_.png 1271w, https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_-300x110.png 300w, https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_-768x282.png 768w, https:\/\/antonpotocnik.com\/wp-content\/uploads\/2016\/10\/knight_rider_2_-1024x375.png 1024w\" sizes=\"auto, (max-width: 1271px) 100vw, 1271px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Double Knight Rider light sequence is a great demonstration of parallel nature of the FPGA. We simply added another instance of the module and connect it to the clock. Both blocks are implemented as separate logic circuits on the FPGA running perfectly in parallel.<\/p>\n<p style=\"text-align: justify;\">The project is again ready for synthesis, implementation and bitstream generation. Enjoy the light show on your Red Pitaya! You can of course change the frequency of the blinking LEDs by changing the parameter in <em>xlslice_0<\/em> block.<\/p>\n<h2 style=\"text-align: justify;\">Conclusion<\/h2>\n<p style=\"text-align: justify;\">In this project we built a simple but nontrivial FPGA application \u2013 Knight Rider Lights, ideal for learning the basic concepts of FPGA programming.\u00a0 In this post we got familiar with Verilog language which we used to create our own module. We tested this module using Vivado\u2019s simulator and finally inserted one or more instances into the block diagram. For the first time we had to think in terms of circuits were wires connect different parts of the system and where different blocks can run independent from each other. This inherent parallelism is one of the reasons why FPGAs are so popular for example in the <a href=\"https:\/\/en.bitcoin.it\/wiki\/Open_Source_FPGA_Bitcoin_Miner\" target=\"_blank\">high-performance computing<\/a>.<\/p>\n<p style=\"text-align: justify;\">In the first two projects FPGA programs were completely determined at the design level, without control during the execution. We will learn in the next project how to interface programmable logic with external signals, for example ADCs, and how to write to and read data from registers on the FPGA using Linux running on the Zynq ARM processor.<\/p>\n<table width=\"100%\">\n<tbody>\n<tr>\n<td><a href=\"https:\/\/antonpotocnik.com\/?p=487360\">&lt;&lt; Red Pitaya Project 1 &#8211; LED blinker<\/a><\/td>\n<td align=\"right\"><a href=\"https:\/\/antonpotocnik.com\/?p=489265\">Red Pitaya Project 3 &#8211; Stopwatch &gt;&gt;<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 style=\"text-align: justify;\">References<\/h2>\n<ul>\n<li style=\"text-align: justify;\"><a href=\"http:\/\/www.asic-world.com\/verilog\/veritut.html\" target=\"_blank\">Verilog tutorial<\/a><\/li>\n<li style=\"text-align: justify;\"><a href=\"https:\/\/docs.numato.com\/kb\/learning-fpga-verilog-beginners-guide-part-1-introduction\/\" target=\"_blank\">Verilog beginners tutorial by Numato lab<\/a><\/li>\n<li style=\"text-align: justify;\"><a href=\"https:\/\/www.xilinx.com\/support\/documentation\/sw_manuals\/xilinx2016_1\/ug937-vivado-design-suite-simulation-tutorial.pdf\" target=\"_blank\">Xilinx&#8217;s Logic Simulation Tutorial <\/a><\/li>\n<li style=\"text-align: justify;\"><a href=\"https:\/\/www.xilinx.com\/video\/hardware\/logic-simulation.html\" target=\"_blank\">Xilinx&#8217;s Logic Simulation Quick take video<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Introduction A blinking LED is one thing, but a true light show is something one can actually be proud of. In the previous post we built a very simple FPGA program that made one LED\u00a0on Red Pitaya blink. For such a simple project we constructed the necessary logic by graphically connecting different blocks in Vivado&#8217;s&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[29],"tags":[],"class_list":["post-488784","post","type-post","status-publish","format-standard","hentry","category-fpga"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3Hjcy-239C","_links":{"self":[{"href":"https:\/\/antonpotocnik.com\/index.php?rest_route=\/wp\/v2\/posts\/488784","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/antonpotocnik.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/antonpotocnik.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/antonpotocnik.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/antonpotocnik.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=488784"}],"version-history":[{"count":53,"href":"https:\/\/antonpotocnik.com\/index.php?rest_route=\/wp\/v2\/posts\/488784\/revisions"}],"predecessor-version":[{"id":560240,"href":"https:\/\/antonpotocnik.com\/index.php?rest_route=\/wp\/v2\/posts\/488784\/revisions\/560240"}],"wp:attachment":[{"href":"https:\/\/antonpotocnik.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=488784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/antonpotocnik.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=488784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/antonpotocnik.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=488784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}