{"id":384316,"date":"2024-06-29T05:26:18","date_gmt":"2024-06-29T05:26:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=384316"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=384316","title":{"rendered":"<span>Designing a circuit that calculates integer cube root<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Good day everyone. In this article I will tell you how to make a circuit in Verilog HDL on FPGA which will calculate cube root from integer number.     <\/p>\n<p>I will write code in Quartus Prime Lite. My device is Cyclone IV E.<\/p>\n<p><strong>Pins and declarations<\/strong><\/p>\n<p>Firstly, let\u2019s create our top level module and specify which input\/output pins we will use:<\/p>\n<details class=\"spoiler\">\n<summary>Pins declaration part<\/summary>\n<div class=\"spoiler__content\">\n<p><code>module cube_root(<\/code><\/p>\n<p><code>   input clk,                         \/\/ Clock signal 50Mhz<\/code><\/p>\n<p><code>   input [7:0] number,                \/\/ Input value<\/code><\/p>\n<p><code>   output reg [3:0] Anode_Activate,   \/\/ Setter for activating segments<\/code><\/p>\n<p><code>   output reg [7:0] LED_out           \/\/ Value on the segment<\/code><\/p>\n<p><code>); <\/code><\/p>\n<\/div>\n<\/details>\n<p>Number &#8212; value from which we will extract cube root.<\/p>\n<p>Anode_Activate will specify currently activated segment of display. I will use only 3 segments: 1st for integer part of result, second and third for fractional. Last segment is not used but specified in order to make updating working properly. <\/p>\n<p>LED_out specifies which number will be shown one current segment.<\/p>\n<p>clk \u2013 clock signal for updating segments.<\/p>\n<p>There are also other terms which can be declared in program:<\/p>\n<p><code>reg [4:0] result1;\u00a0\u00a0 \/\/ First segments's value<\/code><\/p>\n<p><code>reg [4:0] result2;\u00a0\u00a0 \/\/ Second segments's value<\/code><\/p>\n<p><code>reg [4:0] result3;\u00a0\u00a0 \/\/ Third segments's value<\/code><\/p>\n<p><code>reg [4:0] LED_BCD; \u00a0 \/\/ Current segments's value (not used)<\/code><\/p>\n<p><code>reg [19:0] refresh_counter;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Segmens update counter<\/code><\/p>\n<p><code>wire [1:0] LED_activating_counter;\u00a0 \/\/ Segment activation counter<\/code><\/p>\n<p>   result1 \u2013 result3 &#8212; for storing result of calculations.<\/p>\n<p>   LED_BCD stores which of digits will be shown on activated segment. <\/p>\n<p>   About refresh_counter and LED_activating_counter I will talk in the next part.<\/p>\n<p><strong>Showing results on 7-segment display<\/strong><\/p>\n<p>Cyclone IV can\u2019t show several digits activated simultaneously, therefore I had to implement segments updater for it:<\/p>\n<details class=\"spoiler\">\n<summary>Updater<\/summary>\n<div class=\"spoiler__content\">\n<p><code>always @(posedge clk)<\/code><\/p>\n<p><code>   begin <\/code><\/p>\n<p><code>      refresh_counter &amp;lt;= refresh_counter + 1;<\/code><\/p>\n<p><code>   end <\/code><\/p>\n<p><code> <\/code><\/p>\n<p><code>\/\/ Setting LED_activating_counter as 2 last bits of refresh_counter<\/code><\/p>\n<p><code>\/\/ in order to update segments each 5.2 ms<\/code><\/p>\n<p><code>assign LED_activating_counter = refresh_counter[19:18];<\/code><\/p>\n<\/div>\n<\/details>\n<p>LED_activating_counter will store 2 last bits of refresh_counter. These bits will change their value from 00 to 11 each 2^18 \/ 50*10^6 s = 5.2 ms.<\/p>\n<p>Here is the code for setting currently activated segment according to LED_activating_counter:<\/p>\n<details class=\"spoiler\">\n<summary>Segment setter<\/summary>\n<div class=\"spoiler__content\">\n<p><code>\/\/ Setting one segment activated accorfing to LED_activating_counter<\/code><\/p>\n<p><code>always @(*)<\/code><\/p>\n<p><code>   begin case(LED_activating_counter)<\/code><\/p>\n<p><code>         2'b00: begin<\/code><\/p>\n<p><code>         Anode_Activate = 4'b0111;<\/code><\/p>\n<p><code>         LED_BCD = result1;<\/code><\/p>\n<p><code>         LED_BCD[4] = 1;       \/\/ This bit is responsible for showing dot<\/code><\/p>\n<p><code>         end<\/code><\/p>\n<p><code>         2'b01: begin<\/code><\/p>\n<p><code>         Anode_Activate = 4'b1011;<\/code><\/p>\n<p><code>         LED_BCD = result2;<\/code><\/p>\n<p><code>         LED_BCD[4] = 0;<\/code><\/p>\n<p><code>         end<\/code><\/p>\n<p><code>         2'b10: begin<\/code><\/p>\n<p><code>         Anode_Activate = 4'b1101;<\/code><\/p>\n<p><code>         LED_BCD = result3;<\/code><\/p>\n<p><code>         LED_BCD[4] = 0;<\/code><\/p>\n<p><code>         end<\/code><\/p>\n<p><code>         2'b11: begin<\/code><\/p>\n<p><code>         Anode_Activate = 4'b1110; <\/code><\/p>\n<p><code>         LED_BCD = 5'b01011;<\/code><\/p>\n<p><code>         end<\/code><\/p>\n<p><code>   endcase<\/code><\/p>\n<p><code>end<\/code><\/p>\n<p><code>\/\/ Setting value for activated segment<\/code><\/p>\n<p><code>always @(*)<\/code><\/p>\n<p><code>   begin<\/code><\/p>\n<p><code>         case(LED_BCD)<\/code><\/p>\n<p><code>         5'b00000: LED_out = 8'b00000011; \/\/ \"0\" <\/code><\/p>\n<p><code>         5'b00001: LED_out = 8'b10011111; \/\/ \"1\" <\/code><\/p>\n<p><code>         5'b00010: LED_out = 8'b00100101; \/\/ \"2\" <\/code><\/p>\n<p><code>         5'b00011: LED_out = 8'b00001101; \/\/ \"3\" <\/code><\/p>\n<p><code>         5'b00100: LED_out = 8'b10011001; \/\/ \"4\" <\/code><\/p>\n<p><code>         5'b00101: LED_out = 8'b01001001; \/\/ \"5\" <\/code><\/p>\n<p><code>         5'b00110: LED_out = 8'b01000001; \/\/ \"6\" <\/code><\/p>\n<p><code>         5'b00111: LED_out = 8'b00011111; \/\/ \"7\" <\/code><\/p>\n<p><code>         5'b01000: LED_out = 8'b00000001; \/\/ \"8\" <\/code><\/p>\n<p><code>         5'b01001: LED_out = 8'b00001001; \/\/ \"9\" <\/code><\/p>\n<p><code>         5'b01011: LED_out = 8'b11111111; \/\/ \" \" <\/code><\/p>\n<p><code>         5'b10000: LED_out = 8'b00000010; \/\/ \"0.\" <\/code><\/p>\n<p><code>         5'b10001: LED_out = 8'b10011110; \/\/ \"1.\" <\/code><\/p>\n<p><code>         5'b10010: LED_out = 8'b00100100; \/\/ \"2.\" <\/code><\/p>\n<p><code>         5'b10011: LED_out = 8'b00001100; \/\/ \"3.\" <\/code><\/p>\n<p><code>         5'b10100: LED_out = 8'b10011000; \/\/ \"4.\" <\/code><\/p>\n<p><code>         5'b10101: LED_out = 8'b01001000; \/\/ \"5.\" <\/code><\/p>\n<p><code>         5'b10110: LED_out = 8'b01000000; \/\/ \"6.\" <\/code><\/p>\n<p><code>         5'b10111: LED_out = 8'b00011110; \/\/ \"7.\" <\/code><\/p>\n<p><code>         5'b11000: LED_out = 8'b00000000; \/\/ \"8.\" <\/code><\/p>\n<p><code>         5'b11001: LED_out = 8'b00001000; \/\/ \"9.\" <\/code><\/p>\n<p><code>         default:&amp;nbsp; LED_out = 8'b00000000; \/\/ \"8.\"<\/code><\/p>\n<p><code>   endcase<\/code><\/p>\n<p><code>end<\/code><\/p>\n<\/div>\n<\/details>\n<p><strong>Calculating cube root<\/strong><\/p>\n<p>Our number value will be input using pins using this scheme:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/f3b\/31d\/293\/f3b31d293db6ef53a7e24d090f7ba14a.jpg\" width=\"1500\" height=\"1125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f3b\/31d\/293\/f3b31d293db6ef53a7e24d090f7ba14a.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>Maximum value of a number is 255, minimum \u2013 0.<\/p>\n<p>There already exists algorithm in a book Hacker\u2019s Delight which can calculate cube root (code is in Java):<\/p>\n<details class=\"spoiler\">\n<summary>Java implementation of calculating cube root<\/summary>\n<div class=\"spoiler__content\">\n<p><code>public int cube_root(int val){<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int s = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int y = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int b = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (s=30;s>=0;s=s-3){<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0y = 2*y;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0b = (3*y*(y+1)+1) &lt;&lt; s;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (x>=b){<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0   x = x-b;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0   y = y+1;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0return y;<\/code><\/p>\n<p><code>}<\/code><\/p>\n<\/div>\n<\/details>\n<p>But it can only output integer results. In order to overcome this restriction we need to multiply our input value by 10^(3*n), n \u2013 natural number, and then split results into digits. Our n last digits will be fractional part. I decided to show results with 2 digits after point. It means that we need to multiply input value by 1 000 000.<\/p>\n<p>Here is the code in Verilog:<\/p>\n<details class=\"spoiler\">\n<summary>Calculating cube root (Verilog)<\/summary>\n<div class=\"spoiler__content\">\n<p><code>\/\/ Calculating cube root of number<\/code><\/p>\n<p><code>always@(*) begin : block_0<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 reg [31:0] x;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 integer s;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer y;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer b;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer i;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = number;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = x * 1_000_000;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 y = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 for (s=30;s>=0;s=s-3)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0begin : block_calc<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=y*2;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 b = (3*y*(y+1)+1) &lt;&lt; s;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x>=b)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0begin : block_1<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = x-b;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=y+1;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0 end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 result1 = y \/ 100;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ First digit<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0result2 = (y % 100)\/10; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Second digit<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0result3 = y % 10; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Third digit<\/code><\/p>\n<p><code>end<\/code><\/p>\n<\/div>\n<\/details>\n<p>The whole code of my project:<\/p>\n<details class=\"spoiler\">\n<summary>Code of the project<\/summary>\n<div class=\"spoiler__content\">\n<p><code>module cube_root(<\/code><\/p>\n<p><code>\u00a0\u00a0 input clk,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Clock signal 50Mhz<\/code><\/p>\n<p><code>\u00a0\u00a0 input [7:0] number,\u00a0\u00a0\u00a0 \/\/ Input value<\/code><\/p>\n<p><code>\u00a0\u00a0 output reg [3:0] Anode_Activate,\u00a0\u00a0\/\/ Setter for activating segments<\/code><\/p>\n<p><code>\u00a0\u00a0 output reg [7:0] LED_out\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Value on the segment<\/code><\/p>\n<p><code>);<\/code><\/p>\n<p><code>\u00a0<\/code><\/p>\n<p><code>reg [4:0] result1;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ First segments's value<\/code><\/p>\n<p><code>reg [4:0] result2;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Second segments's value<\/code><\/p>\n<p><code>reg [4:0] result3;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \/\/ Third segments's value<\/code><\/p>\n<p><code>reg [4:0] LED_BCD;    \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Current segments's value (not used)<\/code><\/p>\n<p><code>reg [19:0] refresh_counter;\u00a0\u00a0\u00a0\/\/ Segmens update counter<\/code><\/p>\n<p><code>wire [1:0] LED_activating_counter;\u00a0 \/\/ Segment activation counter<\/code><\/p>\n<p><code>\u00a0<\/code><\/p>\n<p><code>\/\/ Calculating cubic root of number<\/code><\/p>\n<p><code>always@(*) begin : block_0<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0reg [31:0] x;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0integer s;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer y;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer b;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer i;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0x = number;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0x = x * 1_000_000;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 y = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 for (s=30;s>=0;s=s-3)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0begin : block_calc<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=y*2;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 b = (3*y*(y+1)+1) &lt;&lt; s;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x>=b)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0begin : block_1<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = x-b;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=y+1;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0 end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 result1 = y \/ 100;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 result2 = (y % 100)\/10;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0result3 = y % 10;<\/code><\/p>\n<p><code>end<\/code><\/p>\n<p><code>\/\/ Changing refresh_counter to update segments<\/code><\/p>\n<p><code>always @(posedge clk)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 begin <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 refresh_counter &lt;= refresh_counter + 1;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 end <\/code><\/p>\n<p><code>\u00a0<\/code><\/p>\n<p><code>\/\/ Setting LED_activating_counter as 2 last bits of refresh_counter<\/code><\/p>\n<p><code>\/\/ in order to update segments each 5.2 ms<\/code><\/p>\n<p><code>assign LED_activating_counter = refresh_counter[19:18];<\/code><\/p>\n<p><code>\u00a0<\/code><\/p>\n<p><code>\/\/ Setting one segment activated accorfing to LED_activating_counter<\/code><\/p>\n<p><code>always @(*)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case(LED_activating_counter)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2'b00: begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Anode_Activate = 4'b0111;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LED_BCD = result1;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LED_BCD[4] = 1;\u00a0\u00a0\/\/ This bit is responsible for showing dot<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2'b01: begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Anode_Activate = 4'b1011;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LED_BCD = result2;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LED_BCD[4] = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2'b10: begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Anode_Activate = 4'b1101;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LED_BCD = result3;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LED_BCD[4] = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02'b11:\u00a0 begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Anode_Activate = 4'b1110; <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LED_BCD = 5'b01011;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0endcase<\/code><\/p>\n<p><code>end<\/code><\/p>\n<p><code>\u00a0<\/code><\/p>\n<p><code>\/\/ Setting value for activated segment<\/code><\/p>\n<p><code>always @(*)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case(LED_BCD)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00000: LED_out = 8'b00000011; \/\/ \"0\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00001: LED_out = 8'b10011111; \/\/ \"1\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00010: LED_out = 8'b00100101; \/\/ \"2\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5'b00011: LED_out = 8'b00001101; \/\/ \"3\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00100: LED_out = 8'b10011001; \/\/ \"4\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00101: LED_out = 8'b01001001; \/\/ \"5\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00110: LED_out = 8'b01000001; \/\/ \"6\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00111: LED_out = 8'b00011111; \/\/ \"7\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b01000: LED_out = 8'b00000001; \/\/ \"8\"\u00a0<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b01001: LED_out = 8'b00001001; \/\/ \"9\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b01011: LED_out = 8'b11111111; \/\/ \" \" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b10000: LED_out = 8'b00000010; \/\/ \"0.\"\u00a0<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5'b10001: LED_out = 8'b10011110; \/\/ \"1.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5'b10010: LED_out = 8'b00100100; \/\/ \"2.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5'b10011: LED_out = 8'b00001100; \/\/ \"3.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5'b10100: LED_out = 8'b10011000; \/\/ \"4.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b10101: LED_out = 8'b01001000; \/\/ \"5.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b10110: LED_out = 8'b01000000; \/\/ \"6.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b10111: LED_out = 8'b00011110; \/\/ \"7.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b11000: LED_out = 8'b00000000; \/\/ \"8.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b11001: LED_out = 8'b00001000; \/\/ \"9.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0default:\u00a0 LED_out = 8'b00000000; \/\/ \"8.\"<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 endcase<\/code><\/p>\n<p><code>    end<\/code><\/p>\n<p><code>endmodule<\/code><\/p>\n<\/div>\n<\/details>\n<p><strong>Pin assignments.<\/strong><\/p>\n<p>Now, I have to specify which pins will be connected with declared ones in module. We can do it in pin planner:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ed7\/d03\/113\/ed7d03113a43445b965102a971e74db5.png\" width=\"1279\" height=\"675\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ed7\/d03\/113\/ed7d03113a43445b965102a971e74db5.png\"\/><figcaption><\/figcaption><\/figure>\n<p><strong>Results of our work.<\/strong><\/p>\n<p>After compiling our project we can run it on FPGA. Here are photos with results of a program:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/76c\/970\/fe7\/76c970fe77aac01f77c4cd21f874dc0c.jpg\" width=\"1500\" height=\"1125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/76c\/970\/fe7\/76c970fe77aac01f77c4cd21f874dc0c.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/9d0\/2e4\/b90\/9d02e4b9032b29843a7c8ac1aec35322.jpg\" width=\"1500\" height=\"1125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9d0\/2e4\/b90\/9d02e4b9032b29843a7c8ac1aec35322.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/c7f\/48b\/583\/c7f48b58343dc4ea81b83cbdc184e0f5.jpg\" width=\"1500\" height=\"1125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c7f\/48b\/583\/c7f48b58343dc4ea81b83cbdc184e0f5.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/233\/de0\/376\/233de0376f0d086601547b8fc524cbdc.jpg\" width=\"1500\" height=\"1125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/233\/de0\/376\/233de0376f0d086601547b8fc524cbdc.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>Useful links:<\/p>\n<p>Lesson on how to deal with 7-segment display on Cyclone IV- <a href=\"https:\/\/www.fpga4student.com\/2017\/09\/seven-segment-led-display-controller-basys3-fpga.html\" rel=\"noopener noreferrer nofollow\">[FPGA Tutorial] Seven-Segment LED Display on Basys 3 FPGA &#8212; FPGA4student.com<\/a><\/p>\n<p>Algorithm for calculating cube root on C &#8212; <a href=\"http:\/\/www.silicon-russia.com\/2018\/02\/05\/hackers-delight-2ed\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u043b\u0438\u0441\u0442\u0430\u043b 2-\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u0435 Hacker\u2019s Delight \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0437\u0430\u043d\u044f\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0434\u043b\u044f \u043b\u0430\u0431\u043d\u0438\u043a\u0430 \u043f\u043e Verilog &amp; FPGA \u2014 Silicon Russia &amp; Ukraine (silicon-russia.com)<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/532226\/\"> https:\/\/habr.com\/ru\/articles\/532226\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Good day everyone. In this article I will tell you how to make a circuit in Verilog HDL on FPGA which will calculate cube root from integer number.     <\/p>\n<p>I will write code in Quartus Prime Lite. My device is Cyclone IV E.<\/p>\n<p><strong>Pins and declarations<\/strong><\/p>\n<p>Firstly, let\u2019s create our top level module and specify which input\/output pins we will use:<\/p>\n<details class=\"spoiler\">\n<summary>Pins declaration part<\/summary>\n<div class=\"spoiler__content\">\n<p><code>module cube_root(<\/code><\/p>\n<p><code>   input clk,                         \/\/ Clock signal 50Mhz<\/code><\/p>\n<p><code>   input [7:0] number,                \/\/ Input value<\/code><\/p>\n<p><code>   output reg [3:0] Anode_Activate,   \/\/ Setter for activating segments<\/code><\/p>\n<p><code>   output reg [7:0] LED_out           \/\/ Value on the segment<\/code><\/p>\n<p><code>); <\/code><\/p>\n<\/div>\n<\/details>\n<p>Number &#8212; value from which we will extract cube root.<\/p>\n<p>Anode_Activate will specify currently activated segment of display. I will use only 3 segments: 1st for integer part of result, second and third for fractional. Last segment is not used but specified in order to make updating working properly. <\/p>\n<p>LED_out specifies which number will be shown one current segment.<\/p>\n<p>clk \u2013 clock signal for updating segments.<\/p>\n<p>There are also other terms which can be declared in program:<\/p>\n<p><code>reg [4:0] result1;\u00a0\u00a0 \/\/ First segments's value<\/code><\/p>\n<p><code>reg [4:0] result2;\u00a0\u00a0 \/\/ Second segments's value<\/code><\/p>\n<p><code>reg [4:0] result3;\u00a0\u00a0 \/\/ Third segments's value<\/code><\/p>\n<p><code>reg [4:0] LED_BCD; \u00a0 \/\/ Current segments's value (not used)<\/code><\/p>\n<p><code>reg [19:0] refresh_counter;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Segmens update counter<\/code><\/p>\n<p><code>wire [1:0] LED_activating_counter;\u00a0 \/\/ Segment activation counter<\/code><\/p>\n<p>   result1 \u2013 result3 &#8212; for storing result of calculations.<\/p>\n<p>   LED_BCD stores which of digits will be shown on activated segment. <\/p>\n<p>   About refresh_counter and LED_activating_counter I will talk in the next part.<\/p>\n<p><strong>Showing results on 7-segment display<\/strong><\/p>\n<p>Cyclone IV can\u2019t show several digits activated simultaneously, therefore I had to implement segments updater for it:<\/p>\n<details class=\"spoiler\">\n<summary>Updater<\/summary>\n<div class=\"spoiler__content\">\n<p><code>always @(posedge clk)<\/code><\/p>\n<p><code>   begin <\/code><\/p>\n<p><code>      refresh_counter &amp;lt;= refresh_counter + 1;<\/code><\/p>\n<p><code>   end <\/code><\/p>\n<p><code> <\/code><\/p>\n<p><code>\/\/ Setting LED_activating_counter as 2 last bits of refresh_counter<\/code><\/p>\n<p><code>\/\/ in order to update segments each 5.2 ms<\/code><\/p>\n<p><code>assign LED_activating_counter = refresh_counter[19:18];<\/code><\/p>\n<\/div>\n<\/details>\n<p>LED_activating_counter will store 2 last bits of refresh_counter. These bits will change their value from 00 to 11 each 2^18 \/ 50*10^6 s = 5.2 ms.<\/p>\n<p>Here is the code for setting currently activated segment according to LED_activating_counter:<\/p>\n<details class=\"spoiler\">\n<summary>Segment setter<\/summary>\n<div class=\"spoiler__content\">\n<p><code>\/\/ Setting one segment activated accorfing to LED_activating_counter<\/code><\/p>\n<p><code>always @(*)<\/code><\/p>\n<p><code>   begin case(LED_activating_counter)<\/code><\/p>\n<p><code>         2'b00: begin<\/code><\/p>\n<p><code>         Anode_Activate = 4'b0111;<\/code><\/p>\n<p><code>         LED_BCD = result1;<\/code><\/p>\n<p><code>         LED_BCD[4] = 1;       \/\/ This bit is responsible for showing dot<\/code><\/p>\n<p><code>         end<\/code><\/p>\n<p><code>         2'b01: begin<\/code><\/p>\n<p><code>         Anode_Activate = 4'b1011;<\/code><\/p>\n<p><code>         LED_BCD = result2;<\/code><\/p>\n<p><code>         LED_BCD[4] = 0;<\/code><\/p>\n<p><code>         end<\/code><\/p>\n<p><code>         2'b10: begin<\/code><\/p>\n<p><code>         Anode_Activate = 4'b1101;<\/code><\/p>\n<p><code>         LED_BCD = result3;<\/code><\/p>\n<p><code>         LED_BCD[4] = 0;<\/code><\/p>\n<p><code>         end<\/code><\/p>\n<p><code>         2'b11: begin<\/code><\/p>\n<p><code>         Anode_Activate = 4'b1110; <\/code><\/p>\n<p><code>         LED_BCD = 5'b01011;<\/code><\/p>\n<p><code>         end<\/code><\/p>\n<p><code>   endcase<\/code><\/p>\n<p><code>end<\/code><\/p>\n<p><code>\/\/ Setting value for activated segment<\/code><\/p>\n<p><code>always @(*)<\/code><\/p>\n<p><code>   begin<\/code><\/p>\n<p><code>         case(LED_BCD)<\/code><\/p>\n<p><code>         5'b00000: LED_out = 8'b00000011; \/\/ \"0\" <\/code><\/p>\n<p><code>         5'b00001: LED_out = 8'b10011111; \/\/ \"1\" <\/code><\/p>\n<p><code>         5'b00010: LED_out = 8'b00100101; \/\/ \"2\" <\/code><\/p>\n<p><code>         5'b00011: LED_out = 8'b00001101; \/\/ \"3\" <\/code><\/p>\n<p><code>         5'b00100: LED_out = 8'b10011001; \/\/ \"4\" <\/code><\/p>\n<p><code>         5'b00101: LED_out = 8'b01001001; \/\/ \"5\" <\/code><\/p>\n<p><code>         5'b00110: LED_out = 8'b01000001; \/\/ \"6\" <\/code><\/p>\n<p><code>         5'b00111: LED_out = 8'b00011111; \/\/ \"7\" <\/code><\/p>\n<p><code>         5'b01000: LED_out = 8'b00000001; \/\/ \"8\" <\/code><\/p>\n<p><code>         5'b01001: LED_out = 8'b00001001; \/\/ \"9\" <\/code><\/p>\n<p><code>         5'b01011: LED_out = 8'b11111111; \/\/ \" \" <\/code><\/p>\n<p><code>         5'b10000: LED_out = 8'b00000010; \/\/ \"0.\" <\/code><\/p>\n<p><code>         5'b10001: LED_out = 8'b10011110; \/\/ \"1.\" <\/code><\/p>\n<p><code>         5'b10010: LED_out = 8'b00100100; \/\/ \"2.\" <\/code><\/p>\n<p><code>         5'b10011: LED_out = 8'b00001100; \/\/ \"3.\" <\/code><\/p>\n<p><code>         5'b10100: LED_out = 8'b10011000; \/\/ \"4.\" <\/code><\/p>\n<p><code>         5'b10101: LED_out = 8'b01001000; \/\/ \"5.\" <\/code><\/p>\n<p><code>         5'b10110: LED_out = 8'b01000000; \/\/ \"6.\" <\/code><\/p>\n<p><code>         5'b10111: LED_out = 8'b00011110; \/\/ \"7.\" <\/code><\/p>\n<p><code>         5'b11000: LED_out = 8'b00000000; \/\/ \"8.\" <\/code><\/p>\n<p><code>         5'b11001: LED_out = 8'b00001000; \/\/ \"9.\" <\/code><\/p>\n<p><code>         default:&amp;nbsp; LED_out = 8'b00000000; \/\/ \"8.\"<\/code><\/p>\n<p><code>   endcase<\/code><\/p>\n<p><code>end<\/code><\/p>\n<\/div>\n<\/details>\n<p><strong>Calculating cube root<\/strong><\/p>\n<p>Our number value will be input using pins using this scheme:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>Maximum value of a number is 255, minimum \u2013 0.<\/p>\n<p>There already exists algorithm in a book Hacker\u2019s Delight which can calculate cube root (code is in Java):<\/p>\n<details class=\"spoiler\">\n<summary>Java implementation of calculating cube root<\/summary>\n<div class=\"spoiler__content\">\n<p><code>public int cube_root(int val){<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int s = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int y = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int b = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (s=30;s>=0;s=s-3){<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0y = 2*y;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0b = (3*y*(y+1)+1) &lt;&lt; s;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (x>=b){<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0   x = x-b;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0   y = y+1;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0return y;<\/code><\/p>\n<p><code>}<\/code><\/p>\n<\/div>\n<\/details>\n<p>But it can only output integer results. In order to overcome this restriction we need to multiply our input value by 10^(3*n), n \u2013 natural number, and then split results into digits. Our n last digits will be fractional part. I decided to show results with 2 digits after point. It means that we need to multiply input value by 1 000 000.<\/p>\n<p>Here is the code in Verilog:<\/p>\n<details class=\"spoiler\">\n<summary>Calculating cube root (Verilog)<\/summary>\n<div class=\"spoiler__content\">\n<p><code>\/\/ Calculating cube root of number<\/code><\/p>\n<p><code>always@(*) begin : block_0<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 reg [31:0] x;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 integer s;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer y;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer b;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer i;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = number;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = x * 1_000_000;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 y = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 for (s=30;s>=0;s=s-3)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0begin : block_calc<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=y*2;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 b = (3*y*(y+1)+1) &lt;&lt; s;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x>=b)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0begin : block_1<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = x-b;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=y+1;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0 end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 result1 = y \/ 100;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ First digit<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0result2 = (y % 100)\/10; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Second digit<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0result3 = y % 10; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Third digit<\/code><\/p>\n<p><code>end<\/code><\/p>\n<\/div>\n<\/details>\n<p>The whole code of my project:<\/p>\n<details class=\"spoiler\">\n<summary>Code of the project<\/summary>\n<div class=\"spoiler__content\">\n<p><code>module cube_root(<\/code><\/p>\n<p><code>\u00a0\u00a0 input clk,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Clock signal 50Mhz<\/code><\/p>\n<p><code>\u00a0\u00a0 input [7:0] number,\u00a0\u00a0\u00a0 \/\/ Input value<\/code><\/p>\n<p><code>\u00a0\u00a0 output reg [3:0] Anode_Activate,\u00a0\u00a0\/\/ Setter for activating segments<\/code><\/p>\n<p><code>\u00a0\u00a0 output reg [7:0] LED_out\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Value on the segment<\/code><\/p>\n<p><code>);<\/code><\/p>\n<p><code>\u00a0<\/code><\/p>\n<p><code>reg [4:0] result1;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ First segments's value<\/code><\/p>\n<p><code>reg [4:0] result2;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Second segments's value<\/code><\/p>\n<p><code>reg [4:0] result3;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \/\/ Third segments's value<\/code><\/p>\n<p><code>reg [4:0] LED_BCD;    \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Current segments's value (not used)<\/code><\/p>\n<p><code>reg [19:0] refresh_counter;\u00a0\u00a0\u00a0\/\/ Segmens update counter<\/code><\/p>\n<p><code>wire [1:0] LED_activating_counter;\u00a0 \/\/ Segment activation counter<\/code><\/p>\n<p><code>\u00a0<\/code><\/p>\n<p><code>\/\/ Calculating cubic root of number<\/code><\/p>\n<p><code>always@(*) begin : block_0<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0reg [31:0] x;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0integer s;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer y;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer b;<\/code><\/p>\n<p><code>\u00a0\u00a0 integer i;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0x = number;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0x = x * 1_000_000;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 y = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 for (s=30;s>=0;s=s-3)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0begin : block_calc<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=y*2;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 b = (3*y*(y+1)+1) &lt;&lt; s;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x>=b)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0begin : block_1<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = x-b;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=y+1;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0 end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 result1 = y \/ 100;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 result2 = (y % 100)\/10;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0result3 = y % 10;<\/code><\/p>\n<p><code>end<\/code><\/p>\n<p><code>\/\/ Changing refresh_counter to update segments<\/code><\/p>\n<p><code>always @(posedge clk)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 begin <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 refresh_counter &lt;= refresh_counter + 1;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 end <\/code><\/p>\n<p><code>\u00a0<\/code><\/p>\n<p><code>\/\/ Setting LED_activating_counter as 2 last bits of refresh_counter<\/code><\/p>\n<p><code>\/\/ in order to update segments each 5.2 ms<\/code><\/p>\n<p><code>assign LED_activating_counter = refresh_counter[19:18];<\/code><\/p>\n<p><code>\u00a0<\/code><\/p>\n<p><code>\/\/ Setting one segment activated accorfing to LED_activating_counter<\/code><\/p>\n<p><code>always @(*)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case(LED_activating_counter)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2'b00: begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Anode_Activate = 4'b0111;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LED_BCD = result1;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LED_BCD[4] = 1;\u00a0\u00a0\/\/ This bit is responsible for showing dot<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2'b01: begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Anode_Activate = 4'b1011;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LED_BCD = result2;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LED_BCD[4] = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2'b10: begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Anode_Activate = 4'b1101;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LED_BCD = result3;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LED_BCD[4] = 0;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02'b11:\u00a0 begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Anode_Activate = 4'b1110; <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LED_BCD = 5'b01011;<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0end<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0endcase<\/code><\/p>\n<p><code>end<\/code><\/p>\n<p><code>\u00a0<\/code><\/p>\n<p><code>\/\/ Setting value for activated segment<\/code><\/p>\n<p><code>always @(*)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 begin<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case(LED_BCD)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00000: LED_out = 8'b00000011; \/\/ \"0\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00001: LED_out = 8'b10011111; \/\/ \"1\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00010: LED_out = 8'b00100101; \/\/ \"2\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5'b00011: LED_out = 8'b00001101; \/\/ \"3\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00100: LED_out = 8'b10011001; \/\/ \"4\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00101: LED_out = 8'b01001001; \/\/ \"5\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00110: LED_out = 8'b01000001; \/\/ \"6\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b00111: LED_out = 8'b00011111; \/\/ \"7\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b01000: LED_out = 8'b00000001; \/\/ \"8\"\u00a0<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b01001: LED_out = 8'b00001001; \/\/ \"9\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b01011: LED_out = 8'b11111111; \/\/ \" \" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b10000: LED_out = 8'b00000010; \/\/ \"0.\"\u00a0<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5'b10001: LED_out = 8'b10011110; \/\/ \"1.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5'b10010: LED_out = 8'b00100100; \/\/ \"2.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5'b10011: LED_out = 8'b00001100; \/\/ \"3.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5'b10100: LED_out = 8'b10011000; \/\/ \"4.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b10101: LED_out = 8'b01001000; \/\/ \"5.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b10110: LED_out = 8'b01000000; \/\/ \"6.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b10111: LED_out = 8'b00011110; \/\/ \"7.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b11000: LED_out = 8'b00000000; \/\/ \"8.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a05'b11001: LED_out = 8'b00001000; \/\/ \"9.\" <\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0default:\u00a0 LED_out = 8'b00000000; \/\/ \"8.\"<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 endcase<\/code><\/p>\n<p><code>    end<\/code><\/p>\n<p><code>endmodule<\/code><\/p>\n<\/div>\n<\/details>\n<p><strong>Pin assignments.<\/strong><\/p>\n<p>Now, I have to specify which pins will be connected with declared ones in module. We can do it in pin planner:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><strong>Results of our work.<\/strong><\/p>\n<p>After compiling our project we can run it on FPGA. Here are photos with results of a program:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>Useful links:<\/p>\n<p>Lesson on how to deal with 7-segment display on Cyclone IV- <a href=\"https:\/\/www.fpga4student.com\/2017\/09\/seven-segment-led-display-controller-basys3-fpga.html\" rel=\"noopener noreferrer nofollow\">[FPGA Tutorial] Seven-Segment LED Display on Basys 3 FPGA &#8212; FPGA4student.com<\/a><\/p>\n<p>Algorithm for calculating cube root on C &#8212; <a href=\"http:\/\/www.silicon-russia.com\/2018\/02\/05\/hackers-delight-2ed\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u043b\u0438\u0441\u0442\u0430\u043b 2-\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u0435 Hacker\u2019s Delight \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0437\u0430\u043d\u044f\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0434\u043b\u044f \u043b\u0430\u0431\u043d\u0438\u043a\u0430 \u043f\u043e Verilog &amp; FPGA \u2014 Silicon Russia &amp; Ukraine (silicon-russia.com)<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/532226\/\"> https:\/\/habr.com\/ru\/articles\/532226\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-384316","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/384316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=384316"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/384316\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=384316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=384316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=384316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}