<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0YDQHc5fCp7ImA9WhBbGEs.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705</id><updated>2013-05-18T12:42:51.924+05:30</updated><category term="sequence detector" /><category term="resets" /><category term="vhdl tips" /><category term="coe file" /><category term="Gate level model" /><category term="state machine" /><category term="C and VHDL" /><category term="real variable" /><category term="gated clock" /><category term="power reduction" /><category term="FIR filter" /><category term="frequency multiplier" /><category term="functions" /><category term="arrays and records" /><category term="useful codes" /><category term="comparator" /><category term="Buffers" /><category term="stack" /><category term="core generator" /><category term="BCD converter" /><category term="pipelining" /><category term="FIFO" /><category term="fixed point package" /><category term="interview Q's" /><category term="sensitivity list" /><category term="FFT" /><category term="Frequency measurement" /><category term="distributed RAM" /><category term="flipflops" /><category term="file handling" /><category term="port mapping" /><category term="xilinx isim" /><category term="Behavior level model" /><category term="testbench" /><category term="counters" /><category term="xilinx tips" /><category term="xilinx errors" /><category term="examples" /><category term="LFSR" /><category term="generate" /><category term="block RAM" /><title>VHDL coding tips and tricks</title><subtitle type="html">Get interesting tips and tricks in VHDL programming</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://vhdlguru.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>96</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/VhdlCodingTipsAndTricks" /><feedburner:info uri="vhdlcodingtipsandtricks" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>VhdlCodingTipsAndTricks</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;DEANRno-fSp7ImA9WhJREEw.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-6693282204617263675</id><published>2012-07-11T19:56:00.000+05:30</published><updated>2012-07-11T19:56:37.455+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-11T19:56:37.455+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xilinx tips" /><category scheme="http://www.blogger.com/atom/ns#" term="vhdl tips" /><title>Synthesised code is too big for the fpga device - What to do?</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
After lot of hard work you completed your HDL project. The simulation results verified that the code is functionally working. To check how it performs in hardware you synthesis the design. To your bad luck you realize that the code you just wrote is too big for the fpga. What can you do? Don't panic. There are few ways you can tackle this problem.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;1)If possible choose a higher graded fpga device:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Its a simple but the easiest thing you can do. Check if the lab or a friend has a better fpga device which can afford your design. If you really don't want to test the design in hardware,but just want to see the synthesis results then simply select the largest device available in the list.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;2)Is the fpga out of pins?&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Some times the synthesis tool will give out an "Out of resources" warning if the design has too many signals in its port list that the device can't support. This happens when you try to input or output large arrays or vectors.&lt;br /&gt;
In such cases use a multiplexed input or output system. Rather than inputting everything in one go, do it step wise. Check it out &lt;a href="http://vhdlguru.blogspot.in/2012/04/not-enough-io-pins-in-fpga-board-for.html" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;3)Changing synthesis tool settings:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
By default, the synthesis tool try to optimize your design for both speed and resource usage. But you can change this setting so that the tool will optimize for less resource usage. This may reduce the speed a little, but may significantly reduce the resource usage.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;4)Re-use of resources:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Analyze the design carefully and see if any parts of the design can use time-sharing of resources. To do this you have to synchronize the whole design with a clock.&lt;br /&gt;
&lt;br /&gt;
Time sharing means using the same resource for similar kind of operations like addition, multiplication etc. Suppose you want to do an operation like,&lt;br /&gt;
&lt;br /&gt;
y&amp;nbsp; = a+b+c+d;&amp;nbsp;&amp;nbsp; which uses 3 adder circuits.&lt;br /&gt;
&lt;br /&gt;
then split the above operation over 3 clock cycles like this,&lt;br /&gt;
&lt;br /&gt;
y= a + b;&amp;nbsp; --in first clock cycle.&lt;br /&gt;
y= y + c;&amp;nbsp; --in second clock cycle. &lt;br /&gt;
y= y + d;&amp;nbsp; --in third clock cycle.&lt;br /&gt;
&lt;br /&gt;
this way only one adder will be used for the whole operation. This will increase the time for generating output, but reduces logic usage.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;5) Look for any mathematical simplifications:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Analyze the mathematical formula you are implementing and look for any simplification. For instance take this operation,&lt;br /&gt;
&lt;br /&gt;
y=x / 5;&lt;br /&gt;
&lt;br /&gt;
In digital world, division circuit is bigger than multiplication circuit. So make a small change in the formula like this,&lt;br /&gt;
&lt;br /&gt;
y = x * (1/5) = x * 0.2;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;6)Simplify design based on nature of inputs:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
The code may be written for a generic use. But in real cases, the range of inputs may be small and predictive in nature. In such cases you can further simply the formula. &lt;br /&gt;
&lt;br /&gt;
One good example is multiplication and division of variables by a number which is power of 2. If the multiplicand or divisor is a power of 2, then you can implement it using a left shift or right shift operation respectively. This is an excellent optimization method in some cases. &lt;br /&gt;
&amp;nbsp; &lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/Yha4XubZskU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/6693282204617263675/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2012/07/synthesised-code-is-too-big-for-fpga.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/6693282204617263675?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/6693282204617263675?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/Yha4XubZskU/synthesised-code-is-too-big-for-fpga.html" title="Synthesised code is too big for the fpga device - What to do?" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2012/07/synthesised-code-is-too-big-for-fpga.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIFSHs9fyp7ImA9WhJTGEo.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-8768712522993159918</id><published>2012-06-28T14:38:00.001+05:30</published><updated>2012-06-28T14:38:39.567+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-28T14:38:39.567+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="port mapping" /><category scheme="http://www.blogger.com/atom/ns#" term="examples" /><category scheme="http://www.blogger.com/atom/ns#" term="vhdl tips" /><title>How to Mix VHDL and Verilog files in your design</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Sooner or later you will come across this question in your FPGA design career. There are times you found the right modules in the web, but&amp;nbsp;couldn't use it just because you are using a different HDL. But you dont need to be disappointed. Instantiating VHDL components in Verilog modules, or vice versa is a simple process. Let me show it with an example.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;&lt;b&gt;Case 1 -&amp;nbsp;&lt;/b&gt;&amp;nbsp;&lt;b&gt;&amp;nbsp;Instantiating VHDL components in Verilog modules:&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; For example sake, take the &lt;a href="http://vhdlguru.blogspot.in/2010/09/as-per-request-from-readers-i-have.html" target="_blank"&gt;synchronous D flip flop vhdl code&lt;/a&gt; I have written some time before. Suppose I want to write a Verilog module in which I want to instantiate two D- flipflops. Without worrying, you can simply instantiate it like you do it for a verilog module. See the code:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: -webkit-auto;"&gt;
&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; white-space: nowrap;"&gt;module&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp;test&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; white-space: nowrap;"&gt;output&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;[&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;1&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;:&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;]&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp;Q&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; white-space: nowrap;"&gt;input&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp;Clk&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; white-space: nowrap;"&gt;input&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp;CE&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; white-space: nowrap;"&gt;input&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp;RESET&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; white-space: nowrap;"&gt;input&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp;SET&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; white-space: nowrap;"&gt;input&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;[&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;1&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;:&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;]&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp;D&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;example_FDRSE&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;Q&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;[&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;]&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;Clk&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;CE&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;RESET&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;D&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;[&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;]&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;SET&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;example_FDRSE&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;Q&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;[&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;1&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;]&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;Clk&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;CE&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;RESET&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;D&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;[&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;1&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;]&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;SET&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; white-space: nowrap;"&gt;endmodule&lt;/span&gt;&lt;br /&gt;
&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; white-space: nowrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&lt;u style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal; text-align: left; white-space: normal;"&gt;&lt;b&gt;Case 2 -&amp;nbsp;&lt;/b&gt;&amp;nbsp;&lt;b&gt;&amp;nbsp;Instantiating&amp;nbsp;&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;u&gt;&lt;b&gt;Verilog modules in&amp;nbsp;&lt;/b&gt;&lt;/u&gt;&lt;u&gt;&lt;b&gt;VHDL components:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;u&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&amp;nbsp; This case is also straightforward. You don't need to worry about anything. Just instantiate as you normally do it with a vhdl file.&lt;br /&gt;
&lt;br /&gt;
Take this verilog module for instance,&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;module&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;a1&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;output&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;Q&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;input&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;[&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;1&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;:&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;]&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;D&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;and&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;Q&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;D&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;[&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;]&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;D&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;[&lt;/span&gt;&lt;span class="nu0" style="color: #ff0055; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;1&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;]&lt;/span&gt;&lt;span class="br0" style="color: #9f79ee; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="sy0" style="color: #5d478b; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1" style="color: brown; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;endmodule&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
A simpe vhdl code for instantiating this Verilog code can look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;library&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw2" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;IEEE&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;use&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw2" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;IEEE&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;.&lt;/span&gt;&lt;span class="kw2" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;STD_LOGIC_1164&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;.&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;ALL&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;entity&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;test&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;is&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;port&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Q&amp;nbsp;&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;out&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw2" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;1&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;downto&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; D&amp;nbsp;&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;:&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;in&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="kw2" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;3&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;downto&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;end&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;test&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;architecture&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;Behavioral&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;of&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;test&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;is&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;component&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;a1&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;is&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;port&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Q&amp;nbsp;&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;out&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw2" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;std_logic&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; D&amp;nbsp;&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;:&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;in&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="kw2" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;1&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;downto&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;end&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;component&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;begin&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;a11&amp;nbsp;&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;a1&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;port&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;map&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;Q&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;,D&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;1&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;downto&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;0&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;a22&amp;nbsp;&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;a1&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;port&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;map&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;Q&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;1&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;,D&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;(&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;3&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;downto&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="nu0" style="color: red; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;2&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="br0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;)&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1" style="color: navy; font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;end&lt;/span&gt;&lt;span style="background-color: #f0f0f0; color: #0000bb; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&amp;nbsp;Behavioral&lt;/span&gt;&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="sy0" style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 14px; text-align: -webkit-auto; white-space: nowrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: -webkit-auto;"&gt;
&lt;span style="color: #000066; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span style="line-height: 14px; white-space: nowrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
Never thought mixing vhdl and verilog files were so easy? But it is!&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/fg0mPiV5Rh0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/8768712522993159918/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2012/06/how-to-mix-vhdl-and-verilog-files-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/8768712522993159918?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/8768712522993159918?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/fg0mPiV5Rh0/how-to-mix-vhdl-and-verilog-files-in.html" title="How to Mix VHDL and Verilog files in your design" /><author><name>Vipin Lal</name><uri>https://plus.google.com/101203706428430388905</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2012/06/how-to-mix-vhdl-and-verilog-files-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UHQ3s7cCp7ImA9WhVWFk0.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-8612132094271818337</id><published>2012-04-28T13:50:00.001+05:30</published><updated>2012-04-28T13:50:32.508+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-28T13:50:32.508+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vhdl tips" /><title>Not enough I/O pins in the FPGA board for your design?</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Thanks to all the hardwork you have done, you successfully completed writing your first vhdl code. It did great in the functional simulation part. Now its time to test it on a FPGA board.&lt;br /&gt;
&lt;br /&gt;
But looking at the board in hand, you realize that there are not enough input or output pins on the board to test the design. As you may have seen most of the FPGA boards have 8 switch inputs, 4 push buttons, 8 led's. There are other ways to increase I/O by using features like seven segment display, VGA monitor, RS232, DAC and ADC etc. But these features may make the design pretty complex and time consuming.&lt;br /&gt;
&lt;br /&gt;
In such cases we can simply use the basic led's or switches in a multiplexed manner. In this article I have shown how to tackle such a problem in case you are out of input pins. But the same concept apply for output pins also.&lt;br /&gt;
&lt;br /&gt;
Our design is named as &lt;i&gt;my_design&lt;/i&gt; which has a 32 bit input and 8 bit output. Considering a typical FPGA board, we dont have 32 switches or push buttons. Suppose we have 8 switches. The idea is to apply the input in four stages of 8 bit each. This is how you do it.&lt;br /&gt;
&lt;br /&gt;
1st stage : Set switches for 1st byte(LSB), press the push button.&lt;br /&gt;
2nd stage : change switches for 2nd byte and press the push button again.&lt;br /&gt;
3rd stage : change switches for 3rd byte, press the push button again.&lt;br /&gt;
4th stage : change switches for 4th byte(MSB) and press the push button again.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;The code for &lt;i&gt;my_design&lt;/i&gt;: &lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; my_design &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;Port&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; input &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;STD_LOGIC_VECTOR&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;31&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;STD_LOGIC_VECTOR&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; my_design&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; my_design &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
output &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; input&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;31&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;24&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;and&lt;/span&gt; input&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;23&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;16&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;and&lt;/span&gt; input&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;and&lt;/span&gt; input&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&amp;nbsp; The code just does the AND operation between the 4 bytes of the 32 bit number entered.&lt;br /&gt;
&lt;br /&gt;
Now the code for reducing the input numbers. I call this module as a wrapper module. This job of this module is to get the input in stages, concatenate it together and apply it to the instantiated &lt;i&gt;my_design&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Code for &lt;i&gt;wrapper&lt;/i&gt; module :&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.STD_LOGIC_UNSIGNED.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_ARITH&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; wrapper &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;Port&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;STD_LOGIC&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;STD_LOGIC&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;input &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;STD_LOGIC_VECTOR&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;STD_LOGIC_VECTOR&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; wrapper&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; wrapper &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;component&lt;/span&gt; my_design&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; input &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;STD_LOGIC_VECTOR&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;31&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; output &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;STD_LOGIC_VECTOR&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;component&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--state machine type&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;type&lt;/span&gt; stype &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;idle,get_byte,delay&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; s &lt;span class="sy0"&gt;:&lt;/span&gt; stype &lt;span class="sy0"&gt;:=&lt;/span&gt; idle&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; c1,c2 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; temp_reg &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;31&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
uut &lt;span class="sy0"&gt;:&lt;/span&gt; my_design &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;(&lt;/span&gt;input &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; temp_reg, &lt;span class="co1"&gt;--concatenated signal&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; output&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;case&lt;/span&gt; s &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; idle &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;push &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; get_byte&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c1 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; c1+&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; get_byte &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; temp_reg&lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;8&lt;/span&gt;*c1-&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;8&lt;/span&gt;*&lt;span class="br0"&gt;(&lt;/span&gt;c1-&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; input&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; delay&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; delay &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="co1"&gt;--delay for a time gap.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--this delay is required to avoid the same byte getting &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--registered into temp_reg for a single push button click.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c2 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; c2+ &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;c2&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;25000000&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt; &lt;span class="co1"&gt;--for a 50 mhz clock, this generates a 0.5 sec delay.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c2 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; idle&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;c1&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c1 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;case&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
I am using a state machine in the code, to get this done. The state machine has 3 stages.&lt;br /&gt;
1)&lt;b&gt;idle&lt;/b&gt; - here system waits for a push button click.&lt;br /&gt;
2)&lt;b&gt;get_byte&lt;/b&gt; - the system gets the switch inputs and stores in the temp_reg.&lt;br /&gt;
3)&lt;b&gt;delay&lt;/b&gt; - system waits for a particular time(here 0.5 sec) doing nothing. This is to avoid duplicate registering of the same input. &lt;br /&gt;
&lt;br /&gt;
A testbench was created for testing the design. The simulation waveforms are given below for your better understanding.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-BlHKzuWr_5k/T5umqq4VtAI/AAAAAAAAA-Y/GzQKKbHUFDs/s1600/w1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="84" src="http://1.bp.blogspot.com/-BlHKzuWr_5k/T5umqq4VtAI/AAAAAAAAA-Y/GzQKKbHUFDs/s320/w1.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-qlDlMf-Bp7c/T5umr0GigyI/AAAAAAAAA-g/r8--JtvWf20/s1600/w2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="80" src="http://1.bp.blogspot.com/-qlDlMf-Bp7c/T5umr0GigyI/AAAAAAAAA-g/r8--JtvWf20/s320/w2.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Note :-&lt;/b&gt; In a similar way you can also use multiplexed outputs. &lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/zJyOatVllEw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/8612132094271818337/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2012/04/not-enough-io-pins-in-fpga-board-for.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/8612132094271818337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/8612132094271818337?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/zJyOatVllEw/not-enough-io-pins-in-fpga-board-for.html" title="Not enough I/O pins in the FPGA board for your design?" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-BlHKzuWr_5k/T5umqq4VtAI/AAAAAAAAA-Y/GzQKKbHUFDs/s72-c/w1.JPG" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2012/04/not-enough-io-pins-in-fpga-board-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcCR3s9cCp7ImA9WhVWEEQ.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-1439446035806033137</id><published>2012-04-22T17:31:00.000+05:30</published><updated>2012-04-22T17:31:06.568+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-22T17:31:06.568+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vhdl tips" /><title>Tips for an Error-free Functional Simulation</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Getting a VHDL code to work in the &lt;b&gt;functional simulation&lt;/b&gt; is not always an easy task.This article will cover some tips to quickly point out the errors in the code and make your life easier.&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Create a proper &lt;a href="http://vhdlguru.blogspot.in/2010/04/process-sensitivity-list-vs-synthesis.html" target="_blank"&gt;sensitivity list&lt;/a&gt;. Some times you may have to add other control signals too(other than &lt;i&gt;clock&lt;/i&gt;) into you sensitivity list to get is working. &lt;/li&gt;
&lt;li&gt;Initialize the signals and variables correctly. If they are not initialized(normally they are set to '0'), then these signals will appear as &lt;b&gt;"U"&lt;/b&gt; in the simulation waveform. &lt;/li&gt;
&lt;li&gt;If you see &lt;b&gt;"X"&lt;/b&gt; in the waveform then that indicates concurrent writing to the same signal. A simple re-arrangement of the signal inside the process will normally take out this bug.&lt;/li&gt;
&lt;li&gt;In case you have arrays in the design make sure to check for &lt;b&gt;out of bound error&lt;/b&gt;. This happens when you read or write a different index than the one available within the range of array.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;If elsif'&lt;/b&gt;s are error prone. Always try to consider all the conditions of If elsif. If a particular condition is not considered then the value will remain unchanged. If you dont want this to happen then make sure you reset the signal, using an &lt;b&gt;else&lt;/b&gt; condition.&lt;/li&gt;
&lt;li&gt;Within a process, signal assignments can be written in any &lt;b&gt;order&lt;/b&gt;. They will get executed concurrently. But for variables, the order matters. line 1 is executed first, line 2 second and so on...&lt;/li&gt;
&lt;li&gt;One way to debug the code is to force one or more signals as constants and test the design. This will help you in localizing the error.&lt;/li&gt;
&lt;li&gt;Writing a location in RAM requires a small time delay. Account for this, while reading and writing from the same location in the same clock cycle. The read data will be the one written in the last clock cycle. &lt;/li&gt;
&lt;li&gt;Try synthesising the design. The synthesiser tool may give out some warnings or errors which will point you in the correct direction to solve the error in the functional simulation.&lt;/li&gt;
&lt;li&gt;When using components in the design, use &lt;a href="http://vhdlguru.blogspot.in/search/label/port%20mapping" target="_blank"&gt;name instantiation&lt;/a&gt;, so that you don't accidentally assign wrong signals to the component ports.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/ju7mF3RtBU4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/1439446035806033137/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2012/04/tips-for-error-free-functional.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/1439446035806033137?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/1439446035806033137?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/ju7mF3RtBU4/tips-for-error-free-functional.html" title="Tips for an Error-free Functional Simulation" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2012/04/tips-for-error-free-functional.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ACRX05fyp7ImA9WhRVGUo.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-6049874297723278022</id><published>2012-01-19T16:46:00.000+05:30</published><updated>2012-01-19T16:46:04.327+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-19T16:46:04.327+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="real variable" /><title>Real data types and Synthesisability - Part 1</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
First of all sorry that I haven't updated this blog for so long. To make up my negligence towards readers I have decided to write a post on the most common problem a vhdl coder may face. How to deal with real type signals in vhdl, when you have to create a synthesisable design?&lt;br /&gt;
&lt;br /&gt;
The truth is that its not possible to make the code synthesisable if you use real type anywhere in your design. The only way to work around this problem is to first convert the real type into a equivalent binary format and then write custom functions to deal with it.&lt;br /&gt;
&lt;br /&gt;
Generally,a real number can be represented in binary in two formats - &lt;b&gt;Fixed point &lt;/b&gt;and&amp;nbsp; &lt;b&gt;Floating point &lt;/b&gt;formats. In this article I will talk about only fixed point formats. &lt;br /&gt;
&lt;br /&gt;
When it comes to fixed point, I prefer the &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Q_%28number_format%29" target="_blank"&gt;Q format&lt;/a&gt;.&lt;/b&gt; In Q format, we mention the number of integer bits and fractional bits. The number of these bits depends on the actual range and resolution of real numbers you want to deal with. A Q format, will be written as &lt;b&gt;Qm.n&lt;/b&gt; where &lt;i&gt;m &lt;/i&gt;represents the number integer bits and &lt;i&gt;n &lt;/i&gt;represents the number of fractional bits. By default there will be a sign bit as the MSB(Most significant bit) which makes the total size of the binary number as &lt;b&gt;m+n+1.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;Range and resolution of a binary number in Qm.n format:&lt;/b&gt;&amp;nbsp;&lt;i&gt; &lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: white; color: black; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; list-style-image: url(data:image/png; list-style-type: square; margin-bottom: 0px; margin-left: 1.6em; margin-right: 0px; margin-top: 0.3em; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;
&lt;li style="margin-bottom: 0.1em;"&gt;its range is [-2&lt;sup style="line-height: 1em;"&gt;&lt;i&gt;m&lt;/i&gt;&lt;/sup&gt;, 2&lt;sup style="line-height: 1em;"&gt;&lt;i&gt;m&lt;/i&gt;&lt;/sup&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;- 2&lt;sup style="line-height: 1em;"&gt;-&lt;i&gt;n&lt;/i&gt;&lt;/sup&gt;]&lt;/li&gt;
&lt;li style="margin-bottom: 0.1em;"&gt;its resolution is 2&lt;sup style="line-height: 1em;"&gt;-&lt;i&gt;n&lt;/i&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
For example for a Q2.6 number,&lt;br /&gt;
range is&amp;nbsp;  [-2&lt;sup&gt;&lt;i&gt;2&lt;/i&gt;&lt;/sup&gt;, 2&lt;sup&gt;&lt;i&gt;2&lt;/i&gt;&lt;/sup&gt;&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;- 2&lt;sup style="line-height: 1em;"&gt;-&lt;i&gt;6&lt;/i&gt;&lt;/sup&gt;] = [-4 , 3.984375 ].&lt;br /&gt;
resolution is 2&lt;sup style="line-height: 1em;"&gt;-&lt;i&gt;n&amp;nbsp; &lt;/i&gt;&lt;/sup&gt;= 2&lt;sup style="line-height: 1em;"&gt;-&lt;i&gt;6&amp;nbsp; &lt;/i&gt;&lt;/sup&gt;= 0.015625.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;Plan before you decide the value of m and n:&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
For accuracy and easiness in coding, its better to have a high values for m and n. But a higher value of m and n indicates that the size of your binary number will be high and hence more resource usage. For devices like Spartan 3 etc, its better to stick to a 8 bit binary if possible. Find your own optimized boundary between accuracy and size of design.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;Examples for Q format.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
3.5 in Q2.2 format = "0.11.10"&lt;b&gt;&amp;nbsp;&lt;/b&gt; = "01110".&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
3.5 in Q3.5 format = "0.011.10000" = "001110000".&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
3.4 in Q2.4 format = "0.11.0110" = "0110110".&lt;/div&gt;
3.4 in Q2.6 format = "0.11.011001" = "011011001". &lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;How to easily convert a number to Q format?&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
As far as I know there is no software tool available for a general conversion between a real number and any sized Q format. Some calculators can do this job, but the fastest way is to write a vhdl snippet.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
For this purpose we can use the fixed point package available in the ieee_proposed library. This package doesnt work with most of the synthesisers, but it can be used in the form of a testbench code to convert real numbers into Q format.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
Follow these steps:&lt;/div&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Store the real numbers, which you want to convert to Q format, in a text file.&lt;/li&gt;
&lt;li&gt;Write a vhdl snippet to read the real numbers one by one and store in a variable array named, say &lt;i&gt;r. &lt;/i&gt;See this post to know &lt;a href="http://vhdlguru.blogspot.com/2012/01/reading-and-writing-real-numbers-using.html" target="_blank"&gt;how to read and write a text file&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Now declare another array which have elements of &lt;i&gt;sfixed&lt;/i&gt; type. One by one convert the values in &lt;i&gt;r&lt;/i&gt; to this sfixed type using the to_sfixed function. See the below example:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;
variable r : real;&lt;br /&gt;
variable s : sfixed(m downto -n);&lt;br /&gt;
s := to_sfixed(r,s); --convert r to type of &lt;i&gt;s&lt;/i&gt; and store it in variable s.&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Write a vhdl snippet to write the values in &lt;i&gt;s &lt;/i&gt;to&lt;i&gt; &lt;/i&gt;another text file&lt;i&gt;.&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;span style="font-weight: bold;"&gt;Matlab for file handling:&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
I use Matlab software to easily manipulate text files. Using Matlab you can read or write text files of csv format. Some times I have the real values stored in a MS Excel file. To convert it into a text file, I just have to save it as a csv file, use the Matlab Import feature and then use the dlmwrite command in Matlab to write the text file. This will save a lot of your time and frustration.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;Note:-&lt;/b&gt; In the next part, I will talk about how to write, custom arithmetic functions for fixed point format numbers. &lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ol style="text-align: left;"&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/Ld7Lcao-q1w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/6049874297723278022/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2012/01/real-data-types-and-synthesisability.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/6049874297723278022?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/6049874297723278022?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/Ld7Lcao-q1w/real-data-types-and-synthesisability.html" title="Real data types and Synthesisability - Part 1" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2012/01/real-data-types-and-synthesisability.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMGQHg6cCp7ImA9WhRVFEk.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-7062588070928078426</id><published>2012-01-13T14:50:00.000+05:30</published><updated>2012-01-13T14:50:21.618+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-13T14:50:21.618+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="real variable" /><category scheme="http://www.blogger.com/atom/ns#" term="file handling" /><title>Reading and writing real numbers using Files - Part 3</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
After the previous posts on file handling, now I have come up with another way to read and write files. &lt;br /&gt;
&lt;br /&gt;
In this article I will show how to read a text file containing real numbers and store the square roots of these real numbers in another text file. The input file is named as "1.txt" and output file is named as "2.txt".&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Contents of 1.txt:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
12.23&lt;br /&gt;
34.4343&lt;br /&gt;
23.11&lt;br /&gt;
5.0&lt;br /&gt;
25.0&lt;br /&gt;
49.0&lt;br /&gt;
81.88&lt;br /&gt;
1000000.0&lt;br /&gt;
121.0&lt;br /&gt;
78.9&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Contents of 2.txt:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
3.497142e+00&lt;br /&gt;
5.868075e+00&lt;br /&gt;
4.807286e+00&lt;br /&gt;
2.236068e+00&lt;br /&gt;
5.000000e+00&lt;br /&gt;
7.000000e+00&lt;br /&gt;
9.048757e+00&lt;br /&gt;
1.000000e+03&lt;br /&gt;
1.100000e+01&lt;br /&gt;
8.882567e+00&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;VHDL code:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.MATH_REAL.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; std&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; std.textio.&lt;span class="kw1"&gt;all&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; file_handle &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; file_handle&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; file_handle &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;type&lt;/span&gt; real_array &lt;span class="kw1"&gt;is&lt;/span&gt; array&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;of&lt;/span&gt; &lt;span class="kw2"&gt;real&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;variable&lt;/span&gt; line_var &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;line&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;file&lt;/span&gt; text_var &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;text&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;variable&lt;/span&gt; r &lt;span class="sy0"&gt;:&lt;/span&gt; real_array&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--Open the file in read mode.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;file_open&lt;span class="br0"&gt;(&lt;/span&gt;text_var,&lt;span class="st0"&gt;"1.txt"&lt;/span&gt;,read_mode&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--run the loop 10 times to read 10 real values from the file.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; i &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--make sure its not the end of file.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;NOT&lt;/span&gt; ENDFILE&lt;span class="br0"&gt;(&lt;/span&gt;text_var&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;readline&lt;span class="br0"&gt;(&lt;/span&gt;text_var,line_var&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &lt;span class="co1"&gt;--read the current line.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--extract the real value from the read line and store it in the variable.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;read&lt;span class="br0"&gt;(&lt;/span&gt;line_var,r&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; file_close&lt;span class="br0"&gt;(&lt;/span&gt;text_var&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--close the file after reading.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--Write the square root values of variable 'r' to another file.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; file_open&lt;span class="br0"&gt;(&lt;/span&gt;text_var,&lt;span class="st0"&gt;"2.txt"&lt;/span&gt;,write_mode&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--run the loop 10 times to write 10 real values to the file.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; i &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; write&lt;span class="br0"&gt;(&lt;/span&gt;line_var,sqrt&lt;span class="br0"&gt;(&lt;/span&gt;r&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--sqrt is a fucntion for finding square root.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writeline&lt;span class="br0"&gt;(&lt;/span&gt;text_var,line_var&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; file_close&lt;span class="br0"&gt;(&lt;/span&gt;text_var&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
This way of reading and writing files is very helpful in many situations. In my next post I will show an example based on this code snippet.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/71rntvIMot0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/7062588070928078426/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2012/01/reading-and-writing-real-numbers-using.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/7062588070928078426?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/7062588070928078426?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/71rntvIMot0/reading-and-writing-real-numbers-using.html" title="Reading and writing real numbers using Files - Part 3" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2012/01/reading-and-writing-real-numbers-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEINR3g9eCp7ImA9WhdSGU4.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-4760517130272386420</id><published>2011-07-29T16:19:00.000+05:30</published><updated>2011-07-29T16:19:56.660+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-29T16:19:56.660+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="power reduction" /><category scheme="http://www.blogger.com/atom/ns#" term="xilinx tips" /><title>Some tips on reducing power consumption in Xilinx FPGA's</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&amp;nbsp; &amp;nbsp;Power estimation and power reduction is an important part of any design.&amp;nbsp;Especially&amp;nbsp;in wireless devices, the reduction in power is a very important factor. In this article I will note down some points, on how to reduce the power consumption for xilinx based designs.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1)BRAM Enable signal:&lt;/b&gt;&lt;br /&gt;
&amp;nbsp; Every BRAM has an enable signal which by default is high always. Most of the HDL coders never care to disable it even when the BRAM is not used. But when this enable signal is ON BRAM consumes a lot of power. It doesn't matter whether you change the address or write the data. So always have a control logic which will control the bram enable signal.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2)Low power option in coregen for BRAM's:&lt;/b&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;You can create a BRAM entity file using Xilinx's Core generator software. There are several options available in coregen to help you achieve what you want. For low power designs select the "Low power" option in coregen.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3)Decide on LUT or BRAM:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;/b&gt;Suppose you want instantiate a memory in your design. Rather than going straight at BRAM or LUT, give it some thought. Xilinx says that for small memory blocks( less than 4 Kbits) LUT consumes less power than BRAM. Similarly for large memory blocks( more than 4 Kbits) BRAM uses less power for its operation than LUT-RAM.&amp;nbsp;So from design to design, switch to LUT-RAM or BRAM depending on the size of memory block.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4)Global reset:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;/b&gt;All FPGA devices have an internal global reset path. When the device is switched OFF and then ON, all the flip flops and memories are reset to their initial state. But when we define one more reset signal in the HDL code, Xilinx creates a second reset. This second reset is relatively low and hence not recommended. But if you still want to use them make sure it is synchronous, so that the number of the control signals in your design is low.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5)Initialization of&amp;nbsp;Registers:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;/b&gt;It is recommended that we initialize the registers in our design. Normally we do this for safe simulation purposes. But during synthesis, these initialization values will be connected to the INIT pin of the flip flops. Remember that this will work only for bits and bit vectors. It will not work for integer or natural types.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;6)DSP slice Utilization:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;/b&gt;Depending on how complex your FPGA is it will have some number of DSP slices. These components are highly efficient with low power consumption and high speed. All the DSP blocks in Xilinx FPGA are synchronous. So when we define asynchronous behavior for these operations, XST can't implement it using DSP slices. This will decrease the efficiency of your design.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Note:- &lt;/b&gt;I realized these tips after watching a Xilinx tutorial video recently. You can too watch it &lt;a href="http://www.xilinx.com/training/free-video-courses.htm#FPGA"&gt;here.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/vjXZAyybxUQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/4760517130272386420/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/07/some-tips-on-reducing-power-consumption.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/4760517130272386420?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/4760517130272386420?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/vjXZAyybxUQ/some-tips-on-reducing-power-consumption.html" title="Some tips on reducing power consumption in Xilinx FPGA's" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/07/some-tips-on-reducing-power-consumption.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IBQn05cSp7ImA9WhdSGU4.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-2996481121715097921</id><published>2011-07-29T14:55:00.000+05:30</published><updated>2011-07-29T14:55:53.329+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-29T14:55:53.329+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="state machine" /><category scheme="http://www.blogger.com/atom/ns#" term="vhdl tips" /><title>Delay in VHDL without using a 'wait for' statement!</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&amp;nbsp; &amp;nbsp;Introducing a delay in VHDL is pretty easy with a &lt;b&gt;wait for &lt;/b&gt;statement. But it has the&amp;nbsp;disadvantage&amp;nbsp;that it is &lt;b&gt;not synthesisable&lt;/b&gt;. Most of the practical designs, so require another way to introduce a delay.&lt;br /&gt;
&amp;nbsp; &amp;nbsp;In this article I will use a counter and state machine to introduce the delay. We have an input signal, and we want to assign it to the output only after (say) 100 clock cycles. With this objective in my mind , first I have drawn a state machine.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-yVQg_LFMKac/TjJ0PmPTE9I/AAAAAAAAA7M/qrXhBlgp3bc/s1600/v2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://3.bp.blogspot.com/-yVQg_LFMKac/TjJ0PmPTE9I/AAAAAAAAA7M/qrXhBlgp3bc/s320/v2.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
There are two states in the state machine - &amp;nbsp;&lt;i&gt;idle &lt;/i&gt;and &lt;i&gt;&amp;nbsp;delay_c.&lt;/i&gt;&lt;br /&gt;
when the system is in idle state it waits for a valid input bit at the port &lt;i&gt;data_in. &lt;/i&gt;whenever the data is valid, &lt;i&gt;valid_data &lt;/i&gt;will go high. Upon receiving &amp;nbsp;a valid data, the system moves to delay_c state where a counter, &lt;i&gt;c &lt;/i&gt;is incremented every clock cycle till it reaches the maximum delay value(Here it is 100). Once the max count is reached system goes back to idle state and the input data will be assigned to output data. This process goes on and on.&lt;br /&gt;
&lt;br /&gt;
I have written the VHDL codes and testbench code for the above state machine. See the below simulated result to see how it works:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-CME_bPP-w00/TjJ1_-0sd0I/AAAAAAAAA7Q/dT9L_omspVo/s1600/v1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="56" src="http://3.bp.blogspot.com/-CME_bPP-w00/TjJ1_-0sd0I/AAAAAAAAA7Q/dT9L_omspVo/s400/v1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&amp;nbsp; &amp;nbsp; The VHDL code is given below. It is well commented, so I wont be explaining it any further.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;numeric_std&lt;/span&gt;.&lt;span class="kw1"&gt;all&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; delay &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; valid_data &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;-- goes high when the input is valid.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;-- the data input&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_out &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="co1"&gt;--the delayed input data.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; delay&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behaviora &lt;span class="kw1"&gt;of&lt;/span&gt; delay &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; c &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;constant&lt;/span&gt; d &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;100&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--number of clock cycles by which input should be delayed.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; data_temp &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;type&lt;/span&gt; state_type &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;idle,delay_c&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--defintion of state machine type&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; next_s &lt;span class="sy0"&gt;:&lt;/span&gt; state_type&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--declare the state machine signal.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;case&lt;/span&gt; next_s &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; idle &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;valid_data&lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; delay_c&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_temp &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; data_in&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--register the input data.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; delay_c &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;c &lt;span class="sy0"&gt;=&lt;/span&gt; d&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--reset the count&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_out &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; data_temp&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--assign the output&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; idle&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--go back to idle state and wait for another valid data.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; c + &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;NULL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;case&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behaviora&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
The following&lt;b&gt; testbench code&lt;/b&gt; was used to test the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; tb&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; behavior &lt;span class="kw1"&gt;OF&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; valid_data &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; data_in,data_out &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;constant&lt;/span&gt; Clk_period &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;time&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;5&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;-- Instantiate the Unit Under Test (UUT)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;uut&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;entity&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.delay &lt;span class="kw1"&gt;PORT&lt;/span&gt; &lt;span class="kw1"&gt;MAP&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Clk,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; valid_data &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; valid_data,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; data_in,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_out &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; data_out&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock process definitions&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;Clk_process &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Stimulus process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;stim_proc&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;100&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; valid_data &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
The above design was &lt;b&gt;successfully&amp;nbsp;synthesized&lt;/b&gt;&amp;nbsp;in Xilinx ISE software. Note that there are lot of different situations&amp;nbsp;in which a delay can be introduced. But understanding the above concept well, will help you in most of the cases.&lt;br /&gt;
&lt;br /&gt;
There is &lt;b&gt;one limitation&lt;/b&gt; to this design. If the input value keep changing before the delay count is reached, then it will only take the &lt;b&gt;first valid value&lt;/b&gt;. If you want a delay pipeline then you have to implement a &lt;b&gt;FIFO&lt;/b&gt; whose size will depend on the amount of delay. In our case we will need &amp;nbsp;a FIFO size &amp;nbsp;of 100 bits. I will try to cover this in another article. &amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Some of these articles may be helpful:&lt;br /&gt;
&lt;a href="http://vhdlguru.blogspot.com/2010/03/synthesizable-delay-generator-instead.html"&gt;Delay generator using a counter&lt;/a&gt;.&lt;br /&gt;
&lt;a href="http://vhdlguru.blogspot.com/2011/03/clock-frequency-converter-in-vhdl.html"&gt;Clock frequency converter in VHDL.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/6ATJEgejrpk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/2996481121715097921/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/07/delay-in-vhdl-without-using-wait-for.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/2996481121715097921?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/2996481121715097921?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/6ATJEgejrpk/delay-in-vhdl-without-using-wait-for.html" title="Delay in VHDL without using a 'wait for' statement!" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-yVQg_LFMKac/TjJ0PmPTE9I/AAAAAAAAA7M/qrXhBlgp3bc/s72-c/v2.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/07/delay-in-vhdl-without-using-wait-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MGQnc7cCp7ImA9WhZaGE4.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-3755925756896998290</id><published>2011-07-05T09:47:00.000+05:30</published><updated>2011-07-05T09:47:03.908+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-05T09:47:03.908+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="state machine" /><title>Simple vending machine using state machines in VHDL</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&amp;nbsp; &amp;nbsp;A&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;&amp;nbsp;state machine, is a model of behavior composed of a finite number of&amp;nbsp;states, transitions between those states, and actions.It is like a "&lt;b&gt;flow graph&lt;/b&gt;" where we can see how the logic&amp;nbsp;runs when certain conditions are met. state machines are used to solve complicated problems by breaking them into many simple steps.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;&amp;nbsp; &amp;nbsp;There are many articles available in the web regarding this topic. I found &lt;a href="http://61.8.153.212/cse/docs/lecturernotes/iii-sem/06CS33LD/unit6designofseqcircuit.pdf"&gt;sequential circuit design&lt;/a&gt; pretty useful. If you are new to state machines I suggest you read that article before proceeding here.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;&amp;nbsp; &amp;nbsp;In the above said article they have explained a simple vending machine problem and how to create a state machine diagram to solve it. I am not going much into the theory behind it. I have written the VHDL code for the &lt;b&gt;Mealy model&lt;/b&gt; they have given. Refer to Fig 11.10 for this.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;The VHDL code is given below:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; vend_mach &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x,y &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i,j &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; vend_mach&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; vend_mach &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--type of state machine and signal declaration.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;type&lt;/span&gt; state_type &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;a,b,c&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; next_s &lt;span class="sy0"&gt;:&lt;/span&gt; state_type&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;case&lt;/span&gt; next_s &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; a &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; j&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; a&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;elsif&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; j&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; b&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;elsif&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; j&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; c&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; b &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; j&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; b&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;elsif&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; j&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; c&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;elsif&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; j&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; a&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; c &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; j&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; c&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;elsif&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; j&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; a&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;elsif&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; j&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next_s &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; a&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;case&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;The testbench code tests the functionality of the code:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; tb&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; behavior &lt;span class="kw1"&gt;OF&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; Clk,x,y,i,j &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;constant&lt;/span&gt; Clk_period &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;time&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;-- Instantiate the Unit Under Test (UUT)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;uut&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;entity&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.vend_mach &lt;span class="kw1"&gt;PORT&lt;/span&gt; &lt;span class="kw1"&gt;MAP&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Clk,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; x,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; y,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; i,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; j &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; j&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock process definitions&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;Clk_process &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Stimulus process(applying inputs 'i' and 'j').&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;stim_proc&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
The simulation waveform is attached below. Carefully go through the various signal values to see how the flow works.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-JtsrBA9rPtk/ThKO8m9gchI/AAAAAAAAA58/jwl9UPomUIE/s1600/wave.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="52" src="http://1.bp.blogspot.com/-JtsrBA9rPtk/ThKO8m9gchI/AAAAAAAAA58/jwl9UPomUIE/s400/wave.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The code is &lt;b&gt;synthesisable&lt;/b&gt;. To get a clear understanding of the concepts take another problem on state machines from web and write the vhdl code for it using state machines.&lt;br /&gt;
&lt;br /&gt;
I have written some other articles related to state machines. You can browse through them &lt;a href="http://vhdlguru.blogspot.com/search/label/state%20machine"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/Cu-eFMQHE9E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/3755925756896998290/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/07/simple-vending-machine-using-state.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/3755925756896998290?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/3755925756896998290?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/Cu-eFMQHE9E/simple-vending-machine-using-state.html" title="Simple vending machine using state machines in VHDL" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-JtsrBA9rPtk/ThKO8m9gchI/AAAAAAAAA58/jwl9UPomUIE/s72-c/wave.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/07/simple-vending-machine-using-state.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4DRnoyfyp7ImA9WhZaEUQ.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-2276057945531545381</id><published>2011-06-27T22:46:00.000+05:30</published><updated>2011-06-27T22:46:17.497+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-27T22:46:17.497+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="useful codes" /><category scheme="http://www.blogger.com/atom/ns#" term="FFT" /><title>Non-synthesisable VHDL code for 8 point FFT algorithm</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&amp;nbsp; &amp;nbsp;A Fast Fourier Transform(FFT) is an efficient algorithm for calculating the discrete&amp;nbsp;Fourier transform of a set of data. A DFT basically decomposes a set of data in time domain into different frequency components. DFT is defined by the following equation:&lt;br /&gt;
&lt;img alt=" X_k =  \sum_{n=0}^{N-1} x_n e^{-{i 2\pi k \frac{n}{N}}}
\qquad
k = 0,\dots,N-1. " src="http://upload.wikimedia.org/math/a/8/f/a8f2aeebe7a355be7c9184633d33bdea.png" /&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;A FFT algorithm uses some interesting properties of the above formula to simply the calculations. You can read more about these &lt;a href="http://www.cmlab.csie.ntu.edu.tw/cml/dsp/training/coding/transform/fft.html"&gt;FFT algorithms&lt;/a&gt; here.&lt;br /&gt;
&amp;nbsp; &amp;nbsp;Many students have been asking doubts regarding vhdl implementation of FFT, so I decided to write a sample code. I have selected &lt;b&gt;8 point decimation in time(DIT) FFT&lt;/b&gt; algorithm for this purpose. In short I have wrote the code for &lt;a href="http://www.cmlab.csie.ntu.edu.tw/cml/dsp/training/coding/transform/images/figure8.gif"&gt;this flow diagram of FFT&lt;/a&gt;.&lt;br /&gt;
&amp;nbsp; &amp;nbsp;This is just &amp;nbsp;a sample code, which means it is &lt;i&gt;not&lt;/i&gt; synthesisable. I have used real data type for the inputs and outputs and all calculations are done using the math_real library. The inputs can be complex numbers too.&lt;br /&gt;
&amp;nbsp; &amp;nbsp;To define the basic arithmetic operations between two complex numbers I have defined some new functions which are available in the package named &lt;b&gt;fft_pkg&lt;/b&gt;. The component named, &lt;b&gt;butterfly&lt;/b&gt; , contains the basic butterfly calculations for FFT as shown in &lt;a href="http://www.cmlab.csie.ntu.edu.tw/cml/dsp/training/coding/transform/images/figure9.gif"&gt;this flow diagram&lt;/a&gt;.&lt;br /&gt;
&amp;nbsp; &amp;nbsp; I wont be going any deep into the theory behind FFT here. Please visit the link given above or &lt;a href="http://www.google.co.in/search?aq=f&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=fft+algorithms"&gt;Google&lt;/a&gt;&amp;nbsp; for in depth theory. There are 4 vhdl codes in the design,including the testbench code, and are given below.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The package file - fft_pkg.vhd:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;all&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.MATH_REAL.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;package&lt;/span&gt; fft_pkg &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;type&lt;/span&gt; complex &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;record&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; r &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;real&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;real&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;record&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;type&lt;/span&gt; comp_array &lt;span class="kw1"&gt;is&lt;/span&gt; array &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;7&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;of&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;type&lt;/span&gt; comp_array2 &lt;span class="kw1"&gt;is&lt;/span&gt; array &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;of&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;function&lt;/span&gt; add &lt;span class="br0"&gt;(&lt;/span&gt;n1,n2 &lt;span class="sy0"&gt;:&lt;/span&gt; complex&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;function&lt;/span&gt; sub &lt;span class="br0"&gt;(&lt;/span&gt;n1,n2 &lt;span class="sy0"&gt;:&lt;/span&gt; complex&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;function&lt;/span&gt; mult &lt;span class="br0"&gt;(&lt;/span&gt;n1,n2 &lt;span class="sy0"&gt;:&lt;/span&gt; complex&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; fft_pkg&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;package&lt;/span&gt; &lt;span class="kw1"&gt;body&lt;/span&gt; fft_pkg &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--addition of complex numbers&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;function&lt;/span&gt; add &lt;span class="br0"&gt;(&lt;/span&gt;n1,n2 &lt;span class="sy0"&gt;:&lt;/span&gt; complex&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt; complex &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;variable&lt;/span&gt; sum &lt;span class="sy0"&gt;:&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &lt;br /&gt;
sum.r&lt;span class="sy0"&gt;:=&lt;/span&gt;n1.r + n2.r&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
sum.i&lt;span class="sy0"&gt;:=&lt;/span&gt;n1.i + n2.i&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;return&lt;/span&gt; sum&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; add&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--subtraction of complex numbers.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;function&lt;/span&gt; sub &lt;span class="br0"&gt;(&lt;/span&gt;n1,n2 &lt;span class="sy0"&gt;:&lt;/span&gt; complex&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt; complex &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;variable&lt;/span&gt; diff &lt;span class="sy0"&gt;:&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &lt;br /&gt;
diff.r&lt;span class="sy0"&gt;:=&lt;/span&gt;n1.r - n2.r&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
diff.i&lt;span class="sy0"&gt;:=&lt;/span&gt;n1.i - n2.i&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;return&lt;/span&gt; diff&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; sub&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--multiplication of complex numbers.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;function&lt;/span&gt; mult &lt;span class="br0"&gt;(&lt;/span&gt;n1,n2 &lt;span class="sy0"&gt;:&lt;/span&gt; complex&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt; complex &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;variable&lt;/span&gt; prod &lt;span class="sy0"&gt;:&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &lt;br /&gt;
prod.r&lt;span class="sy0"&gt;:=&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;n1.r * n2.r&lt;span class="br0"&gt;)&lt;/span&gt; - &lt;span class="br0"&gt;(&lt;/span&gt;n1.i * n2.i&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
prod.i&lt;span class="sy0"&gt;:=&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;n1.r * n2.i&lt;span class="br0"&gt;)&lt;/span&gt; + &lt;span class="br0"&gt;(&lt;/span&gt;n1.i * n2.r&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;return&lt;/span&gt; prod&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; mult&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; fft_pkg&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;The top level entity - fft8.vhd:&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.MATH_REAL.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.fft_pkg.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; fft8 &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; s &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; comp_array&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--input signals in time domain&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; comp_array &amp;nbsp;&lt;span class="co1"&gt;--output signals in frequency domain&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; fft8&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; fft8 &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;component&lt;/span&gt; butterfly &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; s1,s2 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--inputs&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; w &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;in&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- phase factor&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; g1,g2 &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;out&lt;/span&gt; complex &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- outputs&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;component&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; g1,g2 &lt;span class="sy0"&gt;:&lt;/span&gt; comp_array &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0.0&lt;/span&gt;,&lt;span class="nu0"&gt;0.0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;--phase factor, W_N = e^(-j*2*pi/N) &amp;nbsp;and N=8 here.&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;--W_N^i = cos(2*pi*i/N) - j*sin(2*pi*i/N); &amp;nbsp;and i has range from 0 to 7.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;constant&lt;/span&gt; w &lt;span class="sy0"&gt;:&lt;/span&gt; comp_array2 &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1.0&lt;/span&gt;,&lt;span class="nu0"&gt;0.0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;, &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0.7071&lt;/span&gt;,-&lt;span class="nu0"&gt;0.7071&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;, &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0.0&lt;/span&gt;,-&lt;span class="nu0"&gt;1.0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;, &lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;0.7071&lt;/span&gt;,-&lt;span class="nu0"&gt;0.7071&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--first stage of butterfly's.&lt;/span&gt;&lt;br /&gt;
bf11 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
bf12 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;6&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
bf13 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
bf14 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;6&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--second stage of butterfly's.&lt;/span&gt;&lt;br /&gt;
bf21 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
bf22 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
bf23 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;6&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;6&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
bf24 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g1&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--third stage of butterfly's.&lt;/span&gt;&lt;br /&gt;
bf31 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,y&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,y&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
bf32 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,y&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,y&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
bf33 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;6&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,y&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,y&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;6&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
bf34 &lt;span class="sy0"&gt;:&lt;/span&gt; butterfly &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,g2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,w&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,y&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;,y&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Butterfly component - butterfly.vhd:&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.fft_pkg.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; butterfly &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; s1,s2 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--inputs&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; w &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;in&lt;/span&gt; complex&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- phase factor&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; g1,g2 &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;out&lt;/span&gt; complex &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- outputs&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; butterfly&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; butterfly &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--butterfly equations.&lt;/span&gt;&lt;br /&gt;
g1 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; add&lt;span class="br0"&gt;(&lt;/span&gt;s1,mult&lt;span class="br0"&gt;(&lt;/span&gt;s2,w&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
g2 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; sub&lt;span class="br0"&gt;(&lt;/span&gt;s1,mult&lt;span class="br0"&gt;(&lt;/span&gt;s2,w&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Testbench code - tb_fft8.vhd:&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.fft_pkg.&lt;span class="kw1"&gt;all&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; tb&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; behavior &lt;span class="kw1"&gt;OF&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; s,y &lt;span class="sy0"&gt;:&lt;/span&gt; comp_array&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;-- Instantiate the Unit Under Test (UUT)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;uut&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;entity&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.fft8 &lt;span class="kw1"&gt;PORT&lt;/span&gt; &lt;span class="kw1"&gt;MAP&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; s,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;y &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; y&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Stimulus process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;stim_proc&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--sample inputs in time domain.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;2.0&lt;/span&gt;,&lt;span class="nu0"&gt;1.2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;2.2&lt;/span&gt;,&lt;span class="nu0"&gt;1.7&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1.0&lt;/span&gt;,-&lt;span class="nu0"&gt;2.0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;3.0&lt;/span&gt;,-&lt;span class="nu0"&gt;3.2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4.5&lt;/span&gt;,-&lt;span class="nu0"&gt;2.5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;1.6&lt;/span&gt;,&lt;span class="nu0"&gt;0.2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;6&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0.5&lt;/span&gt;,&lt;span class="nu0"&gt;1.5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;2.8&lt;/span&gt;,-&lt;span class="nu0"&gt;4.2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Copy and paste the above codes into their respective files and simulate. You will get the output in the output signal 'y'. Once again, the code is not synthesisable.&lt;br /&gt;
&lt;br /&gt;
Hope the codes are helpful for you. In case you want a synthesisable version of the codes or want a customized FFT vhdl code then contact me.&amp;nbsp;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/Ed5KhFjflDM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/2276057945531545381/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/06/non-synthesisable-vhdl-code-for-8-point.html#comment-form" title="17 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/2276057945531545381?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/2276057945531545381?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/Ed5KhFjflDM/non-synthesisable-vhdl-code-for-8-point.html" title="Non-synthesisable VHDL code for 8 point FFT algorithm" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>17</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/06/non-synthesisable-vhdl-code-for-8-point.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08MRns5eip7ImA9WhZaEEw.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-354752573806031895</id><published>2011-06-25T22:08:00.000+05:30</published><updated>2011-06-25T22:08:07.522+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-25T22:08:07.522+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="useful codes" /><category scheme="http://www.blogger.com/atom/ns#" term="FIR filter" /><title>VHDL code for a 4 tap FIR filter</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&amp;nbsp; &amp;nbsp;Finite Impulse Response(FIR) filters are one of the two main type of filters available for signal processing. As the name suggests the output of a FIR filter is finite and it settles down to zero after some time. For a basic FAQ on FIR filters see this &lt;a href="http://www.dspguru.com/dsp/faqs/fir/basics"&gt;post by dspguru&lt;/a&gt;.&lt;br /&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp;A FIR filter output, 'y' can be defined by the following equation: &amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;img alt="y[n] = \sum_{i=0}^{N} b_i x[n-i]" src="http://upload.wikimedia.org/math/f/5/2/f529cdc0903f73eec3e31f275ff5da4f.png" /&gt;&lt;/div&gt;
&lt;div&gt;
Here, 'y' is the filter output, 'x' in the input signal and 'b' is the filter&amp;nbsp;coefficients. 'N' is the filter order. The higher the value of N is, the more complex the filter will be.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
For writing the code in VHDL I have referred to the paper,&amp;nbsp;&lt;a href="http://algos.inesc-id.pt/~pff/newcms/publications/Daitx-SCS08.pdf"&gt;VHDL generation of optimized FIR filters&lt;/a&gt;&amp;nbsp;, available online. You can say I have coded the exact block diagram available in the paper, "Figure 2".&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This is a 4 tap filter. That means the order of the filter is 4 and so it has 4 coefficients. I have defined the input as signed type of 8 bits wide. The output is also of signed type with 16 bits width. The design contains two files. One is the main file with all&amp;nbsp;multiplications&amp;nbsp;and adders defined in it, and another for defining the D flip flop operation.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The main file is given below:&lt;/div&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;NUMERIC_STD&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; fir_4tap &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--clock signal&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--input signal&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Yout &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--filter output&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; fir_4tap&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; fir_4tap &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;component&lt;/span&gt; &lt;span class="kw1"&gt;DFF&lt;/span&gt; &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; Q &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--output connected to the adder&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock input&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; D &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;in&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Data input from the MCM block.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;component&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; H0,H1,H2,H3 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; MCM0,MCM1,MCM2,MCM3,add_out1,add_out2,add_out3 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; Q1,Q2,Q3 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--filter coefficient initializations.&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;--H = [-2 -1 3 4].&lt;/span&gt;&lt;br /&gt;
H0 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;2&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
H1 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
H2 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
H3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--Multiple constant multiplications.&lt;/span&gt;&lt;br /&gt;
MCM3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; H3*Xin&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
MCM2 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; H2*Xin&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
MCM1 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; H1*Xin&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
MCM0 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; H0*Xin&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--adders&lt;/span&gt;&lt;br /&gt;
add_out1 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Q1 + MCM2&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
add_out2 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Q2 + MCM1&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
add_out3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Q3 + MCM0&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--flipflops(for introducing a delay).&lt;/span&gt;&lt;br /&gt;
dff1 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;DFF&lt;/span&gt; &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Q1,Clk,MCM3&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
dff2 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;DFF&lt;/span&gt; &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Q2,Clk,add_out1&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
dff3 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;DFF&lt;/span&gt; &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Q3,Clk,add_out2&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--an output produced at every positive edge of clock cycle.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Yout &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; add_out3&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
VHDL code for the component DFF is given below:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;NUMERIC_STD&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; &lt;span class="kw1"&gt;DFF&lt;/span&gt; &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; Q &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--output connected to the adder&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock input&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; D &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;in&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Data input from the MCM block.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;DFF&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; &lt;span class="kw1"&gt;DFF&lt;/span&gt; &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; qt &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
Q &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; qt&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; qt &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; D&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
I have written a small test bench code for testing the design. It contains 8 test inputs which are serially applied to the filter module. See below:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;numeric_std&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; tb&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; behavior &lt;span class="kw1"&gt;OF&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; Xin &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; Yout &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;constant&lt;/span&gt; Clk_period &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;time&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;-- Instantiate the Unit Under Test (UUT)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;uut&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;entity&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.fir_4tap &lt;span class="kw1"&gt;PORT&lt;/span&gt; &lt;span class="kw1"&gt;MAP&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Clk,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Xin,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Yout &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Yout&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock process definitions&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;Clk_process &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Stimulus process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;stim_proc&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;3&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;2&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;-&lt;span class="nu0"&gt;5&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;6&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Xin &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; to_signed&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
The simulation waveform is given below:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-q9I0Mc1ruAE/TgYL0pv61qI/AAAAAAAAA5U/uRXiMCJ0MPM/s1600/1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="35" src="http://1.bp.blogspot.com/-q9I0Mc1ruAE/TgYL0pv61qI/AAAAAAAAA5U/uRXiMCJ0MPM/s320/1.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The code is synthesisable and with a few changes can be ported for a higher order filter.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/6sOgZGyX6MU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/354752573806031895/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/06/vhdl-code-for-4-tap-fir-filter.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/354752573806031895?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/354752573806031895?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/6sOgZGyX6MU/vhdl-code-for-4-tap-fir-filter.html" title="VHDL code for a 4 tap FIR filter" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-q9I0Mc1ruAE/TgYL0pv61qI/AAAAAAAAA5U/uRXiMCJ0MPM/s72-c/1.JPG" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/06/vhdl-code-for-4-tap-fir-filter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIMSHo_cCp7ImA9WhZbF0Q.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-6415021839151179938</id><published>2011-06-23T08:06:00.000+05:30</published><updated>2011-06-23T08:06:29.448+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-23T08:06:29.448+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="useful codes" /><category scheme="http://www.blogger.com/atom/ns#" term="examples" /><title>VHDL code for a simple ALU</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;ALU(Arithmetic Logic Unit) &lt;/b&gt;is a digital circuit which does arithmetic and logical operations. Its a basic block in any processor.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&amp;nbsp; In this article I have shared vhdl code for a simple ALU. Note that this is one of the simplest architecture of an ALU. Most of the ALU's used in practical designs are far more complicated and requires good design experience.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&amp;nbsp; The block diagram of the ALU is given below. As you can see, it receives two input operands 'A' and 'B' which are 8 bits long. The result is denoted by 'R' which is also 8 bit long. The input signal 'Op' is a 3 bit value which tells the ALU what operation to be performed by the ALU. Since 'Op' is 3 bits long we can have 2^3=8 operations.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-Hi7t2CFWxdY/TgG2Pbu4tXI/AAAAAAAAA5Q/nlkGa0jZTKM/s1600/2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-Hi7t2CFWxdY/TgG2Pbu4tXI/AAAAAAAAA5Q/nlkGa0jZTKM/s320/2.JPG" width="208" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&amp;nbsp; &amp;nbsp;Our ALU is capable of doing the following operations:&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;table border="1"&gt; 
&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;ALU Operation&lt;/th&gt;&lt;th&gt;Description
&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;Add Signed&lt;/td&gt;&lt;td&gt;R = A + B&amp;nbsp;: Treating A, B, and R as signed two's complement integers.
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;Subtract Signed&lt;/td&gt;&lt;td&gt;R = A - B&amp;nbsp;: Treating A, B, and R as signed&amp;nbsp;&amp;nbsp;two's complement integers.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;Bitwise AND&lt;/td&gt;&lt;td&gt;R(i) = A(i) AND B(i).
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;Bitwise NOR&lt;/td&gt;&lt;td&gt;R(i) = A(i) NOR B(i).
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;Bitwise OR&lt;/td&gt;&lt;td&gt;R(i) = A(i) OR B(i).
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;Bitwise NAND&lt;/td&gt;&lt;td&gt;R(i) = A(i) NAND B(i).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;Bitwise XOR&lt;/td&gt;&lt;td&gt;R(i) = A(i) XOR B(i).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;Biwise NOT&lt;/td&gt;&lt;td&gt;R(i) = NOT A(i).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt; 
&lt;/table&gt;
&lt;br /&gt;
&lt;div&gt;
These functions are implemented using a case statement. The ALU calculates the outputs at every positive edge of clock cycle. As soon as the outputs are calculated it is available at the port signal 'R'. See the code below, to know how it is done:&lt;/div&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;NUMERIC_STD&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; simple_alu &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--clock signal&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A,B &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--input operands&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Op &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;unsigned&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Operation to be performed&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; R &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--output of ALU&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; simple_alu&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; simple_alu &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--temporary signal declaration.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; Reg1,Reg2,Reg3 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Reg1 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; A&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
Reg2 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; B&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
R &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Reg3&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt; &lt;span class="co1"&gt;--Do the calculation at the positive edge of clock cycle.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;case&lt;/span&gt; Op &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="st0"&gt;"000"&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Reg3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Reg1 + Reg2&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--addition&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="st0"&gt;"001"&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Reg3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Reg1 - Reg2&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--subtraction&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="st0"&gt;"010"&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Reg3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="kw1"&gt;not&lt;/span&gt; Reg1&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--NOT gate&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="st0"&gt;"011"&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Reg3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Reg1 nand Reg2&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--NAND gate &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="st0"&gt;"100"&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Reg3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Reg1 &lt;span class="kw1"&gt;nor&lt;/span&gt; Reg2&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--NOR gate &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="st0"&gt;"101"&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Reg3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Reg1 &lt;span class="kw1"&gt;and&lt;/span&gt; Reg2&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &lt;span class="co1"&gt;--AND gate&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="st0"&gt;"110"&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Reg3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Reg1 &lt;span class="kw1"&gt;or&lt;/span&gt; Reg2&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--OR gate&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="st0"&gt;"111"&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Reg3 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Reg1 &lt;span class="kw1"&gt;xor&lt;/span&gt; Reg2&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--XOR gate &amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;NULL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;case&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
The testbench code used for testing the ALU code is given below:&lt;/div&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;numeric_std&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; tb&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; behavior &lt;span class="kw1"&gt;OF&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; A,B,R &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;signed&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; Op &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;unsigned&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;constant&lt;/span&gt; Clk_period &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;time&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;-- Instantiate the Unit Under Test (UUT)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;uut&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;entity&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.simple_alu &lt;span class="kw1"&gt;PORT&lt;/span&gt; &lt;span class="kw1"&gt;MAP&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Clk,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; A,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; B &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; B,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Op &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Op,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; R &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; R&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock process definitions&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;Clk_process &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Stimulus process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;stim_proc&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period*&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="st0"&gt;"00010010"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--18 in decimal&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; B &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="st0"&gt;"00001010"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--10 in decimal&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Op &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="st0"&gt;"000"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--add A and B&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Op &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="st0"&gt;"001"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--subtract B from A.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Op &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="st0"&gt;"010"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Bitwise NOT of A&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Op &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="st0"&gt;"011"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Bitwise NAND of A and B&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Op &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="st0"&gt;"100"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Bitwise NOR of A and B&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Op &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="st0"&gt;"101"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Bitwise AND of A and B&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Op &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="st0"&gt;"110"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Bitwise OR of A and B&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Op &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="st0"&gt;"111"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Bitwise XOR of A and B&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
This is the simulation waveform:&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-xnb2NEQzRY0/TgG2KGkqnPI/AAAAAAAAA5M/vmaIzM67mnY/s1600/1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="56" src="http://1.bp.blogspot.com/-xnb2NEQzRY0/TgG2KGkqnPI/AAAAAAAAA5M/vmaIzM67mnY/s400/1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The code is &lt;b&gt;sythesisable&lt;/b&gt;. I&amp;nbsp;haven't&amp;nbsp;used std_logic_vector in this code. You can read &lt;a href="http://vhdlguru.blogspot.com/2010/03/why-library-numericstd-is-preferred.html"&gt;this post&lt;/a&gt; to know why.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The block diagram was adopted from this &lt;a href="http://kujo.cs.pitt.edu/index.php/ALU_Black_Box"&gt;original article&lt;/a&gt;. To make sure you have understood the concepts well, try implementing the block diagram given in the original article.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/t7lDK6jrNKA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/6415021839151179938/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/06/vhdl-code-for-simple-alu.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/6415021839151179938?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/6415021839151179938?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/t7lDK6jrNKA/vhdl-code-for-simple-alu.html" title="VHDL code for a simple ALU" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-Hi7t2CFWxdY/TgG2Pbu4tXI/AAAAAAAAA5Q/nlkGa0jZTKM/s72-c/2.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/06/vhdl-code-for-simple-alu.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMMRHs5fyp7ImA9WhZbEkw.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-1715600328008634800</id><published>2011-06-16T15:31:00.000+05:30</published><updated>2011-06-16T15:31:25.527+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-16T15:31:25.527+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="real variable" /><category scheme="http://www.blogger.com/atom/ns#" term="Behavior level model" /><category scheme="http://www.blogger.com/atom/ns#" term="vhdl tips" /><title>Using real data types in VHDL</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;Apart from the standard types like integer and std_logic_vector's VHDL also offer &lt;b&gt;real&lt;/b&gt; data types. But a real data type has a big disadvantage. It is not synthesis-able. It can be used only for simulation purposes. This disadvantage limits its use to a large extend, but there are plenty of projects where we look only for simulation results.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; Before starting the coding part of a VHDL project,one has to decide whether the project to be implemented on a real FPGA or just a computer simulation is required. If it has to be ran on FPGA, then forget about the real package and use only synthesis-able data types like std_logic,integer etc... Otherwise you can reduce the time and complexity of your project by using real data types.&lt;br /&gt;
&lt;br /&gt;
The real data type is defined in the library called &lt;b&gt;MATH_REAL&lt;/b&gt;. So you have to include the following line before the entity declaration in the code:&lt;br /&gt;
use ieee.math_real.all;&lt;br /&gt;
&lt;br /&gt;
The math_real package also offers some elementary mathematical functions for real data types. You can see the math_real.vhd file at the &lt;a href="http://www.eda-stds.org/vhdl-200x/vhdl-200x-ft/packages_old/math_real.vhdl"&gt;following address&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
See the below code to get an idea on how to use these functions:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.MATH_REAL.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; real_demo &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; real_demo&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; real_demo &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--signals declared with the REAL data type.&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;--MATH_PI is a constant defined in the math_real package.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; X &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;real&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; -MATH_PI/&lt;span class="nu0"&gt;3.0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--A real variable X, initialized to pi/3(60 degreee).&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; sign_result,ceil_result,floor_result,round_result,trunc_result &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;real&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0.0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; max,min,root,cube,power1,power2,exp_result &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;real&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0.0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; log_result,log2_result,log10_result,log_result2,sine,cosine,tangent &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;real&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0.0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; sin_inv,cos_inv,tan_inv,sin_hyp,cos_hyp,tan_hyp &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;real&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0.0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; inv_sin_hyp,inv_cos_hyp,inv_tan_hyp &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;real&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0.0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
sign_result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; SIGN&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--sign of X&lt;/span&gt;&lt;br /&gt;
ceil_result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; CEIL&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--smallest integer value not less than X&lt;/span&gt;&lt;br /&gt;
floor_result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; FLOOR&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--largest integer value not greater than X&lt;/span&gt;&lt;br /&gt;
round_result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; ROUND&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--round to the nearest integer.&lt;/span&gt;&lt;br /&gt;
trunc_result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; TRUNC&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--truncation.&lt;/span&gt;&lt;br /&gt;
max &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; REALMAX&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4.5&lt;/span&gt;,&lt;span class="nu0"&gt;4.6&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--return the maximum&lt;/span&gt;&lt;br /&gt;
min &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; REALMIN&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2.3&lt;/span&gt;,&lt;span class="nu0"&gt;3.2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--return the minimum&lt;/span&gt;&lt;br /&gt;
root &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; SQRT&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4.0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--square root&lt;/span&gt;&lt;br /&gt;
cube &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; CBRT&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;64.0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--cube root&lt;/span&gt;&lt;br /&gt;
power1 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;2&lt;/span&gt;**&lt;span class="nu0"&gt;3.0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--power of an integer&lt;/span&gt;&lt;br /&gt;
power2 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;3.0&lt;/span&gt;**&lt;span class="nu0"&gt;3.0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--power of a real&lt;/span&gt;&lt;br /&gt;
exp_result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; EXP&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1.0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--returns e**X.&lt;/span&gt;&lt;br /&gt;
log_result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; LOG&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2.73&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--natural logarithm&lt;/span&gt;&lt;br /&gt;
log2_result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; LOG2&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;16.0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--log to the base 2.&lt;/span&gt;&lt;br /&gt;
log10_result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; LOG10&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;100.0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--log to the base 10.&lt;/span&gt;&lt;br /&gt;
log_result2 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; LOG&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;27.0&lt;/span&gt;,&lt;span class="nu0"&gt;3.0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--log to the given base.&lt;/span&gt;&lt;br /&gt;
sine &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; SIN&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--sine of the given angle(in rad)&lt;/span&gt;&lt;br /&gt;
cosine &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; COS&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;span class="co1"&gt;--cosine of the given angle(in rad)&lt;/span&gt;&lt;br /&gt;
tangent &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; TAN&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;span class="co1"&gt;--tangent of the given angle(in rad)&lt;/span&gt;&lt;br /&gt;
sin_inv &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; ARCSIN&lt;span class="br0"&gt;(&lt;/span&gt;SIN&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--sine inverse.&lt;/span&gt;&lt;br /&gt;
cos_inv &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; ARCCOS&lt;span class="br0"&gt;(&lt;/span&gt;COS&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--cosine inverse.&lt;/span&gt;&lt;br /&gt;
tan_inv &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; ARCTAN&lt;span class="br0"&gt;(&lt;/span&gt;TAN&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--tangent inverse.&lt;/span&gt;&lt;br /&gt;
sin_hyp &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; SINH&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Hyperbolic sine&lt;/span&gt;&lt;br /&gt;
cos_hyp &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; COSH&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Hyperbolic cosine.&lt;/span&gt;&lt;br /&gt;
tan_hyp &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; TANH&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Hyperbolic tangent.&lt;/span&gt;&lt;br /&gt;
inv_sin_hyp &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; ARCSINH&lt;span class="br0"&gt;(&lt;/span&gt;SINH&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Inverse hyperbolic sine.&lt;/span&gt;&lt;br /&gt;
inv_cos_hyp &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; ARCCOSH&lt;span class="br0"&gt;(&lt;/span&gt;COSH&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Inverse hyperbolic cosine.&lt;/span&gt;&lt;br /&gt;
inv_tan_hyp &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; ARCTANH&lt;span class="br0"&gt;(&lt;/span&gt;TANH&lt;span class="br0"&gt;(&lt;/span&gt;X&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Inverse hyperbolic tangent.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Almost all the functions available in the real package are shown above and comments are provided on what they are used for. For your reference I have attached the simulation result below:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-jG126Uj2U10/TfnSzqUZQGI/AAAAAAAAA5A/FB1Bo7iRbLw/s1600/1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://3.bp.blogspot.com/-jG126Uj2U10/TfnSzqUZQGI/AAAAAAAAA5A/FB1Bo7iRbLw/s400/1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
As you can see its a pretty useful library. Dont forget to use it if you have a simulation project in VHDL. Contact me for any kind of help. I always use this package when I need to convert a matlab code to corresponding VHDL(for just simulation). Using this package, helps me to write the vhdl code like a&amp;nbsp;pseudo&amp;nbsp;code.&amp;nbsp;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/XP1r9tOd7_8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/1715600328008634800/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/06/using-real-data-types-in-vhdl.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/1715600328008634800?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/1715600328008634800?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/XP1r9tOd7_8/using-real-data-types-in-vhdl.html" title="Using real data types in VHDL" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-jG126Uj2U10/TfnSzqUZQGI/AAAAAAAAA5A/FB1Bo7iRbLw/s72-c/1.JPG" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/06/using-real-data-types-in-vhdl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UGR30_eCp7ImA9Wx9aFks.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-7746628624611286225</id><published>2011-03-09T14:30:00.000+05:30</published><updated>2011-03-09T14:30:26.340+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-09T14:30:26.340+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="useful codes" /><category scheme="http://www.blogger.com/atom/ns#" term="examples" /><title>Clock Frequency converter in VHDL</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
In FPGA designs, there are situations where you want a clock signal with a small frequency(or high time period). But in most of FPGA boards the frequency of the crystal oscillators available are of the range of tens of MHz.&lt;br /&gt;
&lt;br /&gt;
One solution to the above problem is to take the high frequency clock available on board and convert it to a lower frequency clock. This is called frequency down conversion. I have shared a code here for a general purpose clock down converter.&lt;br /&gt;
&lt;br /&gt;
The entity clk_gen takes a high frequency clock, &lt;b&gt;Clk &lt;/b&gt;and an integer value &lt;b&gt;divide_value&lt;/b&gt;&amp;nbsp;as inputs and produces the converted clock at &lt;b&gt;Clk_mod. &lt;/b&gt;The divide_value is defined as follows:&lt;br /&gt;
&lt;br /&gt;
divide_value = (Frequency of Clk) / (Frequency of Clk_mod).&lt;br /&gt;
&lt;br /&gt;
For example if you want to convert a 100 MHz signal into a 2 MHz signal then set the divide_value port as "50".&lt;br /&gt;
&lt;br /&gt;
Without much further explanation I will give you the code:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;NUMERIC_STD&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; clk_gen &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk_mod &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; divide_value &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; clk_gen&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; clk_gen &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; counter,divide &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
divide &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; divide_value&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;counter &lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt; divide/&lt;span class="nu0"&gt;2&lt;/span&gt;-&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; counter &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; counter + &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk_mod &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;elsif&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;counter &lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt; divide-&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; counter &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; counter + &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk_mod &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk_mod &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; counter &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
The testbench code used for testing the code is given below:&lt;/div&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&amp;nbsp; &lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;numeric_std&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;span class="kw1"&gt;ENTITY&lt;/span&gt; testbench &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span class="kw1"&gt;END&lt;/span&gt; testbench&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; behavior &lt;span class="kw1"&gt;OF&lt;/span&gt; testbench &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;signal&lt;/span&gt; clk,clk_mod &lt;span class="sy0"&gt;:&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;signal&lt;/span&gt; divide_value &lt;span class="sy0"&gt;:&lt;/span&gt; &amp;nbsp;&lt;span class="kw2"&gt;integer&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;constant&lt;/span&gt; clk_period &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;time&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span class="co1"&gt;-- Component Instantiation&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; uut&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;entity&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.clk_gen &lt;span class="kw1"&gt;PORT&lt;/span&gt; &lt;span class="kw1"&gt;MAP&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clk &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; clk,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clk_mod &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; clk_mod,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; divide_value &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; divide_value &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; simulate &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; divide_value &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--divide the input clock by 10 to get 10(100/10) MHz signal.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;500&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; divide_value &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;19&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--divide the input clock by 19 to get 5.3(100/19) MHz signal.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; clk_process &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;process&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--generates a 100 MHz clock.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--for 5 ns signal is '0'.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--for next 5 ns signal is '1'.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;span class="kw1"&gt;END&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Note :-&lt;/b&gt; The code was simulated and synthesised successfully using Xilinx Webpack version 13.1. It should work fine under other tools as well.&amp;nbsp;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/22RBx7pgaLk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/7746628624611286225/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/03/clock-frequency-converter-in-vhdl.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/7746628624611286225?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/7746628624611286225?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/22RBx7pgaLk/clock-frequency-converter-in-vhdl.html" title="Clock Frequency converter in VHDL" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/03/clock-frequency-converter-in-vhdl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMDQ3c9fip7ImA9Wx9UGUw.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-2254208798899109420</id><published>2011-02-17T09:51:00.000+05:30</published><updated>2011-02-17T09:51:12.966+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-17T09:51:12.966+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="file handling" /><category scheme="http://www.blogger.com/atom/ns#" term="testbench" /><title>File reading and writing in VHDL - Part 2</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
I have published a post on file reading and writing using VHDL before. You can access it &lt;a href="http://vhdlguru.blogspot.com/2010/03/reading-and-writing-files-in-vhdl-easy.html"&gt;here&lt;/a&gt;. As you know file manipulation will help you to verify your design more effectively at the debugging stage of your design.&lt;br /&gt;
&lt;br /&gt;
For file operation we use the library named &lt;b&gt;textio &lt;/b&gt;in the &lt;b&gt;STD &lt;/b&gt;directory. This library contains the in built functions for reading and writing files.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Reading Files in VHDL:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The below code reads a set of binary numbers from the file named read.txt and put them into a 4 bit std_logic_vector signal.&amp;nbsp;The text file used with the code can be downloaded from &lt;a href="https://sites.google.com/site/vhdlfiles/codes/read.txt?attredirects=0&amp;amp;d=1"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; STD.textio.&lt;span class="kw1"&gt;all&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Dont forget to include this library for file operations.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; read_file &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; read_file&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; beha &lt;span class="kw1"&gt;OF&lt;/span&gt; read_file &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;signal&lt;/span&gt; &amp;nbsp;bin_value &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;:=&lt;/span&gt;&lt;span class="st0"&gt;"0000"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--Read process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;process&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;file&lt;/span&gt; file_pointer &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;text&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;variable&lt;/span&gt; line_content &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;string&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;variable&lt;/span&gt; line_num &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;line&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;variable&lt;/span&gt; j &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;variable&lt;/span&gt; char &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;character&lt;/span&gt;&lt;span class="sy0"&gt;:=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--Open the file read.txt from the specified location for reading(READ_MODE).&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; file_open&lt;span class="br0"&gt;(&lt;/span&gt;file_pointer,&lt;span class="st0"&gt;"C:\read.txt"&lt;/span&gt;,READ_MODE&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;while&lt;/span&gt; &lt;span class="kw1"&gt;not&lt;/span&gt; endfile&lt;span class="br0"&gt;(&lt;/span&gt;file_pointer&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt; &lt;span class="co1"&gt;--till the end of file is reached continue.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; readline &lt;span class="br0"&gt;(&lt;/span&gt;file_pointer,line_num&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Read the whole line from the file&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--Read the contents of the line from &amp;nbsp;the file into a variable.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; READ &lt;span class="br0"&gt;(&lt;/span&gt;line_num,line_content&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--For each character in the line convert it to binary value.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--And then store it in a signal named 'bin_value'.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; j &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;4&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char &lt;span class="sy0"&gt;:=&lt;/span&gt; line_content&lt;span class="br0"&gt;(&lt;/span&gt;j&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;char &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bin_value&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;-j&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bin_value&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;-j&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--after reading each line wait for 10ns.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; file_close&lt;span class="br0"&gt;(&lt;/span&gt;file_pointer&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--after reading all the lines close the file.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; beha&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
The above VHDL code can also be downloaded from&amp;nbsp;&lt;a href="https://sites.google.com/site/vhdlfiles/codes/tb1.vhd?attredirects=0&amp;amp;d=1"&gt;here&lt;/a&gt;.&amp;nbsp;I have commented the codes so that you can understand the flow of the code. The values read from the file are represented by a signal named &lt;b&gt;bin_value. &lt;/b&gt;The simulation waveform is given below:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-VfegI7tzIGA/TVygkIJClCI/AAAAAAAAAr8/V8mo4Ss73o4/s1600/1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="36" src="http://2.bp.blogspot.com/-VfegI7tzIGA/TVygkIJClCI/AAAAAAAAAr8/V8mo4Ss73o4/s320/1.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The main points to be noted are:&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Declare file pointers and other variables required as given in the above code.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;file_open()&lt;/b&gt;&amp;nbsp;to open the file. &lt;b&gt;Change the path of the file&lt;/b&gt; depending on where your file is stored.&lt;/li&gt;
&lt;li&gt;Use &lt;b&gt;read &lt;/b&gt;and &lt;b&gt;readline &lt;/b&gt;functions.&lt;/li&gt;
&lt;li&gt;Finally after everything is over, close the file using &lt;b&gt;file_close.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Writing Files in VHDL:&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&amp;nbsp;&amp;nbsp;The following code is used for writing a file. Remember that these codes contain just examples and depending on what you have to write to the file the code should be changed. The code writes binary numbers from 0000 to 1111 to a file named &lt;a href="https://sites.google.com/site/vhdlfiles/codes/write.txt?attredirects=0&amp;amp;d=1"&gt;write.txt&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_arith&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; STD.textio.&lt;span class="kw1"&gt;all&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; write_file &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; write_file&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; beha &lt;span class="kw1"&gt;OF&lt;/span&gt; write_file &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--Write process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;process&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;file&lt;/span&gt; file_pointer &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;text&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;variable&lt;/span&gt; line_content &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;string&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;variable&lt;/span&gt; bin_value &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;variable&lt;/span&gt; line_num &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;line&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;variable&lt;/span&gt; i,j &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;variable&lt;/span&gt; char &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;character&lt;/span&gt;&lt;span class="sy0"&gt;:=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--Open the file write.txt from the specified location for writing(WRITE_MODE).&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; file_open&lt;span class="br0"&gt;(&lt;/span&gt;file_pointer,&lt;span class="st0"&gt;"C:\write.txt"&lt;/span&gt;,WRITE_MODE&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--We want to store binary values from 0000 to 1111 in the file.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; i &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bin_value &lt;span class="sy0"&gt;:=&lt;/span&gt; conv_std_logic_vector&lt;span class="br0"&gt;(&lt;/span&gt;i,&lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--convert each bit value to character for writing to file.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; j &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;bin_value&lt;span class="br0"&gt;(&lt;/span&gt;j&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; line_content&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;-j&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; line_content&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;-j&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; write&lt;span class="br0"&gt;(&lt;/span&gt;line_num,line_content&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--write the line.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; writeline &lt;span class="br0"&gt;(&lt;/span&gt;file_pointer,line_num&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--write the contents into the file.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--wait for 10ns after writing the current line.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; file_close&lt;span class="br0"&gt;(&lt;/span&gt;file_pointer&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Close the file after writing.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; beha&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
The above code can also be downloaded from &lt;a href="https://sites.google.com/site/vhdlfiles/codes/t1.vhd?attredirects=0&amp;amp;d=1"&gt;here&lt;/a&gt;. Any file writing code should have the following structure:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Declare file pointers and other variables required as given in the above code.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;file_open()&lt;/b&gt;&amp;nbsp;to open the file. &lt;b&gt;Change the path of the file&lt;/b&gt; depending on where your file is stored.&lt;/li&gt;
&lt;li&gt;Use&amp;nbsp;&lt;b&gt;write&amp;nbsp;&lt;/b&gt;and &lt;b&gt;writeline&amp;nbsp;&lt;/b&gt;functions.&lt;/li&gt;
&lt;li&gt;Finally after everything is over, close the file using&amp;nbsp;&lt;b&gt;file_close.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Note:- &lt;/b&gt;The codes are tested successfully using Xilinx Webpack 12.1. Note that file reading is a part of testbench design. In actual FPGA you cannot read or write files. But for functional verification of your design this is a must know.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/c-aIjGQMLM4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/2254208798899109420/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/02/file-reading-and-writing-in-vhdl-part-2.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/2254208798899109420?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/2254208798899109420?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/c-aIjGQMLM4/file-reading-and-writing-in-vhdl-part-2.html" title="File reading and writing in VHDL - Part 2" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-VfegI7tzIGA/TVygkIJClCI/AAAAAAAAAr8/V8mo4Ss73o4/s72-c/1.JPG" height="72" width="72" /><thr:total>13</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/02/file-reading-and-writing-in-vhdl-part-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08FR3c9fCp7ImA9Wx9UGEg.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-8364611313721530807</id><published>2011-02-16T15:53:00.000+05:30</published><updated>2011-02-16T15:53:36.964+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-16T15:53:36.964+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vhdl tips" /><category scheme="http://www.blogger.com/atom/ns#" term="functions" /><title>Be careful when using functions in your code.</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
There are many coding styles in VHDL where the code which work well in the simulation will not work on the actual fpga. In this article I am going to talk about one such RTL coding style.&lt;br /&gt;
&lt;br /&gt;
As you know VHDL programmers normally use &lt;b&gt;functions to represent combinational logic&lt;/b&gt;. But using functions every where without much thinking may result in dangerous&amp;nbsp;bugs in the code. &lt;b&gt;One perfect example is a function which replaces the code for a latch.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
See the below code, which doesn't use a function:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; test &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; en1,a,Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; output &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; test&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; BEHAVIORAL &lt;span class="kw1"&gt;of&lt;/span&gt; test &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;en1 &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; a&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; BEHAVIORAL&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
In the above code, whenever signal &lt;b&gt;en1&lt;/b&gt;&amp;nbsp;goes high, at the positive edge of &lt;b&gt;Clk&lt;/b&gt;&amp;nbsp;we assign &lt;b&gt;a &lt;/b&gt;to &lt;b&gt;output&lt;/b&gt;&amp;nbsp;port. We don't specify what will happen when the value of &lt;b&gt;en1&lt;/b&gt;&amp;nbsp;is '0'. So basically the code results in a latch.&lt;br /&gt;
When synthesised, XST(Xilinx synthesis tool) uses a &lt;a href="http://www.xilinx.com/itp/xilinx5/data/docs/lib/lib0164_148.html"&gt;FDE&lt;/a&gt; flip flop for implementing the code. If you check the link pointed by FDE, you can see the truth table of FDE flip flop. As expected, it works like a latch. Whenever &lt;b&gt;CE &lt;/b&gt;is '0' the flip flop retains the previous output.&lt;br /&gt;
&lt;br /&gt;
Now I am going re-write the above code using functions. I will replace some part of the combinational logic inside the process with a function. See the code below:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; test &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; en1,a,Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; output &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; test&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; BEHAVIORAL &lt;span class="kw1"&gt;of&lt;/span&gt; test &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;function&lt;/span&gt; &lt;span class="kw1"&gt;latch&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;en1,a &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;variable&lt;/span&gt; output &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;en1 &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output &lt;span class="sy0"&gt;:=&lt;/span&gt; a&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;return&lt;/span&gt; output&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;latch&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="kw1"&gt;latch&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;en1,a&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; BEHAVIORAL&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
At the first look the above code is same as the first code. To confirm both has the same functionality, I simulated them. The outputs are matching. So they indeed work the same way in the simulation. But wait a minute. How about the synthesis results?&lt;br /&gt;
&lt;br /&gt;
I ran XST for the above code and checked the technology viewer to see the synthesised circuit. What I saw was, instead of a FDE flipflop, XST used a &lt;a href="http://www.xilinx.com/itp/xilinx5/data/docs/lib/lib0170_154.html"&gt;FDR&lt;/a&gt; flipflop this time. Go to the link pointed by FDR and check the truth table given there. You can see that its not a latch. When &lt;b&gt;R&lt;/b&gt;&amp;nbsp;is '1' the flipflop output is reset to '0' rather than maintaining the previous value. So both the codes are going to work&amp;nbsp;differently&amp;nbsp;on board.&lt;br /&gt;
&lt;br /&gt;
How did this happen? This is because all functions are synthesised into pure combinational logic by the synthesis tool. This means that you cannot go on using functions every where you want without proper brain storming. If you do, then the pre and post synthesis results may vary.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:- &lt;/b&gt;Both the codes where simulated and&amp;nbsp;synthesized&amp;nbsp;using Xilinx Webpack 12.1. The results may a vary a little depending on the tool you are using.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/0KXGmlBfj7s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/8364611313721530807/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/02/be-careful-when-using-functions-in-your.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/8364611313721530807?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/8364611313721530807?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/0KXGmlBfj7s/be-careful-when-using-functions-in-your.html" title="Be careful when using functions in your code." /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/02/be-careful-when-using-functions-in-your.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04MRHk-eSp7ImA9Wx9UF0U.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-4736488310206679198</id><published>2011-02-15T20:29:00.000+05:30</published><updated>2011-02-15T20:29:45.751+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-15T20:29:45.751+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Buffers" /><category scheme="http://www.blogger.com/atom/ns#" term="xilinx tips" /><title>How to stop using "buffer" ports in VHDL?</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;b&gt;Buffer ports are used when a particular port need to be read and written&lt;/b&gt;. This mode is different from &lt;b&gt;inout&lt;/b&gt;&amp;nbsp;mode. The source of buffer port can only be internal. For example if you need a signal to be declared as output, but at the same time read it in the design, then declare it as buffer type.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;But buffer types are not recommended by Xilinx and they say if it possible try to reduce the amount of buffer usage&lt;/b&gt;. According to Xilinx, buffers may give some problems during synthesis. If a signal is used internally and as an output port then in every level in your hierarchical design, it must be declared as a buffer. So let me show how to reduce the amount of buffer usage with an example.&lt;br /&gt;
&lt;br /&gt;
The following code uses a buffer. I am not going through the functionality of the code since it is very simple.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;NUMERIC_STD&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; with_buffer &lt;span class="kw1"&gt;is&lt;/span&gt; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; A &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;unsigned&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; B &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;unsigned&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; C &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;buffer&lt;/span&gt; &lt;span class="kw2"&gt;unsigned&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; with_buffer&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; BEHAVIORAL &lt;span class="kw1"&gt;of&lt;/span&gt; with_buffer &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; A + B + C&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; BEHAVIORAL&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
As you can see the signal C is used repetitively in the addition, and also its an output of the module. So we declared it as a buffer. Another way to code this same functionality without a buffer is given below:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;NUMERIC_STD&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; without_buffer &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; A &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;unsigned&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; B &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;unsigned&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; C &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;unsigned&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; without_buffer&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; BEHAVIORAL &lt;span class="kw1"&gt;of&lt;/span&gt; without_buffer &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--intermediate signal to avoid the use of buffer.s&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; C_dummy &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;unsigned&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &lt;br /&gt;
C &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; C_dummy&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Assign the intermediate signal to output port.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C_dummy &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; A + B + C_dummy&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Use the intermediate signal in actual calculation.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; BEHAVIORAL&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;/div&gt;
&lt;br /&gt;
What I have done is, I used an intermediate or dummy signal inside the process statement. The value of C is read from this dummy signal named C_dummy. And outside the process we assign the value of C_dummy to the output port C. This is how we reduce the buffer usage in vhdl. &lt;b&gt;Avoiding buffer usage is very useful particularly in case of&amp;nbsp;hierarchical&amp;nbsp;designs.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:- &lt;/b&gt;Both the codes were synthesised&amp;nbsp;successfully&amp;nbsp;using Xilinx Webpack 12.1. The results may or may not vary for Altera FPGA's.&amp;nbsp;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/6NeEiYVHefE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/4736488310206679198/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/02/how-to-stop-using-buffer-ports-in-vhdl.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/4736488310206679198?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/4736488310206679198?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/6NeEiYVHefE/how-to-stop-using-buffer-ports-in-vhdl.html" title="How to stop using &quot;buffer&quot; ports in VHDL?" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/02/how-to-stop-using-buffer-ports-in-vhdl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEGQnk7fip7ImA9Wx9UFU4.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-8864441324380423868</id><published>2011-02-12T23:30:00.000+05:30</published><updated>2011-02-12T23:30:23.706+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-12T23:30:23.706+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C and VHDL" /><category scheme="http://www.blogger.com/atom/ns#" term="vhdl tips" /><title>Difference between C and VHDL</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
It is normally said that once you learn one programming language it is pretty easy to learn the other programming languages. This is because the concepts are almost same in most of the programming languages with some only syntax differences.&lt;br /&gt;
&lt;br /&gt;
But if you ask a hardware engineer, he may have a totally different opinion. If you dont stop thinking from a C programmer's perspective, then life as VHDL programmer will drive you nuts. Because both the languages have many differences between them. Both are different from the basic level itself, though they seem to have many similarities.&lt;br /&gt;
&lt;br /&gt;
So let me compile some of the basic differences between C programming and VHDL programming.&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;/div&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;C is a &lt;b&gt;middle level language&lt;/b&gt;. I mean its a mix of a high level language and an assembly language.&lt;br /&gt;VHDL is a &lt;b&gt;hardware description language&lt;/b&gt;(HDL) . It is used for implementing the hardware circuit.&lt;/li&gt;
&lt;li&gt;C can only handle &lt;b&gt;sequential instructions&lt;/b&gt;. &lt;br /&gt;VHDL allows both &lt;b&gt;sequential and concurrent executions&lt;/b&gt;. &amp;nbsp;&lt;/li&gt;
&lt;li&gt;A C program can be successfully written with pure &lt;b&gt;logical or algorithmic thinking&lt;/b&gt;.&lt;br /&gt;But a successful VHDL programmer needs thorough working &lt;b&gt;knowledge of the hardware circuits&lt;/b&gt;. He should be able to predict how a given code will be implemented in hardware.&lt;/li&gt;
&lt;li&gt;Normally we &lt;b&gt;don't care about resource usage&lt;/b&gt; in C. This is because a C program is usually ran on a computer which uses a powerful processor with high speed. We also don't care about the memory usage.&lt;br /&gt;But when it comes to VHDL a slightly complicated code can make you bent on your &amp;nbsp;knees. The memory and other&lt;b&gt; logic elements are limited in a FPGA&lt;/b&gt;(where you normally put the VHDL code in). This is why it is very difficult to implement image processing algorithms in VHDL than in C.&lt;/li&gt;
&lt;/ol&gt;
These are some of the main points. If you have anything to add, feel free to add them in the comment section.&amp;nbsp;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/f52hbROwD98" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/8864441324380423868/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/02/difference-between-c-and-vhdl.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/8864441324380423868?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/8864441324380423868?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/f52hbROwD98/difference-between-c-and-vhdl.html" title="Difference between C and VHDL" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/02/difference-between-c-and-vhdl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEBSX06fSp7ImA9Wx9WGEo.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-352563111575770237</id><published>2011-01-24T18:24:00.000+05:30</published><updated>2011-01-24T18:24:18.315+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-24T18:24:18.315+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="pipelining" /><category scheme="http://www.blogger.com/atom/ns#" term="vhdl tips" /><title>What is pipelining? Explanation with a simple example in VHDL.</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; A pipeline is a set of data processing elements connected in series, so that the output of one element is the input of the next one. In most of the cases we create a pipeline by dividing a complex operation into simpler operations. We can also say that instead of taking a bulk thing and processing it at once, we break it into smaller pieces and process it one after another.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If you are aware of microprocessor architectures then you may know about &lt;b&gt;instruction pipelining&lt;/b&gt;. In microprocessors for executing an instruction there are many intermediate stages like getting instruction from memory, decode the instruction, get any other required data from memory, process the data and finally write the result back to memory. Without a pipeline a single instruction has to fully go through all these stages before the next instruction is fetched from the memory. But if we apply the concept of pipelining in this case, when an instruction is fetched from memory, the previous instruction must have already decoded. Go through the &lt;a href="http://en.wikipedia.org/wiki/Instruction_pipeline"&gt;wiki definition for instruction pipelining&lt;/a&gt;, if you are interested in knowing more about the background theory.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; In this article I am not going to implement an instruction pipeline. It is kind of complicated and I don't want to confuse readers who are just learning VHDL. The below VHDL code, simply(without pipelining) implements the equation (a*b*c*data_in). Note that a,b and c are constants here and the variable 'data_in' changes every clock cycle. The result of the calculation will be available at the port names 'data_out'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.STD_LOGIC_UNSIGNED.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_ARITH&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; normal &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_out &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; a,b,c &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; normal&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; normal &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; data,result &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
data &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; data_in&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
data_out &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; result&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--process for calcultation of the equation.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;PROCESS&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk,a,b,c,data&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--multiplication is done in a single stage.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; a*b*c*data&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; &lt;span class="kw1"&gt;PROCESS&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
The above code is nothing simple and easy to understand. I have written the pipelined version of the same design. Check it below:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.STD_LOGIC_UNSIGNED.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_ARITH&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; pipelined &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_out &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; a,b,c &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; pipelined&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; pipelined &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; i,data,result &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; temp1,temp2 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
data &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; data_in&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
data_out &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; result&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--process for calcultation of the equation.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;PROCESS&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--Implement the pipeline stages using a for loop and case statement.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--'i' is the stage number here.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--The multiplication is done in 3 stages here.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--See the output waveform of both the modules and compare them.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; i &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;2&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;case&lt;/span&gt; i &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; temp1 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; a*data&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; temp2 &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; temp1*b&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="nu0"&gt;2&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; result &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; temp2*c&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kw1"&gt;null&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;case&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; &lt;span class="kw1"&gt;PROCESS&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
So what have I done different? Our design required 3 multiplications and in the normal version I did it all at once. But if you see the above code, I am doing it stepwise. The equation was broken down into 3 different multiplications and each operation is done on a different clock edge. If you are wondering about the difference between the two codes see the RTL schematic of the two designs:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_c99lLjgQ8ho/TT1jyeL01JI/AAAAAAAAAro/J8SpXO51QO4/s1600/normal_sche.JPG" imageanchor="1"&gt;&lt;img border="0" height="96" src="http://3.bp.blogspot.com/_c99lLjgQ8ho/TT1jyeL01JI/AAAAAAAAAro/J8SpXO51QO4/s1600/normal_sche.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Normal code(without pipelining)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_c99lLjgQ8ho/TT1jzdM8s6I/AAAAAAAAArw/zTckVaAKmzo/s1600/pipeline_sche.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="74" src="http://4.bp.blogspot.com/_c99lLjgQ8ho/TT1jzdM8s6I/AAAAAAAAArw/zTckVaAKmzo/s320/pipeline_sche.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Pipelined code-check the extra flip flops&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&amp;nbsp;&amp;nbsp; As you can see, the normal code is implemented&lt;b&gt; by connecting 3 multipliers in a cascaded fashion with a flip flop at the end stage&lt;/b&gt;. For the pipelined code, we have flip flops after each multiplier. What does this mean? The extra flip flops reduces the delay through the combinatorial logic and hence &lt;b&gt;pipelined code can operate at a higher frequency than the normal code&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; The 'normal' code takes less time to write and is mostly straight forward. But if you want your design to offer the highest speed possible, you have to think out of the box! The 'pipelined' code is little bit complicated to write. In this case we had to use case statements and a for loop to implement a small equation. But it gives&lt;b&gt; higher speed&lt;/b&gt;. In large projects pipelined designs are very important for some blocks since it may act as a&amp;nbsp;bottleneck&amp;nbsp;for the performance of the whole design.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; On the other side there is a small disadvantage for pipelined designs. They introduce a small number of &amp;nbsp;delay between input and output, in terms of clock cycle. For instance we have 3 stages in the pipelined code and hence the output comes only after 3 clock cycles, after the input is applied. But this disadvantage usually doesn't matter in most of the designs since after 3 clock cycles we can get&amp;nbsp;continuous&amp;nbsp;stream of output. This delay can be seen if you check the simulation waveforms of the two designs:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_c99lLjgQ8ho/TT1jy9-7BFI/AAAAAAAAArs/_e3JEIIS_X8/s1600/normal_wave.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="61" src="http://1.bp.blogspot.com/_c99lLjgQ8ho/TT1jy9-7BFI/AAAAAAAAArs/_e3JEIIS_X8/s320/normal_wave.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;waveform for normal code-no delay at all.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_c99lLjgQ8ho/TT1jz4A4ZrI/AAAAAAAAAr0/syn1-pj9kK0/s1600/pipelin_wave.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="81" src="http://3.bp.blogspot.com/_c99lLjgQ8ho/TT1jz4A4ZrI/AAAAAAAAAr0/syn1-pj9kK0/s320/pipelin_wave.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;waveform for pipelined code-3 clock cycle delay.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
The testbench code used for testing the designs is given below. Remember to change the component name if you want to test the 'normal' entity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.std_logic_unsigned.&lt;span class="kw1"&gt;all&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;-- entity declaration for your testbench.Dont declare any ports here&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; test_tb &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; test_tb&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; behavior &lt;span class="kw1"&gt;OF&lt;/span&gt; test_tb &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--declare inputs and initialize them&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; data_in,data_out,a,b,c &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock period definitions&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;constant&lt;/span&gt; clk_period &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;time&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;-- Instantiate the Unit Under Test (UUT)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--Change the entity name below if you want to test the 'normal' entity.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;uut&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;entity&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.pipelined &lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="kw1"&gt;map&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;Clk &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Clk,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; data_in,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_out &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; data_out,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; a &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; a,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; b,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; c&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; a &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; b &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; c &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock process definitions( clock with 50% duty cycle is generated here.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;clk_process &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--for 5 ns signal is '0'.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--for next 5 ns signal is '1'.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Stimulus process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; stim_proc&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;6&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;7&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_in &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nu0"&gt;9&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; behavior&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Note:- &lt;/b&gt;The codes where designed and tested using the Xilinx Webpack version 12.1. The codes are also synthesisable. They should work with other tools too.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;If the design is complex, then always identify and break down it into smaller steps. And implement it in using the pipeline concept. This will increase the maximum clock frequency, reduce the time to synthesis the code and will also increase the throughput of the system.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/EpV8eWtK8Y8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/352563111575770237/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/01/what-is-pipelining-explanation-with.html#comment-form" title="21 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/352563111575770237?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/352563111575770237?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/EpV8eWtK8Y8/what-is-pipelining-explanation-with.html" title="What is pipelining? Explanation with a simple example in VHDL." /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_c99lLjgQ8ho/TT1jyeL01JI/AAAAAAAAAro/J8SpXO51QO4/s72-c/normal_sche.JPG" height="72" width="72" /><thr:total>21</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/01/what-is-pipelining-explanation-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AEQXozfCp7ImA9Wx9WF08.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-4255961478791826560</id><published>2011-01-23T01:18:00.000+05:30</published><updated>2011-01-23T01:18:20.484+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-23T01:18:20.484+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="block RAM" /><category scheme="http://www.blogger.com/atom/ns#" term="distributed RAM" /><category scheme="http://www.blogger.com/atom/ns#" term="xilinx tips" /><title>Block and distributed RAM's on Xilinx FPGA's</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="text-align: left;"&gt;
&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;&lt;u&gt;Distributed RAM's:&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&amp;nbsp;&amp;nbsp;The configuaration logic blocks(&lt;b&gt;CLB&lt;/b&gt;) in most of the Xilinx FPGA's contain small single port or double port RAM. This RAM is normally distributed throughout the FPGA than as a single block(It is spread out over many LUT's) and so it is called "distributed RAM". &lt;b&gt;A look up table on a Xilinx FPGA can be configured as&amp;nbsp;a 16*1bit RAM , ROM, LUT or 16bit shift register&lt;/b&gt;. This multiple functionality is not possible with Altera FPGA's.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&amp;nbsp;&amp;nbsp;For Spartan-3 series, each CLB contains upto 64 bits of single port RAM or 32 bits of dual port RAM. As indicated from the size, a single CLB may not be enough to implement a large memory. Also the most of this small RAM's have their input and output as 1 bit wide. &lt;b&gt;For implementing larger and wider memory functions you can connect several&amp;nbsp;distributed&amp;nbsp;RAM's in parallel&lt;/b&gt;.&amp;nbsp;Fortunately&amp;nbsp;you need not know how these things are done, because the Xilinx synthesiser tool will infer what you want from your VHDL/ Verilog code and automatically does all this for you.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;&lt;u&gt;Block RAM's:&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&amp;nbsp;&amp;nbsp; A block RAM is a &lt;b&gt;dedicated&lt;i&gt;&amp;nbsp;&lt;/i&gt;(cannot be used to implement other functions like digital logic) two port memory containing several kilobits of RAM&lt;/b&gt;. Depending on how advance your FPGA is there may be several of them. For example Spartan 3 has total RAM, ranging from 72 kbits to 1872 kbits in size.While Spartan 6 devices have block RAM's of upto 4824 Kbits in size.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;b&gt;&lt;u&gt;Difference between&amp;nbsp;Distributed&amp;nbsp;and Block RAM's:&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;/div&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;As you can see from the definition distributed RAM, a large sized RAM is implemented using a parallel array of large number of elements. This makes distributed RAM, ideal for small sized memories. But when comes to large memories, this may cause a extra wiring delays.&lt;br /&gt;But Block RAM's are fixed RAM modules which comes in 9 kbits or 18 kbits in size. If you implement a small RAM with a block RAM then its wastage of the rest of the space in RAM.&lt;br /&gt;&lt;b&gt;So use block RAM for large sized memories and distributed RAM for small sized memories or FIFO's.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Another notable difference is how they are operated. In both, the &lt;b&gt;WRITE operation is synchronous&lt;/b&gt;(data is written to ram only happens at rising edge of clock). But for the READ operation, &lt;b&gt;distributed RAM is&amp;nbsp;asynchronous&lt;/b&gt;&amp;nbsp;(data is read from memory as soon as the address is given, doesn't wait for the clock edge) and &lt;b&gt;block RAM is synchronous&lt;/b&gt;.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;&lt;u&gt;How to tell XST which type of RAM you want to use?&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&amp;nbsp;&amp;nbsp; When you declare a RAM in your code, XST(Xilinx&amp;nbsp;synthesizer&amp;nbsp;tool) may implement it as either block RAM or distributed RAM. But if you want, you can force the implementation style to use block RAM or distributed RAM resources. This is done using the &lt;b&gt;ram_style&lt;/b&gt; constraint. See the following code to understand how it is done:&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; ram_example &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; address &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; we &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_i &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_o &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; ram_example&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; ram_example &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--Declaration of type and signal of a 256 element RAM&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;--with each element being 8 bit wide.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;type&lt;/span&gt; ram_t &lt;span class="kw1"&gt;is&lt;/span&gt; array &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;255&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;of&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;7&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; ram &lt;span class="sy0"&gt;:&lt;/span&gt; ram_t &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--process for read and write operation.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;PROCESS&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;we&lt;span class="sy0"&gt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ram&lt;span class="br0"&gt;(&lt;/span&gt;address&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; data_i&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data_o &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; ram&lt;span class="br0"&gt;(&lt;/span&gt;address&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; &lt;span class="kw1"&gt;PROCESS&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
The above code declares and defines a single port RAM. Code is also written to specify how the read and write process is implemented. when we synthesis this design, XST uses the block RAM resources by default for implementing the memory. In certain cases you may want to change it. For instance, if I want the memory to be implemented using distributed RAM then add the following two lines before the &lt;i&gt;begin &lt;/i&gt;statement in the &lt;i&gt;architecture &lt;/i&gt;section:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;b&gt;&lt;span class="kw1"&gt;attribute&lt;/span&gt;&amp;nbsp;ram_style&lt;span class="sy0"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="kw2"&gt;string&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;b&gt;&lt;span class="kw1"&gt;attribute&lt;/span&gt;&amp;nbsp;ram_style&amp;nbsp;&lt;span class="kw1"&gt;of&lt;/span&gt;&amp;nbsp;ram&amp;nbsp;&lt;span class="sy0"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt;&amp;nbsp;&lt;span class="kw1"&gt;is&lt;/span&gt;&amp;nbsp;&lt;span class="st0"&gt;"distributed"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;b&gt;&lt;span class="sy0"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
Here &lt;b&gt;ram &lt;/b&gt;is the signal name.&amp;nbsp;By changing the word distributed to &lt;b&gt;block &lt;/b&gt;we can force XST to use block RAM resources. The default value of the attribute &lt;b&gt;ram_style &lt;/b&gt;is &lt;b&gt;Auto.&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Notes:- &lt;/b&gt;The code was&amp;nbsp;synthesized&amp;nbsp;successfully using Xilinx Webpack version 12.1. The results may vary if you are using an older version of the XST.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/-aFZbJJ05Vs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/4255961478791826560/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/01/block-and-distributed-rams-on-xilinx.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/4255961478791826560?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/4255961478791826560?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/-aFZbJJ05Vs/block-and-distributed-rams-on-xilinx.html" title="Block and distributed RAM's on Xilinx FPGA's" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/01/block-and-distributed-rams-on-xilinx.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UERH8_fyp7ImA9Wx9XGU0.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-578566625603555661</id><published>2011-01-13T12:16:00.000+05:30</published><updated>2011-01-13T12:16:45.147+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-13T12:16:45.147+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="useful codes" /><category scheme="http://www.blogger.com/atom/ns#" term="examples" /><category scheme="http://www.blogger.com/atom/ns#" term="stack" /><title>Implementation of stack in VHDL</title><content type="html">I have been getting some requests for a Stack implementation in VHDL. This article is for all those readers.&lt;br /&gt;
&lt;br /&gt;
A stack is simply a &lt;b&gt;Last In First Out(LIFO)&lt;/b&gt; memory structure. Every stack has a &lt;b&gt;stack pointer(SP)&lt;/b&gt; which acts as an address for accessing the elements. But normally the user of the stack is not concerned with the absolute address of the stack, he is only concerned with the PUSH and POP instructions. I am not going into theory of stack in detail, but for some basics check the &lt;a href="http://en.wikipedia.org/wiki/Stack_(data_structure)"&gt;wikipedia stack page&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
There are basically 4 types of stacks:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Empty descending&lt;/b&gt; - Stack pointer(SP) points to the address where you can push the latest data. And after pushing the data, stack pointer(SP) is reduced by one till it becomes zero. Stack grows downwards here.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Empty ascending&lt;/b&gt; - Same as type (1) , but stack grows upwards here. After the PUSH operation, SP is incremented by one.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fully descending - &lt;/b&gt;SP points to the last data which is pushed.Stack grows downward.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fully ascending - &lt;/b&gt;SP points to the last data which is pushed, but stack grows upward here.&lt;/li&gt;
&lt;/ol&gt;
Out of the above 4 types I have implemented the first type, &lt;b&gt;Empty descending&lt;/b&gt; in VHDL. &lt;b&gt;The depth of the stack is 256 and width is 16 bits&lt;/b&gt;. That means using a single PUSH or POP operation you can only store or retrieve a maximum of 16 bits. Also the maximum number of elements which can be stored in the stack are 256. Of course, with a small edit you can change the width and depth of the stack. Check out the code below:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; stack &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; Clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Clock for the stack.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enable &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Enable the stack. Otherwise neither push nor pop will happen.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Data_In &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Data to be pushed to stack&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Data_Out &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Data popped from the stack.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUSH_barPOP &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--active low for POP and active high for PUSH.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Stack_Full &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Goes high when the stack is full.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Stack_Empty &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Goes high when the stack is empty.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; stack&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; stack &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;type&lt;/span&gt; mem_type &lt;span class="kw1"&gt;is&lt;/span&gt; array &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;255&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;of&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; stack_mem &lt;span class="sy0"&gt;:&lt;/span&gt; mem_type &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; stack_ptr &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;255&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; full,empty &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Stack_Full &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; full&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
Stack_Empty &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; empty&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--PUSH and POP process for the stack.&lt;/span&gt;&lt;br /&gt;
PUSH &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk,PUSH_barPOP,Enable&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Clk&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--PUSH section.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;Enable &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; PUSH_barPOP &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; full &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--Data pushed to the current address.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack_mem&lt;span class="br0"&gt;(&lt;/span&gt;stack_ptr&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; Data_In&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;stack_ptr /&lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack_ptr &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; stack_ptr - &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--setting full and empty flags&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;stack_ptr &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; full &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; empty &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;elsif&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;stack_ptr &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;255&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; full &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; empty &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; full &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; empty &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--POP section.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;Enable &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; PUSH_barPOP &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;' &lt;span class="kw1"&gt;and&lt;/span&gt; empty &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--Data has to be taken from the next highest address(empty descending type stack).&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;stack_ptr /&lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;255&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Data_Out &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; stack_mem&lt;span class="br0"&gt;(&lt;/span&gt;stack_ptr+&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack_ptr &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; stack_ptr + &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--setting full and empty flags&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;stack_ptr &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; full &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; empty &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;elsif&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;stack_ptr &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;255&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; full &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; empty &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; full &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; empty &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Let me explain little bit about the code. For using this stack entity in your project you need to apply a clock signal to the port &lt;b&gt;Clk.&lt;/b&gt;&amp;nbsp;For either PUSH or POP operation to happen, you have make the &lt;b&gt;Enable &lt;/b&gt;signal high. Data can be pushed into the stack by applying the data at the &lt;b&gt;Data_In&lt;/b&gt; port with '1' on the&amp;nbsp;&lt;b&gt;PUSH_barPOP&lt;/b&gt; port. Data can be popped from the stack by applying a '0' on the&amp;nbsp;&lt;b&gt;PUSH_barPOP&lt;/b&gt; port. The popped data will be available on the &lt;b&gt;Data_Out&lt;/b&gt; port.&lt;br /&gt;
I have also included two status signals so that you can manage the stack better. &lt;b&gt;Stack_Full&lt;/b&gt; goes high when the stack is full, and &lt;b&gt;Stack_Empty&lt;/b&gt; goes high when there is no data available in the stack. The &lt;b&gt;Enable&lt;/b&gt; signal should be controlled by checking these status signals so that stack overflow doesn't happen.&lt;br /&gt;
&lt;br /&gt;
For testing the code I have written a testbench which I am sharing here:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_arith&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; stack_tb &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; stack_tb&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; behavior &lt;span class="kw1"&gt;OF&lt;/span&gt; stack_tb &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--Inputs and outputs&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; Clk,Enable,PUSH_barPOP,Stack_Full,Stack_Empty &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; Data_In,Data_Out &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--temporary signals&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;signal&lt;/span&gt; i &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;integer&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock period definitions&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;constant&lt;/span&gt; Clk_period &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;time&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;-- Instantiate the Unit Under Test (UUT)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;uut&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;entity&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.stack &lt;span class="kw1"&gt;PORT&lt;/span&gt; &lt;span class="kw1"&gt;MAP&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Clk,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enable &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Enable,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Data_In &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Data_In,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Data_Out &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Data_Out,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUSH_barPOP &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; PUSH_barPOP,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Stack_Full &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Stack_Full,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Stack_Empty &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; Stack_Empty&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock process definitions&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;Clk_process &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; Clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Stimulus process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;stim_proc&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--wait for 3 clock periods(simply)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enable &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Enable the stack.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUSH_barPOP &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Set for push operation.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; i &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;255&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Push integers from 0 to 255 to the stack.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Data_In &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; conv_std_logic_vector&lt;span class="br0"&gt;(&lt;/span&gt;i,&lt;span class="nu0"&gt;16&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enable &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--disable the stack.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enable &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--re-enable the stack.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUSH_barPOP &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Set for POP operation.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; i &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="kw1"&gt;to&lt;/span&gt; &lt;span class="nu0"&gt;255&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--POP all elements from stack one by one.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;loop&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enable &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Disable stack.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enable &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;--Enable stack&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUSH_barPOP &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Set for push operation.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Data_In &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; X&lt;span class="st0"&gt;"FFFF"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Push 65535 to stack.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Data_In &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; X&lt;span class="st0"&gt;"7FFF"&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Push 32767 to stack.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUSH_barPOP &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--POP the above pushed values.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period*&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enable &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
I am not including a waveform file because it is too lengthy to put up as a single image. The above codes where tested succussfully using the Xilinx Webpack 12.1. The code is also synthesisable.&lt;br /&gt;
&lt;br /&gt;
Just as a side note, I got a&amp;nbsp;&lt;b&gt;More than 100% resources used &lt;/b&gt;error when I tried to synthesis the code for spartan 3. But for spartan 6 devices, there is no such error. So always check whether your device can handle this design. Usage of resources can also be decreased by using a less width and depth for the stack.&lt;br /&gt;
&lt;br /&gt;
If you need variations of this stack design &lt;a href="http://vhdlguru.blogspot.com/p/contact-me_25.html"&gt;contact me&lt;/a&gt;. I help students to get their coding work done for a fee. Also I suggest for learning purposes, you implement the other 3 types of stacks too in VHDL.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/XgdDrg6eWZ0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/578566625603555661/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/01/implementation-of-stack-in-vhdl.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/578566625603555661?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/578566625603555661?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/XgdDrg6eWZ0/implementation-of-stack-in-vhdl.html" title="Implementation of stack in VHDL" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>8</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/01/implementation-of-stack-in-vhdl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQCQH47fCp7ImA9Wx9XFks.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-3290436494501289252</id><published>2011-01-10T18:12:00.000+05:30</published><updated>2011-01-10T18:12:41.004+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-10T18:12:41.004+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vhdl tips" /><title>Some more clarification on "Signal changing at both clock edges" matter</title><content type="html">Sorry for not posting for a long time. Recently I&amp;nbsp;received&amp;nbsp;a comment on one of my old posts which answers the question&amp;nbsp;&lt;a href="http://vhdlguru.blogspot.com/2010/03/can-you-change-signal-at-both-positive.html"&gt;Can you change a signal at both positive and negative edges of the clock&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
In the above post I said that a signal cannot be changed both at positive and negative edges. Basically the code will not&amp;nbsp;synthesis. After reading the post,one of my reader,&amp;nbsp;&lt;i&gt;Arseni &lt;/i&gt;posted the &lt;a href="http://vhdlguru.blogspot.com/2010/03/can-you-change-signal-at-both-positive.html?showComment=1294500845123#c3861532409479147117"&gt;following comment&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
This post is an answer to his question. For making it a general case I have slightly changed the code Arseni posted. Here it is:&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;br /&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_ARITH&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.STD_LOGIC_UNSIGNED.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; test &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;A &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; B,D &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic_vector&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt; &lt;span class="kw1"&gt;downto&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; test&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; test &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;PROCESS&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;A, B&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; A &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; B&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; D&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; &lt;span class="kw1"&gt;PROCESS&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="sy0"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
In the code whenever the value of signal A is '1' B is assigned to C, otherwise D is assigned to C.&lt;br /&gt;
As the commenter indicates the signal C is changed irrespective of the value of A(whether it is low or high) here. So why did this code synthesis properly?&lt;br /&gt;
&lt;br /&gt;
Because if you closely watch you can notice that the &lt;b&gt;C is changed based on the level value of the signal A&lt;/b&gt;. 'C' is not changed by checking whether the value of 'A' changes from 1 to 0 or 0 to 1. It is concerned with only the value(whether it is 0 or 1). That means a flip flop is &lt;b&gt;not&lt;/b&gt; used for synthesising the behavioral code given above.&lt;br /&gt;
&lt;br /&gt;
The rule &lt;b&gt;a signal cannot be changed at both clock edges &lt;/b&gt;&amp;nbsp;is for edge triggered actions. Which means the output is through a flip flop and some kind of additional combinatorial logic.&lt;br /&gt;
&lt;br /&gt;
In the code given above, the synthesis only uses some LUT-2 components. Its doesnt use any flip flops.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note :-&lt;/b&gt; The code is simulated and synthesised successfully using the Xilinx ISE 12.1. But it will mostly work with other tools too.&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/jn3vhzOEt_0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/3290436494501289252/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2011/01/some-more-clarification-on-signal.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/3290436494501289252?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/3290436494501289252?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/jn3vhzOEt_0/some-more-clarification-on-signal.html" title="Some more clarification on &quot;Signal changing at both clock edges&quot; matter" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2011/01/some-more-clarification-on-signal.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkANRX05eip7ImA9Wx9SFEk.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-7519960598829134486</id><published>2010-12-04T11:03:00.000+05:30</published><updated>2010-12-04T11:03:14.322+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-04T11:03:14.322+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xilinx tips" /><category scheme="http://www.blogger.com/atom/ns#" term="xilinx isim" /><category scheme="http://www.blogger.com/atom/ns#" term="xilinx errors" /><title>Tips for running a successful simulation in Xilinx ISim.</title><content type="html">Though I have given enough examples for learning VHDL I didn't write much about using the software till now. In this article I will cover some basics about running your simulation in Xilinx ISim. This article will point out some basic mistakes people do when simulating their code in ISim.&lt;br /&gt;
For explaining, I have just used one of my earlier example in the post : &lt;a href="http://vhdlguru.blogspot.com/2010/03/how-to-write-testbench.html"&gt;Explaining testbench code using a counter design&lt;/a&gt;. Lets go step by step, see the images for easier understanding of the steps. Open the images in a new tab in your browser if they are not clear enough.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1)&lt;/b&gt;Once the coding is done( I mean both the testbench and the design to be tested) make sure you select the top entity(testbench code) in the Xilinx window as shown below. Many people just select any other file and click the compilation button.&lt;br /&gt;
Note down the red markings in the image below. Points to be noted are:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_c99lLjgQ8ho/TPnJBGGmvXI/AAAAAAAAArE/8_B0kG0ADTs/s1600/1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_c99lLjgQ8ho/TPnJBGGmvXI/AAAAAAAAArE/8_B0kG0ADTs/s320/1.JPG" width="191" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Choose &lt;i&gt;View &lt;/i&gt;&amp;nbsp;as &lt;b&gt;simulation.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Select the top entity i.e. the testbench. If the wrong file is selected for simulation then the waveform in ISim will be blank and you will see no waveform.&lt;/li&gt;
&lt;li&gt;Double click on the &lt;b&gt;Behavioral check syntax &lt;/b&gt;for compiling the design or for finding out any syntax errors.&lt;/li&gt;
&lt;li&gt;If the above step is successful then double click on &lt;b&gt;Simulate Behavioral Model.&lt;/b&gt;&amp;nbsp;If there are syntax errors in step 3 then you may have to check your code.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2)&lt;/b&gt;Now ISim will open in a new window with waveforms. Note down the toolbar at the bottom. Check the below image for knowing what each button does. You can also hover your mouse over the button and they will display the function of that button.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/_c99lLjgQ8ho/TPnJizOgeVI/AAAAAAAAArI/NngcYuhuxlo/s1600/5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="70" src="http://1.bp.blogspot.com/_c99lLjgQ8ho/TPnJizOgeVI/AAAAAAAAArI/NngcYuhuxlo/s320/5.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;b&gt;3)&lt;/b&gt;Mostly the signals in the wavforms will be displayed as binary numbers or integers. But you can change this basic setting. See the image below.&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_c99lLjgQ8ho/TPnJ_L3edqI/AAAAAAAAArM/tPdnaMns3VQ/s1600/2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_c99lLjgQ8ho/TPnJ_L3edqI/AAAAAAAAArM/tPdnaMns3VQ/s320/2.JPG" width="294" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
Click on the signal which you want to change the display format. Go to &lt;b&gt;radix &lt;/b&gt;and then select the format. Some options available are Binary, Hexadecimal, octal etc. Note that depending on your code , you have to change the display format. My code was a &lt;i&gt;counter&lt;/i&gt;&lt;u&gt;,&lt;/u&gt;&amp;nbsp;so unsigned decimal was the best format in this case.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4)&lt;/b&gt;Another interesting thing you can do is adding the internal signals to the waveform which is not displayed by default. By default ISim displays only the signals which are declared in the testbench code. But if there are many sub entities then you may need to see them for debugging purpose. See the image below for how to do it.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/_c99lLjgQ8ho/TPnMCI2rCyI/AAAAAAAAArQ/lrgbAjhgjE0/s1600/6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="130" src="http://3.bp.blogspot.com/_c99lLjgQ8ho/TPnMCI2rCyI/AAAAAAAAArQ/lrgbAjhgjE0/s320/6.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Go to the &lt;b&gt;Instance and process names &lt;/b&gt;on the left side of the ISim window.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Select the &lt;b&gt;Instance name &lt;/b&gt;whose internal signals you want to observe.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;All the signals declared in that particular instance will be displayed on the immediate right tab now, under &lt;b&gt;simulation objects.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Now select the signals you want to display. You can use keyboard short cuts like &lt;i&gt;shift &lt;/i&gt;&amp;nbsp;and &lt;i&gt;Ctrl &lt;/i&gt;for selecting multiple signal names.&lt;/li&gt;
&lt;li&gt;Now drag and drop these select signals into the immediate right tab under signal &lt;b&gt;Name&lt;/b&gt;&amp;nbsp;in waveform window.&lt;/li&gt;
&lt;li&gt;For updating these signal values you have to restart the simulation and run it again.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;5)&lt;/b&gt;You may have noticed that in ISim, all the additional signals you added in step (4) are reset when you close the ISim window. This is little bit annoying since you have to add all the internal signals again. But you need not worry about it. Follow the steps:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Add the required signals into the waveform as described in step 4.&lt;/li&gt;
&lt;li&gt;Save the waveform file by clicking, &lt;i&gt;Ctrl &lt;/i&gt;+ &lt;i&gt;S&amp;nbsp;&lt;/i&gt;. Give an appropriate name to the wave file.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Now close ISim and go back to the Xilinx ISE window.&lt;/li&gt;
&lt;li&gt;Right click on &lt;b&gt;simulate behavioral model.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Choose the option &lt;b&gt;Process properties.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;A new window will open as shown below in the image.&lt;/li&gt;
&lt;li&gt;Select the check box, &lt;b&gt;Use&amp;nbsp;custom waveform&amp;nbsp;configuration&amp;nbsp;file.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Choose the waveform file you just saved in the&amp;nbsp;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;custom waveform&amp;nbsp;configuration&amp;nbsp;file.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/_c99lLjgQ8ho/TPnRJxEcu0I/AAAAAAAAArY/eqwM6uBPLcw/s1600/3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="172" src="http://1.bp.blogspot.com/_c99lLjgQ8ho/TPnRJxEcu0I/AAAAAAAAArY/eqwM6uBPLcw/s320/3.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/_c99lLjgQ8ho/TPnRJxEcu0I/AAAAAAAAArY/eqwM6uBPLcw/s1600/3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_c99lLjgQ8ho/TPnRJemzvfI/AAAAAAAAArU/RQLsQKYWzxQ/s1600/4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="190" src="http://4.bp.blogspot.com/_c99lLjgQ8ho/TPnRJemzvfI/AAAAAAAAArU/RQLsQKYWzxQ/s320/4.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Thats it for now. Hope these explain the things better. Thanks.&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/I4c5Bky2WZM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/7519960598829134486/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2010/12/tips-for-running-successful-simulation.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/7519960598829134486?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/7519960598829134486?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/I4c5Bky2WZM/tips-for-running-successful-simulation.html" title="Tips for running a successful simulation in Xilinx ISim." /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_c99lLjgQ8ho/TPnJBGGmvXI/AAAAAAAAArE/8_B0kG0ADTs/s72-c/1.JPG" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2010/12/tips-for-running-successful-simulation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DR3s4eip7ImA9Wx5aEUU.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-3201517408312791797</id><published>2010-11-08T08:42:00.000+05:30</published><updated>2010-11-08T08:42:56.532+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-08T08:42:56.532+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xilinx errors" /><title>Synthesis Error : Wait for statement unsupported.</title><content type="html">&amp;nbsp;&amp;nbsp; This article is written as per the request of one of my readers who had some problem trying out the code given in this website. You may have seen this error in Xilinx ISE, "Wait for statement unsupported". And you may have wondered why the error is coming even after you are sure of writing a&amp;nbsp;syntactically&amp;nbsp;correct VHDL code.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Check out the below code. It is just a testbench plus design code for full adder. As you can see we have 3&amp;nbsp;input&amp;nbsp;bits and we apply all the 8 combinations of inputs with a 1 ns delay between them. For applying this delay we use the "wait for" statement. This is supported by VHDL.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; tb&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; behavior &lt;span class="kw1"&gt;OF&lt;/span&gt; tb &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--Inputs&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; bit1 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; bit2 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; bit3 &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--Outputs&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; sum &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; carry &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--Gates&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; gate_inst &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sum &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; bit1 &lt;span class="kw1"&gt;xor&lt;/span&gt; bit2 &lt;span class="kw1"&gt;xor&lt;/span&gt; bit3&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; carry &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;bit1 &lt;span class="kw1"&gt;and&lt;/span&gt; bit2&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;or&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;bit3 &lt;span class="kw1"&gt;and&lt;/span&gt; bit2&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;or&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;bit1 &lt;span class="kw1"&gt;and&lt;/span&gt; bit3&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Stimulus process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;stim_proc&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bit1&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; bit2&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;bit3&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bit1&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; bit2&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;bit3&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bit1&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; bit2&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;bit3&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bit1&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; bit2&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;bit3&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bit1&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; bit2&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;bit3&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bit1&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; bit2&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;bit3&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bit1&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; bit2&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;bit3&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bit1&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; bit2&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;bit3&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;'&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Now when you synthesize this code you will get the above mentioned error. This is just because of &amp;nbsp;the simple fact that all VHDL codes which are&amp;nbsp;syntactically&amp;nbsp;right are need not synthesisable. &lt;b&gt;Synthesis is the process of converting the logic described by your code in terms of actual digital circuit components.A statement like "wait for 1 ns" cannot be described in terms of real hardware and hence it is not synthesisable.&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; You may ask why then such a keyword is available if it is not synthesisable.The reason is that there are plenty of situations where you just want to simulate( use the simulation software in your PC for verification, not running it in real FPGA hardware) the design. In those situations "wait for" statement is very useful, especially&amp;nbsp;in case&amp;nbsp;of testbench codes.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Also, sometimes when you add a new source in Xilinx ISE ( i think versions after 12.1) its default property "&lt;b&gt;View Association&lt;/b&gt;" is set as "&lt;b&gt;Implementation&lt;/b&gt;".This makes the file invisible in the "simulation" mode in ISE. Once you change this "View association" to "&lt;b&gt;All&lt;/b&gt;" the file will be visible under all the views. For this right click on the file name in Xilinx ISE window and click on "&lt;b&gt;source properties&lt;/b&gt;". You can see the "View Association" option now. Now do "&lt;b&gt;Behavioral Check syntax&lt;/b&gt;" under the "Simulation" view. The errors must have gone now.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_c99lLjgQ8ho/TNdo4xUfOhI/AAAAAAAAArA/3VSMUrKRzMU/s1600/wave.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://4.bp.blogspot.com/_c99lLjgQ8ho/TNdo4xUfOhI/AAAAAAAAArA/3VSMUrKRzMU/s400/wave.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I hope the things are clear now.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/QjtFVWe31V0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/3201517408312791797/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2010/11/synthesis-error-wait-for-statement.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/3201517408312791797?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/3201517408312791797?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/QjtFVWe31V0/synthesis-error-wait-for-statement.html" title="Synthesis Error : Wait for statement unsupported." /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_c99lLjgQ8ho/TNdo4xUfOhI/AAAAAAAAArA/3VSMUrKRzMU/s72-c/wave.JPG" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2010/11/synthesis-error-wait-for-statement.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMGSXgzeCp7ImA9Wx5bFU4.&quot;"><id>tag:blogger.com,1999:blog-2050962176404305705.post-6499272431669804020</id><published>2010-10-31T18:37:00.000+05:30</published><updated>2010-10-31T18:37:08.680+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-31T18:37:08.680+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sequence detector" /><category scheme="http://www.blogger.com/atom/ns#" term="state machine" /><category scheme="http://www.blogger.com/atom/ns#" term="examples" /><title>Sequence detector using state machine in VHDL</title><content type="html">&amp;nbsp;&amp;nbsp; Some readers were asking for more examples related with state machine and some where asking for codes related with sequence detector.This article will be helpful for state machine designers and for people who try to implement sequence detector circuit in VHDL.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; I have created a state machine for non-overlapping detection of a pattern "1011" in a sequence of bits. The state machine diagram is given below for your reference.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_c99lLjgQ8ho/TM1jYzk0TNI/AAAAAAAAAq4/bIcs9Bw0LZY/s1600/sm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="156" src="http://2.bp.blogspot.com/_c99lLjgQ8ho/TM1jYzk0TNI/AAAAAAAAAq4/bIcs9Bw0LZY/s320/sm.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The VHDL code for the same is given below. I have added comments for your easy understanding.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;library&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;use&lt;/span&gt; &lt;span class="kw2"&gt;IEEE&lt;/span&gt;.&lt;span class="kw2"&gt;STD_LOGIC_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;--Sequence detector for detecting the sequence "1011".&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;--Non overlapping type.&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;entity&lt;/span&gt; seq_det &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;port&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; &amp;nbsp; clk &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--clock signal&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reset &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &lt;span class="co1"&gt;--reset signal&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;in&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;--serial bit sequence&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; det_vld &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;out&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--A '1' indicates the pattern "1011" is detected in the sequence. &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; seq_det&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;architecture&lt;/span&gt; Behavioral &lt;span class="kw1"&gt;of&lt;/span&gt; seq_det &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;type&lt;/span&gt; state_type &lt;span class="kw1"&gt;is&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;A,B,C,D&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Defines the type for states in the state machine&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;signal&lt;/span&gt; state &lt;span class="sy0"&gt;:&lt;/span&gt; state_type &lt;span class="sy0"&gt;:=&lt;/span&gt; A&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp;&lt;span class="co1"&gt;--Declare the signal with the corresponding state type.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;br /&gt;
&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt; reset &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;' &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--resets state and output signal when reset is asserted.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; det_vld &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; A&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;elsif&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="kw1"&gt;rising_edge&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;clk&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt; &amp;nbsp; &lt;span class="co1"&gt;--calculates the next state based on current state and input bit.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;case&lt;/span&gt; state &lt;span class="kw1"&gt;is&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; A &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &amp;nbsp; &lt;span class="co1"&gt;--when the current state is A.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; det_vld &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; seq &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;' &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; A&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; B&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; B &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &amp;nbsp; &lt;span class="co1"&gt;--when the current state is B.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; seq &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;' &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; C&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; B&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; C &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &amp;nbsp; &lt;span class="co1"&gt;--when the current state is C.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; seq &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;' &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; A&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; D&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; D &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &amp;nbsp; &lt;span class="co1"&gt;--when the current state is D.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; seq &lt;span class="sy0"&gt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;' &lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw1"&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; C&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; state &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; A&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; det_vld &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &lt;span class="co1"&gt;--Output is asserted when the pattern "1011" is found in the sequence.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;when&lt;/span&gt; &lt;span class="kw1"&gt;others&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;NULL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;case&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;if&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;end&lt;/span&gt; Behavioral&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
If you check the code you can see that in each state we go to the next state depending on the current value of inputs.So this is a&amp;nbsp;&lt;b&gt;mealy&amp;nbsp;type&lt;/b&gt; state machine.&lt;br /&gt;
The testbench code used for testing the design is given below.It sends a sequence of bits "1101110101" to the module. The&amp;nbsp;code doesnt exploit all the possible input sequences. If you want another sequence to be checked then edit the testbench&amp;nbsp;code. &amp;nbsp;If it is not working as expected, let me know.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="vhdl"&gt;
&lt;span class="kw1"&gt;LIBRARY&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;USE&lt;/span&gt; &lt;span class="kw2"&gt;ieee&lt;/span&gt;.&lt;span class="kw2"&gt;std_logic_1164&lt;/span&gt;.&lt;span class="kw1"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ENTITY&lt;/span&gt; blog_cg &lt;span class="kw1"&gt;IS&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt; blog_cg&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;ARCHITECTURE&lt;/span&gt; behavior &lt;span class="kw1"&gt;OF&lt;/span&gt; blog_cg &lt;span class="kw1"&gt;IS&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;signal&lt;/span&gt; clk,reset,seq,det_vld &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;std_logic&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;constant&lt;/span&gt; clk_period &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;time&lt;/span&gt; &lt;span class="sy0"&gt;:=&lt;/span&gt; &lt;span class="nu0"&gt;10&lt;/span&gt; &lt;span class="re0"&gt;ns&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;-- Instantiate the Unit Under Test (UUT)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;uut&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;entity&lt;/span&gt; &lt;span class="kw2"&gt;work&lt;/span&gt;.seq_det &lt;span class="kw1"&gt;PORT&lt;/span&gt; &lt;span class="kw1"&gt;MAP&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clk &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; clk,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reset &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; reset,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; seq,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; det_vld &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; det_vld&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Clock process definitions&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;clk_process &lt;span class="sy0"&gt;:&lt;/span&gt;&lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clk &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period/&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="co1"&gt;-- Stimulus process : Apply the bits in the sequence one by one.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;stim_proc&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;begin&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--1&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--11&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--110&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--1101&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--11011&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--110111&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--1101110&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--11011101&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;0&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--110111010&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; seq &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; '&lt;span class="nu0"&gt;1&lt;/span&gt;'&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;--1101110101&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt; &lt;span class="kw1"&gt;for&lt;/span&gt; clk_period&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;wait&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span class="kw1"&gt;end&lt;/span&gt; &lt;span class="kw1"&gt;process&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;END&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
The simulated waveform is shown below:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/_c99lLjgQ8ho/TM1lQvHS7SI/AAAAAAAAAq8/6C3jJfkbRiU/s1600/wave.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="49" src="http://3.bp.blogspot.com/_c99lLjgQ8ho/TM1lQvHS7SI/AAAAAAAAAq8/6C3jJfkbRiU/s320/wave.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Note:-&lt;/b&gt; The code was simulated using Xilinx 12.1 version. The results may vary slightly depending on your simulation tool.&lt;img src="http://feeds.feedburner.com/~r/VhdlCodingTipsAndTricks/~4/vw6c7QI_P2s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://vhdlguru.blogspot.com/feeds/6499272431669804020/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://vhdlguru.blogspot.com/2010/10/sequence-detector-using-state-machine.html#comment-form" title="16 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/6499272431669804020?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2050962176404305705/posts/default/6499272431669804020?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/VhdlCodingTipsAndTricks/~3/vw6c7QI_P2s/sequence-detector-using-state-machine.html" title="Sequence detector using state machine in VHDL" /><author><name>vipin</name><uri>http://www.blogger.com/profile/17675762038225600067</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_c99lLjgQ8ho/TM1jYzk0TNI/AAAAAAAAAq4/bIcs9Bw0LZY/s72-c/sm.JPG" height="72" width="72" /><thr:total>16</thr:total><feedburner:origLink>http://vhdlguru.blogspot.com/2010/10/sequence-detector-using-state-machine.html</feedburner:origLink></entry></feed>
