{"id":6778,"date":"2020-05-15T23:05:16","date_gmt":"2020-05-15T17:35:16","guid":{"rendered":"https:\/\/nuclearrambo.com\/wordpress\/?p=6778"},"modified":"2024-10-03T15:16:48","modified_gmt":"2024-10-03T09:46:48","slug":"a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1","status":"publish","type":"post","link":"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/","title":{"rendered":"A basic on screen display with Vivado HLS and Zynq SoC &#8211; Part 1"},"content":{"rendered":"\n<p>Having an on-screen display in your video can benefit in various ways. Sometimes, having an on-screen display (OSD) can be a need or can serve the purpose of adding an appeal to your project. This little project will be split across two parts. The first part revolves around making a Vivado <a href=\"https:\/\/www.xilinx.com\/products\/design-tools\/vivado\/integration\/esl-design.html\">HLS (High level synthesis)<\/a> On screen display IP core. In the second part, we will integrate this IP block on to an actual <a href=\"https:\/\/store.digilentinc.com\/zybo-zynq-7000-arm-fpga-soc-trainer-board\/\">Zynq 7010 SoC<\/a>. Remember that an ideal OSD will only operate on the desired region. What we are going to do is a very crude method to paint a mask. Nonetheless, it teaches us the basics of the Vivado HLS Video processing library.<\/p>\n\n\n\n<p>Meanwhile, you can also check out <a href=\"https:\/\/nuclearrambo.com\/wordpress\/tag\/zynq\/\">other Zynq related articles<\/a> on this blog.<\/p>\n\n\n\n<center><p><script type=\"text\/javascript\">\n\tatOptions = {\n\t\t'key' : 'a488f095e80c8a74746e5fdca977eaea',\n\t\t'format' : 'iframe',\n\t\t'height' : 90,\n\t\t'width' : 728,\n\t\t'params' : {}\n\t};\n\tdocument.write('<scr' + 'ipt type=\"text\/javascript\" src=\"http' + (location.protocol === 'https:' ? 's' : '') + ':\/\/www.profitabledisplaynetwork.com\/a488f095e80c8a74746e5fdca977eaea\/invoke.js\"><\/scr' + 'ipt>');\n<\/script><\/p><\/center>\n\n\n\n<h2 class=\"wp-block-heading\">Designing the HLS On screen display<\/h2>\n\n\n\n<p>Our block will accept two inputs over AXI4 Stream interface. One of the stream inputs contains video and the other one contains the mask information. Correspondingly, the third AXI4 Stream interface is the video output.<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/mask_painter\/\" rel=\"attachment wp-att-6779\"><img loading=\"lazy\" decoding=\"async\" width=\"522\" height=\"207\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/mask_painter.png\" alt=\"vivado hls video block\" class=\"wp-image-6779\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/mask_painter.png 522w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/mask_painter-300x119.png 300w\" sizes=\"auto, (max-width: 522px) 100vw, 522px\" \/><\/a><figcaption class=\"wp-element-caption\">The basic mask painter block that we want to design in HLS<\/figcaption><\/figure>\n\n\n\n<p>Now that we know what we want to do, let us get started with it. Based on our plan, we need three AXI4 Stream interfaces. Since, we will be operating on 24bit RGB video, each interface will have 24 bit data bus. Additionally, we will also need the AXI4 Stream side-channel but we don&#8217;t need to do anything special for it. Vivado HLS takes care of that.<\/p>\n\n\n\n<p>The width and height of the image are another important parameter that we need to define. In this example, we shall operate on a HD 720p video RGB video stream. I have kept a test image and a sample mask ready in the project path because we will be needing it while creating the test bench.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#define MAX_WIDTH  1280\n#define MAX_HEIGHT 720\n\n#define INPUT_IMAGE           \"J:\\\\XilinxProjects\\\\VitisWorkspace3\\\\stream_mul\\\\test.bmp\"\n#define MASK_IMAGE            \"J:\\\\XilinxProjects\\\\VitisWorkspace3\\\\stream_mul\\\\mask.bmp\"\n#define OUTPUT_IMAGE\t\t  \"J:\\\\XilinxProjects\\\\VitisWorkspace3\\\\stream_mul\\\\output.bmp\"\n\ntypedef hls::stream&lt;ap_axiu&lt;24,1,1,1&gt; &gt;               AXI_STREAM_RGB;\n\ntypedef hls::Mat&lt;MAX_HEIGHT, MAX_WIDTH, HLS_8UC3&gt;     RGB_IMAGE;\n\nvoid painter(AXI_STREAM_RGB &amp;tpg, AXI_STREAM_RGB &amp;mask, AXI_STREAM_RGB &amp;painted);<\/pre>\n\n\n\n<p>Now we can go on and write the painter function. Both the input video streams are first converted into the HLS Mat format. In openCV, the Mat is basically the 2D image matrix. Once, both the streams are forwarded into the Mat variable, we pass it on to the hls::Mul function. This function does pixel by pixel multiplication operation on both the images and the result is sent out in a third Mat variable. Furthermore, this Mat is converted back into AXI4 Stream.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;hls_video.h&gt;\n#include \"core.hpp\"\n\nvoid painter(AXI_STREAM_RGB &amp;tpgStream, AXI_STREAM_RGB &amp;maskStream, AXI_STREAM_RGB &amp;paintedStream){\n#pragma HLS INTERFACE axis port=paintedStream bundle=OUT_STREAM\n#pragma HLS INTERFACE axis port=maskStream bundle=MASK_STREAM\n#pragma HLS INTERFACE axis port=tpgStream bundle=TPG_STREAM\n#pragma HLS INTERFACE s_axilite port=return bundle=CONTORL_BUS\n\n\n\tRGB_IMAGE video_in(MAX_HEIGHT, MAX_WIDTH), mask_in(MAX_HEIGHT, MAX_WIDTH), painted_out(MAX_HEIGHT, MAX_WIDTH);\n#pragma HLS dataflow\n\n\thls::AXIvideo2Mat(tpgStream, video_in);\n\thls::AXIvideo2Mat(maskStream, mask_in);\n\thls::Mul(mask_in, video_in, painted_out);\n\thls::Mat2AXIvideo(painted_out, paintedStream);\n}<\/pre>\n\n\n\n<center><p><script type=\"text\/javascript\">\n\tatOptions = {\n\t\t'key' : 'a488f095e80c8a74746e5fdca977eaea',\n\t\t'format' : 'iframe',\n\t\t'height' : 90,\n\t\t'width' : 728,\n\t\t'params' : {}\n\t};\n\tdocument.write('<scr' + 'ipt type=\"text\/javascript\" src=\"http' + (location.protocol === 'https:' ? 's' : '') + ':\/\/www.profitabledisplaynetwork.com\/a488f095e80c8a74746e5fdca977eaea\/invoke.js\"><\/scr' + 'ipt>');\n<\/script><\/p><\/center>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding the code<\/h2>\n\n\n\n<p>Straight into the code, we can see a bunch of <em>#pragma<\/em> directives. The first three directives tell the HLS compiler which of the function arguments are AXI4 Stream ports. The <em>bundle <\/em>directive basically bunches the port signals together. You can literally have any bundle name. The fourth directive is an <em>s_axilite <\/em>interface. This port is very important to control our HLS block. It will allow us to start and stop the core from the Zynq processing system. Using this same interface, we can also set the image size if we wanted to. We will keep things simple and have the image sized fixed.<\/p>\n\n\n\n<p>Now, you may be wondering that a large image, in this case two of them would need considerable RAM space on the FPGA. Does the Mat really store all that data before multiplication? The HLS compiler operates on pixel by pixel basis. At times, we can define line buffers to store a few lines at the most. A full image is never operated upon.<\/p>\n\n\n\n<p>The <strong>dataflow <\/strong>directive parallelizes a lot of the functions. Instead of waiting for one function to finish before starting the next one, the HLS compiler passes on the data from one function to the next. Meanwhile, the first function can operate on a new sample and so on.<\/p>\n\n\n\n<p><em>AXIvideo2Mat<\/em> function takes in the streaming data. The two bits&nbsp;<em>tuser&nbsp;<\/em>and&nbsp;<em>tlast<\/em> in AXI4Stream indicate start of frame and end of line. The mentioned function polls these two bits to align the incoming stream into a correct image. On the other hand, <em>Mat2AXIvideo <\/em>takes data and places it over AXI4Stream. While doing so, it adds the <em>tuser <\/em>and <em>tlast <\/em>bits to indicate SOF and EOL.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Synthesis Results<\/h2>\n\n\n\n<p>The synthesis report gives us an idea about the resources needed on the FPGA. In addition to that, we can also see the data flow pattern and as a result learn about the clock cycles required to do each step in our function. Based on the chart, a pixel will take about 5 clock cycles to come out of the block.<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/latency\/\" rel=\"attachment wp-att-6780\"><img loading=\"lazy\" decoding=\"async\" width=\"906\" height=\"344\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/latency.png\" alt=\"latency\" class=\"wp-image-6780\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/latency.png 906w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/latency-300x114.png 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/latency-768x292.png 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/latency-600x228.png 600w\" sizes=\"auto, (max-width: 906px) 100vw, 906px\" \/><\/a><figcaption class=\"wp-element-caption\">Graph indicating data flow schedule<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/resources\/\" rel=\"attachment wp-att-6781\"><img loading=\"lazy\" decoding=\"async\" width=\"530\" height=\"238\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/resources.png\" alt=\"Resource profile\" class=\"wp-image-6781\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/resources.png 530w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/resources-300x135.png 300w\" sizes=\"auto, (max-width: 530px) 100vw, 530px\" \/><\/a><figcaption class=\"wp-element-caption\">Resource consumption<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Time to test<\/h2>\n\n\n\n<p>Just like any other C++ code, you can call the function in your program and check for correctness in the output. Here, you can do two types of tests. In first test, you will simple verify the functionality in C simulation. Correspondingly, the second test lets you confirm the correctness of auto-generated RTL code based on the RTL co-simulation.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int main(){\n\tAXI_STREAM_RGB tpgStream, maskStream, paintedStream;\n\n\n\tIplImage* testImage = cvLoadImage(INPUT_IMAGE);\n\tIplImage* maskImage = cvLoadImage(MASK_IMAGE);\n\tIplImage* paintedImage = cvCreateImage(cvGetSize(testImage), testImage-&gt;depth, testImage-&gt;nChannels);\n\n\tIplImage2AXIvideo(testImage, tpgStream);\n\tIplImage2AXIvideo(maskImage, maskStream);\n\tpainter(tpgStream, maskStream, paintedStream);\n\n\tAXIvideo2IplImage(paintedStream, paintedImage);\n\n\tcvSaveImage(OUTPUT_IMAGE, paintedImage);\n\tcvReleaseImage(&amp;testImage);\n\tcvReleaseImage(&amp;maskImage);\n\tcvReleaseImage(&amp;paintedImage);\n\n\treturn 0;\n}<\/pre>\n\n\n\n<p>I generated a simple mask image in Paint. The whole image is first filled with RGB: 0x010101. By doing so, I will be basically multiplying the whole image by 1. In short, doing no change to the image. Then I type some text with RGB: 0x000000. The pixels in resulting text area will appear black. As a result we will be imprinting the mask onto the video frame.<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/mask\/\" rel=\"attachment wp-att-6782\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/mask-1024x576.jpg\" alt=\"\" class=\"wp-image-6782\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/mask-1024x576.jpg 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/mask-300x169.jpg 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/mask-768x432.jpg 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/mask-600x338.jpg 600w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/mask.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Mask appears black because the RGB value is very close to absolute black.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/output-2\/\" rel=\"attachment wp-att-6783\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/output-1024x576.jpg\" alt=\"\" class=\"wp-image-6783\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/output-1024x576.jpg 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/output-300x169.jpg 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/output-768x432.jpg 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/output-600x338.jpg 600w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/output.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Mask appears on the test image<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/test\/\" rel=\"attachment wp-att-6784\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/test-1024x576.jpg\" alt=\"\" class=\"wp-image-6784\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/test-1024x576.jpg 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/test-300x169.jpg 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/test-768x432.jpg 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/test-600x338.jpg 600w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/test.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">This is the original test image<\/figcaption><\/figure>\n\n\n\n<p>Seems like it is working. Now, I will do a RTL Co-simulation and observe the waveforms.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Observing RTL-Cosimulation results<\/h2>\n\n\n\n<p>Before you begin the co-simulation, make sure the settings are as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/co-sim_settings\/\" rel=\"attachment wp-att-6785\"><img loading=\"lazy\" decoding=\"async\" width=\"456\" height=\"723\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/co-sim_settings.png\" alt=\"vivado hls tutorial\" class=\"wp-image-6785\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/co-sim_settings.png 456w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/co-sim_settings-189x300.png 189w\" sizes=\"auto, (max-width: 456px) 100vw, 456px\" \/><\/a><figcaption class=\"wp-element-caption\">Co simulation settings<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/waveforms.jpg\" rel=\"attachment wp-att-6786\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/waveforms-1024x576.jpg\" alt=\"\" class=\"wp-image-6786\" srcset=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/waveforms-1024x576.jpg 1024w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/waveforms-300x169.jpg 300w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/waveforms-768x432.jpg 768w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/waveforms-1536x864.jpg 1536w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/waveforms-600x338.jpg 600w, https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/waveforms.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">HLS video Co simulation results<\/figcaption><\/figure>\n\n\n\n<p>Looking at the results, we can see that the data takes about 8 clock cycles to come out. Apparently, there is a slight discrepency in the synthesis result and the actual RTL result. We wont&#8217; be trying to go into this. That&#8217;s for some other article.<\/p>\n\n\n\n<p>The results seem correct and promising. In the next part of this tutorial, we will export this HLS block into Vivado for integrating it with VDMA and observe the output on a real screen.<\/p>\n\n\n\n<p>All three source code files are uploaded to my<a href=\"https:\/\/github.com\/nuclearrambo\/HLS-Video-overlay\"> Github account.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Having an on-screen display in your video can benefit in various ways. Sometimes, having an on-screen display (OSD) can be a need or can serve the purpose of adding an appeal to your project.&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":6786,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1212,1562],"tags":[1755,1757,1748,1756,1745],"class_list":["post-6778","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-electronics-2","category-tutorials","tag-hls","tag-rtl","tag-vivado","tag-zybo","tag-zynq"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>A basic on screen display with Vivado HLS and Zynq SoC - Part 1<\/title>\n<meta name=\"description\" content=\"The article revolves around making a On screen display IP core using Vivado HLS tools, analysing its operation in then finally integrating on hardware.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A basic on screen display with Vivado HLS and Zynq SoC - Part 1\" \/>\n<meta property=\"og:description\" content=\"The article revolves around making a On screen display IP core using Vivado HLS tools, analysing its operation in then finally integrating on hardware.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"Nuclearrambo\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-15T17:35:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-03T09:46:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/waveforms.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"nuclearrambo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@darkusul\" \/>\n<meta name=\"twitter:site\" content=\"@darkusul\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"nuclearrambo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/\"},\"author\":{\"name\":\"nuclearrambo\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/6093ae9d048d4789bd3d18c136577a0c\"},\"headline\":\"A basic on screen display with Vivado HLS and Zynq SoC &#8211; Part 1\",\"datePublished\":\"2020-05-15T17:35:16+00:00\",\"dateModified\":\"2024-10-03T09:46:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/\"},\"wordCount\":1045,\"commentCount\":6,\"publisher\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#organization\"},\"keywords\":[\"hls\",\"RTL\",\"vivado\",\"zybo\",\"zynq\"],\"articleSection\":[\"Electronics\",\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/\",\"url\":\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/\",\"name\":\"A basic on screen display with Vivado HLS and Zynq SoC - Part 1\",\"isPartOf\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#website\"},\"datePublished\":\"2020-05-15T17:35:16+00:00\",\"dateModified\":\"2024-10-03T09:46:48+00:00\",\"description\":\"The article revolves around making a On screen display IP core using Vivado HLS tools, analysing its operation in then finally integrating on hardware.\",\"breadcrumb\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/nuclearrambo.com\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A basic on screen display with Vivado HLS and Zynq SoC &#8211; Part 1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#website\",\"url\":\"https:\/\/nuclearrambo.com\/wordpress\/\",\"name\":\"Nuclearrambo\",\"description\":\"Information is FREE! Progress is MUST! Awakening is inevitable!\",\"publisher\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/nuclearrambo.com\/wordpress\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#organization\",\"name\":\"Nuclearrambo\",\"url\":\"https:\/\/nuclearrambo.com\/wordpress\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2021\/01\/logo-nuclearrambo.png\",\"contentUrl\":\"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2021\/01\/logo-nuclearrambo.png\",\"width\":1489,\"height\":1152,\"caption\":\"Nuclearrambo\"},\"image\":{\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/twitter.com\/darkusul\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/6093ae9d048d4789bd3d18c136577a0c\",\"name\":\"nuclearrambo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9cc8a9d2d82dd7e65e77405f7b4ccaa34450e8a268f369ac893882cc5f13a797?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9cc8a9d2d82dd7e65e77405f7b4ccaa34450e8a268f369ac893882cc5f13a797?s=96&r=g\",\"caption\":\"nuclearrambo\"},\"description\":\"Salil is an electronics enthusiast working on various electronics systems. In his free time he writes on the blog, talks over ham radio or builds circuits. He has Yaesu FT2900R VHF transceiver, FT450D HF transceiver, TYT UV8000E and Quansheng UVK6 Handheld transceivers.\",\"sameAs\":[\"http:\/\/nuclearrambo.com\/wordpress\"],\"url\":\"https:\/\/nuclearrambo.com\/wordpress\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"A basic on screen display with Vivado HLS and Zynq SoC - Part 1","description":"The article revolves around making a On screen display IP core using Vivado HLS tools, analysing its operation in then finally integrating on hardware.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/","og_locale":"en_US","og_type":"article","og_title":"A basic on screen display with Vivado HLS and Zynq SoC - Part 1","og_description":"The article revolves around making a On screen display IP core using Vivado HLS tools, analysing its operation in then finally integrating on hardware.","og_url":"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/","og_site_name":"Nuclearrambo","article_published_time":"2020-05-15T17:35:16+00:00","article_modified_time":"2024-10-03T09:46:48+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2020\/05\/waveforms.jpg","type":"image\/jpeg"}],"author":"nuclearrambo","twitter_card":"summary_large_image","twitter_creator":"@darkusul","twitter_site":"@darkusul","twitter_misc":{"Written by":"nuclearrambo","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/#article","isPartOf":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/"},"author":{"name":"nuclearrambo","@id":"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/6093ae9d048d4789bd3d18c136577a0c"},"headline":"A basic on screen display with Vivado HLS and Zynq SoC &#8211; Part 1","datePublished":"2020-05-15T17:35:16+00:00","dateModified":"2024-10-03T09:46:48+00:00","mainEntityOfPage":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/"},"wordCount":1045,"commentCount":6,"publisher":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/#organization"},"keywords":["hls","RTL","vivado","zybo","zynq"],"articleSection":["Electronics","Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/","url":"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/","name":"A basic on screen display with Vivado HLS and Zynq SoC - Part 1","isPartOf":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/#website"},"datePublished":"2020-05-15T17:35:16+00:00","dateModified":"2024-10-03T09:46:48+00:00","description":"The article revolves around making a On screen display IP core using Vivado HLS tools, analysing its operation in then finally integrating on hardware.","breadcrumb":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nuclearrambo.com\/wordpress\/a-basic-on-screen-display-with-vivado-hls-and-zynq-soc-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nuclearrambo.com\/wordpress\/"},{"@type":"ListItem","position":2,"name":"A basic on screen display with Vivado HLS and Zynq SoC &#8211; Part 1"}]},{"@type":"WebSite","@id":"https:\/\/nuclearrambo.com\/wordpress\/#website","url":"https:\/\/nuclearrambo.com\/wordpress\/","name":"Nuclearrambo","description":"Information is FREE! Progress is MUST! Awakening is inevitable!","publisher":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nuclearrambo.com\/wordpress\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/nuclearrambo.com\/wordpress\/#organization","name":"Nuclearrambo","url":"https:\/\/nuclearrambo.com\/wordpress\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/logo\/image\/","url":"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2021\/01\/logo-nuclearrambo.png","contentUrl":"https:\/\/nuclearrambo.com\/wordpress\/wp-content\/uploads\/2021\/01\/logo-nuclearrambo.png","width":1489,"height":1152,"caption":"Nuclearrambo"},"image":{"@id":"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/twitter.com\/darkusul"]},{"@type":"Person","@id":"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/6093ae9d048d4789bd3d18c136577a0c","name":"nuclearrambo","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nuclearrambo.com\/wordpress\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9cc8a9d2d82dd7e65e77405f7b4ccaa34450e8a268f369ac893882cc5f13a797?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9cc8a9d2d82dd7e65e77405f7b4ccaa34450e8a268f369ac893882cc5f13a797?s=96&r=g","caption":"nuclearrambo"},"description":"Salil is an electronics enthusiast working on various electronics systems. In his free time he writes on the blog, talks over ham radio or builds circuits. He has Yaesu FT2900R VHF transceiver, FT450D HF transceiver, TYT UV8000E and Quansheng UVK6 Handheld transceivers.","sameAs":["http:\/\/nuclearrambo.com\/wordpress"],"url":"https:\/\/nuclearrambo.com\/wordpress\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/posts\/6778","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/comments?post=6778"}],"version-history":[{"count":13,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/posts\/6778\/revisions"}],"predecessor-version":[{"id":8426,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/posts\/6778\/revisions\/8426"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/media\/6786"}],"wp:attachment":[{"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/media?parent=6778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/categories?post=6778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nuclearrambo.com\/wordpress\/wp-json\/wp\/v2\/tags?post=6778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}