<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-419958562532914083</id><updated>2012-02-29T21:06:44.459-05:00</updated><category term='setup'/><category term='planahead'/><category term='SysGen'/><category term='implmentation'/><category term='HWCOSIM'/><category term='fft'/><category term='synthesis'/><category term='misc'/><category term='offset'/><category term='doc'/><title type='text'>Jim Wu's FPGA Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-3375339347868520655</id><published>2012-01-24T06:29:00.000-05:00</published><updated>2012-01-24T06:34:16.966-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysGen'/><title type='text'>Floating Point Algorithm Development Made Easy in System Generator</title><content type='html'>System Generator 13.3 added support for bit and cycle accurate, single, double and custom precision-floating-point on many blocks in the Xilinx Blockset. It now has a new "&lt;b&gt;Floating-Point&lt;/b&gt;" library under "&lt;b&gt;Xilinx Blockset&lt;/b&gt;" in the "&lt;b&gt;Simulink Libary Browse&lt;/b&gt;r", which lists all blocks supporting floating point numbers (see the "Floating Point Library in Xilinx Blockset" snapshot below). The list is really informational in that if some of these blocks are already in your fixed point model you don't need to swap them out with the blocks in the "Floating-Point" library to change it to a floating point model. In most of cases all you need to do is to change the input data type of the "&lt;b&gt;Gateway In&lt;/b&gt;" blocks in the model to one of the supported floating point types and the tool will automatically generate the floating point model and netlist for simulation and implementation. The "Adder Example with all Supported Data Types" figure below shows that outputs of the same "AddSub" block are automatically adjusted to match the input data type. &lt;br /&gt;PS: it is very handy to turn on the port data type display using "&lt;b&gt;Format-&amp;gt;Port/Signal Displays-&amp;gt;Port Data Types&lt;/b&gt;" menu. &lt;br /&gt;PPS: Click "&lt;b&gt;Edit-&amp;gt;Update Diagram&lt;/b&gt;" menu or pressing "&lt;b&gt;CTRL-D&lt;/b&gt;" to update the data type display when the data types of some blocks are changed.&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/-CnX_ti-KWKI/TxypxqMzTOI/AAAAAAAAAVM/fUWZE4fqpNw/s1600/sysgen_floating_point_lib.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="382" src="http://1.bp.blogspot.com/-CnX_ti-KWKI/TxypxqMzTOI/AAAAAAAAAVM/fUWZE4fqpNw/s640/sysgen_floating_point_lib.jpg" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Floating Point Library in Xilinx Blockset&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&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/-67Lx_TnMb7M/Tx6PzBwbDsI/AAAAAAAAAVc/mWAPfZ9TiSM/s1600/sysge_floating_point_test.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="536" src="http://1.bp.blogspot.com/-67Lx_TnMb7M/Tx6PzBwbDsI/AAAAAAAAAVc/mWAPfZ9TiSM/s640/sysge_floating_point_test.jpg" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Added Example with all Supported Data Types&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Below is a &lt;a href="http://www.youtube.com/user/XilinxInc" target="_blank"&gt;YouTube video from Xilinx&lt;/a&gt; on this new feature in case you are interested:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/MbjfEzawB2w/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/MbjfEzawB2w&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/MbjfEzawB2w&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-3375339347868520655?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/3375339347868520655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2012/01/floating-point-algorithm-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/3375339347868520655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/3375339347868520655'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2012/01/floating-point-algorithm-development.html' title='Floating Point Algorithm Development Made Easy in System Generator'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/-CnX_ti-KWKI/TxypxqMzTOI/AAAAAAAAAVM/fUWZE4fqpNw/s72-c/sysgen_floating_point_lib.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-5594175376143832183</id><published>2011-12-31T10:02:00.000-05:00</published><updated>2012-01-15T18:55:07.883-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='synthesis'/><category scheme='http://www.blogger.com/atom/ns#' term='implmentation'/><title type='text'>Memory Initialization Methods</title><content type='html'>Questions on how to initialize a ROM or RAM come up quite often on FPGA discussion boards and forums. Several methods can be used to initialize memory in RTL, during implementation, and post-implementation when targeting Xilinx FPGA devices. Some of the methods are covered in this blog.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Verilog "initial" block with $readmemb or $readmemh&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;Memories can be initialized using &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$readmem&lt;/span&gt;b&lt;/b&gt; or &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$readmemh&lt;/b&gt; system tasks with a memory initialization file (.mif) (&lt;a href="http://sites.google.com/site/jimw567/memory-init-examples"&gt;download complete example here&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;reg [DATA_WIDTH-1:0] mem[0:2**ADDR_WIDTH-1];&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;initial begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $readmemh("mem_init_vlog.mif", mem, 0, 255);&lt;br /&gt;end&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;XST&amp;nbsp; has two different Verilog parsers depending on the target device. The old parser is used for Virtex5/Spartan3 and older devices. For Virtex6/Spartan6 and newer devices, the new parser will be used. The old parser has a few restrictions on the memory initialization:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The entire memory array must be initialized. For example, if the memory has 256 words, all 256 words must be explicitly initialized. Otherwise the initialization will be ignored with this warning message: &lt;span style="color: red; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WARNING:Xst:2319 - "rom_vlog.v" line 21: Signal mem in initial block is partially initialized. The initialization will be ignored.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Make sure the .mif file does &lt;b&gt;NOT&lt;/b&gt; have any unnecessary white spaces (especially "tab") anywhere. Or it will issue some obscure error message like this: &lt;span style="color: red; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ERROR:Xst:2354 - "rom_vlog_mif.v" line 18: Value 262025260 found at line 256 is not hexadecimal in call of system task $readmemh.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Starting address (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;@hh&lt;/span&gt;), Verilog comments (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;// or /* */&lt;/span&gt;), and multiple values per line are not supported in the .mif file. Or as you guessed it, it will issue other weird errors. &lt;/li&gt;&lt;/ul&gt;It is very unlikely that these restrictions will removed from the old parser because workarounds exist by following the rules above. The &lt;b&gt;good news&lt;/b&gt; is that the new Verilog parser supports all valid formats in a memory initialization file as describe in Verilog LRM. i.e. the restrictions no longer exist in the new Verilog parser. An even &lt;b&gt;better news&lt;/b&gt; is that the switch "&lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;-use_new_parser yes&lt;/b&gt;" can be manually added to the XST command line to enable the new parser for older devices if you insist on using full features of the memory initialization file. &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;VHDL functions&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;Memory can be initialized in VHDL by using a function at signal declaration. Functions like &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sin()&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;cos()&lt;/span&gt;in the IEEE math_real library are supported by XST for initializing memories. The code snippet below shows how to generate a look up table with a cosine wave (&lt;a href="http://sites.google.com/site/jimw567/memory-init-examples"&gt;download complete example here&lt;/a&gt;): &lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;constant MEM_DEPTH : integer := 2**ADDR_WIDTH;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;type mem_type is array (0 to MEM_DEPTH-1) of signed(DATA_WIDTH-1 downto 0);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;function init_mem return mem_type is&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; constant SCALE : real := 2**(real(DATA_WIDTH-2));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; constant STEP&amp;nbsp; : real := 1.0/real(MEM_DEPTH);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; variable temp_mem : mem_type;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in 0 to MEM_DEPTH-1 loop&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp_mem(i) := to_signed(integer(cos(2.0*MATH_PI*real(i)*STEP)*SCALE), DATA_WIDTH); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end loop;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return temp_mem;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;constant mem : mem_type := init_mem;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;VHDL with external data files&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;a href="http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_3/xst_v6s6.pdf" target="_blank"&gt;XST User Guide&lt;/a&gt; has VHDL examples of initializing block RAMs with external data files. It's listed here so that you are aware of this option. The XST UG should always be your first stop for coding styles and techniques. I would like to point out two things highlighted in red in the code snippet below (&lt;a href="http://sites.google.com/site/jimw567/memory-init-examples"&gt;download complete example here&lt;/a&gt;): &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;The "file" declaration in XST UG uses VHDL-87 syntax. The code snippet below uses VHDL-93 syntax because that is the default VHDL starndard XST uses.&lt;/li&gt;&lt;li&gt;&amp;nbsp; The second argument for the "read" function needs to be a bit_vector. std_logic_vector or signed types are not supported by the "read" function in IEEE std.textio package.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;constant MEM_DEPTH : integer := 2**ADDR_WIDTH;&lt;br /&gt;type mem_type is array (0 to MEM_DEPTH-1) of signed(DATA_WIDTH-1 downto 0);&lt;br /&gt;&lt;br /&gt;impure function init_mem(mif_file_name : in string) return mem_type is&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;file mif_file : text open read_mode is mif_file_name;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; variable mif_line : line;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; variable temp_bv : bit_vector(DATA_WIDTH-1 downto 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; variable temp_mem : mem_type;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in mem_type'range loop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; readline(mif_file, mif_line);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;read(mif_line, temp_bv)&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp_mem(i) := signed(to_stdlogicvector(temp_bv));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end loop;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return temp_mem;&lt;br /&gt;end function;&lt;br /&gt;&lt;br /&gt;constant mem : mem_type := init_mem("mem_init_vhd.mif");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Verify Memory Content in Synthesized Netlist&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;There are a couple of ways to verify that the memory is correctly initialized by the synthesis tool:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The values of &lt;b&gt;INIT_xx&lt;/b&gt; attributes of the block RAM can be examined in PlanAhead by opening the netlist design in PlanAhead, selecting the instance for the memory, and selecting the "Attributes" tab of the "Instance Properties" window.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-kFJTvGWk7NA/Tv8hEl7eriI/AAAAAAAAAUE/yplnhOg9DXc/s1600/rom_properties_pa.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="393" src="http://3.bp.blogspot.com/-kFJTvGWk7NA/Tv8hEl7eriI/AAAAAAAAAUE/yplnhOg9DXc/s640/rom_properties_pa.jpg" width="640" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;ul&gt;&lt;li&gt; A post-synthesis simulation model can be generated for the synthesized netlist in Project Navigator or by using netgen tool. This simulation model can be used in the existing testbench to check if the initialization data made into the netlist correctly. The waveform below shows the correct outputs from the ROMs created in the Verilog .mif (counter) and VHDL function (sine wave) methods.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-r5u3V6D-jkU/TwEKyT5T6fI/AAAAAAAAAUQ/V1I7EVOfdg0/s1600/mem_init_post_syn_sim.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="136" src="http://1.bp.blogspot.com/-r5u3V6D-jkU/TwEKyT5T6fI/AAAAAAAAAUQ/V1I7EVOfdg0/s640/mem_init_post_syn_sim.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-5594175376143832183?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/5594175376143832183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/12/memory-initialization-methods.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/5594175376143832183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/5594175376143832183'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/12/memory-initialization-methods.html' title='Memory Initialization Methods'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/-kFJTvGWk7NA/Tv8hEl7eriI/AAAAAAAAAUE/yplnhOg9DXc/s72-c/rom_properties_pa.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-6034246899289403799</id><published>2011-11-05T16:18:00.001-04:00</published><updated>2011-12-29T15:21:40.430-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='planahead'/><title type='text'>Rearrange Blocks in PlanAhead Schematic Viewer</title><content type='html'>The Schematic Viewer in PlanAhead is an invaluable tool to help understand and analyze synthesized netlists. &lt;b&gt;PlanAhead 13.3&lt;/b&gt; added a nice feature that allows users to move blocks around in the Schematic Viewer. Users can easily rearrange the schematic to follow the control/data flow or specific structure the design was intended for so they can better visualize the logic as well as use it for documentation purse.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;To move a block in the Schematic Viewer, simply hold down the &lt;b&gt;SHIFT&lt;/b&gt; key and then use the &lt;b&gt;left mouse button (LMB)&lt;/b&gt; to select and drag&amp;amp;drop the block to the new location. Connections between blocks will be redrawn for the new layout.&lt;br /&gt;&lt;br /&gt;The two snapshots below are schematics of the &lt;a href="http://myfpgablog.blogspot.com/2011/10/ternary-adder-in-lut62.html"&gt;ternary adder circuit&lt;/a&gt; before and after rearrangement. The second snapshot clearly shows the regular structure of the circuit that the LUT3/LUT4 pair for each bit share common inputs and can be packed into the same LUT6_2.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Schematic before rearrangement &lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-nNU0CDDBu8o/TrWYHoP__lI/AAAAAAAAAPc/Qc-b7Y7h7Wc/s1600/pa_sch_before.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="510" src="http://2.bp.blogspot.com/-nNU0CDDBu8o/TrWYHoP__lI/AAAAAAAAAPc/Qc-b7Y7h7Wc/s640/pa_sch_before.jpg" width="640" /&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;b&gt;Schematic After Rearrangement&amp;nbsp; &lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-b1bXpVHgVLc/TrWYG6ZCBWI/AAAAAAAAAPU/nqdScGn0YeQ/s1600/pa_sch_after.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/-b1bXpVHgVLc/TrWYG6ZCBWI/AAAAAAAAAPU/nqdScGn0YeQ/s640/pa_sch_after.jpg" width="430" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-6034246899289403799?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/6034246899289403799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/11/rearrange-blocks-in-planahead-schematic.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/6034246899289403799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/6034246899289403799'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/11/rearrange-blocks-in-planahead-schematic.html' title='Rearrange Blocks in PlanAhead Schematic Viewer'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/-nNU0CDDBu8o/TrWYHoP__lI/AAAAAAAAAPc/Qc-b7Y7h7Wc/s72-c/pa_sch_before.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-7664304609017975758</id><published>2011-10-29T14:02:00.004-04:00</published><updated>2011-11-05T15:36:44.996-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Use Floating License Servers</title><content type='html'>I used to just set LM_LICENSE_FILE environment variable to all floating license servers for all EDA tools that I use. It had become unacceptably slow to start and run Matlab with LM_LICENSE_FILE (see &lt;a href="http://www.mathworks.com/support/solutions/en/data/1-2Z18MA/"&gt;this Matlab solution&lt;/a&gt; for more information), so I switched to use individual environment variable that each EDA vendor checks for licenses. Things have been working a lot better since I made the change. Below is a list of environment variables that tools I run on a regular basis check for a license. This is mainly for my own reference. Hopefully somebody else may also find it useful.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mentor Graphics&lt;/b&gt;: MGLS_LICENSE_FILE&lt;br /&gt;&lt;b&gt;Matlab&lt;/b&gt;: MLM_LICENSE_FILE&lt;br /&gt;&lt;b&gt;Synposys&lt;/b&gt;: SNPSLMD_LICENSE_FILE &lt;br /&gt;&lt;b&gt;Xilinx&lt;/b&gt;: XILINXD_LICENSE_FILE&lt;br /&gt;&lt;br /&gt;P.S.: Check AR11630 (&lt;a href="http://www.xilinx.com/support/answers/11630.htm"&gt;http://www.xilinx.com/support/answers/11630.htm&lt;/a&gt;) for instructions on how to set up environment variables. My personal favorite tool for setting/editing environment variables is &lt;a href="http://www.rapidee.com/"&gt;Rapid Environment Editor&lt;/a&gt;&lt;br /&gt;P.P.S: Check other &lt;a href="http://myfpgablog.blogspot.com/2010/04/cool-programs-in-my-toolbox.html"&gt;Cool Programs in My Toolbox&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-7664304609017975758?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/7664304609017975758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/10/use-floating-license-servers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7664304609017975758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7664304609017975758'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/10/use-floating-license-servers.html' title='Use Floating License Servers'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-7933343779048368755</id><published>2011-10-22T10:59:00.001-04:00</published><updated>2011-12-31T07:57:46.415-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='implmentation'/><title type='text'>Ternary Adder with LUT6_2</title><content type='html'>Xilinx Virtex5 and newer FPGAs have 6-input look up tables with dual outputs (LUT6_2), which can be efficiently used to build ternary adders. The technique is described in details in US patent 7274211. Below is the circuit copied from the patent filing:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-x5Q7vlbvC1A/TqLXSsHvodI/AAAAAAAAAO4/vUMaGuLT-W8/s1600/ta_patent.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="588" src="http://4.bp.blogspot.com/-x5Q7vlbvC1A/TqLXSsHvodI/AAAAAAAAAO4/vUMaGuLT-W8/s640/ta_patent.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This exact circuit will be automatically inferred by XST for ternary adders in RTL. Below is an example that calculates sum=x+y+z:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(* shreg_extract = "no" *) module adder (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; input      clk,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; input [7:0] x ,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; input [7:0] y ,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; input [7:0] z ,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output reg [7:0]sum&lt;br /&gt;);&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;reg [7:0] sum_r, x_r, y_r, z_r;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;always @(posedge clk) begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;    x_r &amp;lt;= x; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;    y_r &amp;lt;= y; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;    z_r &amp;lt;= z;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;    sum_r &amp;lt;= x_r + y_r + z_r;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;    sum &amp;lt;= sum_r;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;end&lt;br /&gt;endmodule&lt;/div&gt;&lt;br /&gt;The snapshot below shows the technology view of the synthesized netlist targeting a Spartan6 device :&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/-Yk9iqgi7YXo/TqLXR1vpAAI/AAAAAAAAAOw/S4FF6Zh2N7Q/s1600/ta_pa_schematic.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="488" src="http://1.bp.blogspot.com/-Yk9iqgi7YXo/TqLXR1vpAAI/AAAAAAAAAOw/S4FF6Zh2N7Q/s640/ta_pa_schematic.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The MAP utilization shows exactly 8 LUTs used for the logic:&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Slice Logic Utilization:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; Number of Slice Registers:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40 out of&amp;nbsp; 11,440&amp;nbsp;&amp;nbsp;&amp;nbsp; 1%&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number used as Flip Flops:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number used as Latches:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number used as Latch-thrus:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number used as AND/OR logics:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; Number of Slice LUTs:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 out of&amp;nbsp;&amp;nbsp; 5,720&amp;nbsp;&amp;nbsp;&amp;nbsp; 1%&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #f1c232; color: red;"&gt;Number used as logic:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 out of&amp;nbsp;&amp;nbsp; 5,720&amp;nbsp;&amp;nbsp;&amp;nbsp; 1%&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number using O6 output only:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number using O5 output only:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number using O5 and O6:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number used as ROM:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number used as Memory:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 out of&amp;nbsp;&amp;nbsp; 1,440&amp;nbsp;&amp;nbsp;&amp;nbsp; 0%&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number used exclusively as route-thrus:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number with same-slice register load:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number with same-slice carry load:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number with other load:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The two snapshots below shows the first two bits in a slice and all 4-bits packed in the same slice:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--E6mwLtYfyA/TqLXRbgYt-I/AAAAAAAAAOo/UPwAymyH0Dk/s1600/ta_fed_zoom.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="342" src="http://1.bp.blogspot.com/--E6mwLtYfyA/TqLXRbgYt-I/AAAAAAAAAOo/UPwAymyH0Dk/s640/ta_fed_zoom.jpg" width="640" /&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/-ZzDcHKYEupk/TqLXQUWWglI/AAAAAAAAAOg/UC2twhQ1kX4/s1600/ta_fed.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-ZzDcHKYEupk/TqLXQUWWglI/AAAAAAAAAOg/UC2twhQ1kX4/s640/ta_fed.jpg" width="580" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-7933343779048368755?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/7933343779048368755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/10/ternary-adder-in-lut62.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7933343779048368755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7933343779048368755'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/10/ternary-adder-in-lut62.html' title='Ternary Adder with LUT6_2'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/-x5Q7vlbvC1A/TqLXSsHvodI/AAAAAAAAAO4/vUMaGuLT-W8/s72-c/ta_patent.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-213965298077269906</id><published>2011-09-03T18:35:00.000-04:00</published><updated>2011-12-31T07:51:50.186-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fft'/><title type='text'>FFT Core Settings v.s Resources and Performance</title><content type='html'>&lt;br /&gt;&lt;div class="MsoNormal"&gt;Core Generator can be used to quickly find out the resource estimate, latency, and maximum throughput of the FFT core based on the current configuration of the core. This makes it very easy to do trade-off analyses between differentFFT architectures, bit widths, output orders, etc.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The Implemetation Tab displays the resource estimates for DSP48 and 18Kb BRAM counts (note for device families with 36Kb BRAMs, each BRAM primitive can be used as two 18Kb BRAMs):&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wND1XE0UOH0/TmKlCxhcNVI/AAAAAAAAANI/f0hM8mDbUTY/s1600/fft_imp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="408" src="http://3.bp.blogspot.com/-wND1XE0UOH0/TmKlCxhcNVI/AAAAAAAAANI/f0hM8mDbUTY/s640/fft_imp.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;"&gt;The Latency Tab displays the number of cycles required andthe latency for the current transform length:&lt;/span&gt; &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/-NpA7N0d88U0/TmKlEOtwQnI/AAAAAAAAANM/3RPUXyIlqg4/s1600/fft_lat_tab.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="408" src="http://3.bp.blogspot.com/-NpA7N0d88U0/TmKlEOtwQnI/AAAAAAAAANM/3RPUXyIlqg4/s640/fft_lat_tab.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&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: left;"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The numbers on the “Implementation” and “Latency” tabs are updated as soon as settings are changed on the configuration GUI.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The table below shows the resource estimates and latencynumbers for a 1024-point FFT with 250MHz clock, 16-bit inputs and outputs anddifferent architectures and output orders:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3N3pjxly24w/TmKpjcP4LaI/AAAAAAAAANQ/D4fzXYbcVE0/s1600/fft_table.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://1.bp.blogspot.com/-3N3pjxly24w/TmKpjcP4LaI/AAAAAAAAANQ/D4fzXYbcVE0/s640/fft_table.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;As shown in the table above, different settings, especiallydifferent architectures, have big impact on hardware resources and latency. One nice feature is that the tool has “&lt;b style="mso-bidi-font-weight: normal;"&gt;Automatically Select&lt;/b&gt;” as an architecture option so the tool will choosethe &lt;b style="mso-bidi-font-weight: normal;"&gt;smallest &lt;/b&gt;implementation based onthe specified “Target Data Throughput” and “Target Clock Frequency”. Theselected architecture and its resource estimate and latency are displayed on the “Implementation” and “Latency” tabs (see the snapshotbelow).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/-56ZF0TQRAvY/TmKlBr2d1yI/AAAAAAAAANE/Gks9xznjq0E/s1600/fft_auto.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="408" src="http://3.bp.blogspot.com/-56ZF0TQRAvY/TmKlBr2d1yI/AAAAAAAAANE/Gks9xznjq0E/s640/fft_auto.jpg" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-213965298077269906?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/213965298077269906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/09/fft-core-settings-vs-resources-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/213965298077269906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/213965298077269906'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/09/fft-core-settings-vs-resources-and.html' title='FFT Core Settings v.s Resources and Performance'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/-wND1XE0UOH0/TmKlCxhcNVI/AAAAAAAAANI/f0hM8mDbUTY/s72-c/fft_imp.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-5574555815134108003</id><published>2011-07-23T17:12:00.006-04:00</published><updated>2011-12-31T08:00:59.665-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='setup'/><title type='text'>Set up Xilinx IDS environment for non-IDS tools</title><content type='html'>The installer for IDS 12.x or newer on Windows no longer sets up environment variables (XILINX, XILINX_EDK, PATH, etc) for running IDS tools during installation. Instead it provides a bootloader batch file that runs first to set up all required environment variables for &lt;b&gt;the current session&lt;/b&gt; and then invokes the target application. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;You can find out the path and name of the bootloader by looking at the "Target" of the shortcut to any of IDS tools. For example, below are the bootloaders for 64-bit and 32-bit IDS 13.2:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\Xilinx\13.2\ISE_DS\settings64.bat &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\Xilinx\13.2\ISE_DS\settings32.bat&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;The bootloader makes it very easy to run multiple versions of IDS on the same machine and there is no need to manually modify environment variables any more. Even better, the bootloader can be used with non-IDS applications as well. Here is an example showing how to run Matlab with IDS 13.2.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make a copy of the current Matlab shortcut on the desktop and change the name to something meaningful&lt;/li&gt;&lt;li&gt;Right click the new shortcut and open "Properties" window (see the snapshot below)&lt;/li&gt;&lt;li&gt;In the "Target" field, add the bootloader before the Matlab executable. A space is needed between the bootloader and the executable: &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;C:\Xilinx\13.2\ISE_DS\settings64.bat C:\MATLAB\R2011a\bin\matlab.exe&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Click "Change Icon" to change the icon back to Matlab if needed&lt;/li&gt;&lt;li&gt;Apply changes and close the window.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-8L5vVySNy24/TiszUdWze_I/AAAAAAAAAL8/K9Rz-A2EL0o/s1600/shortcut_prop_win.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="560" src="http://1.bp.blogspot.com/-8L5vVySNy24/TiszUdWze_I/AAAAAAAAAL8/K9Rz-A2EL0o/s640/shortcut_prop_win.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The old Matlab shortcut will run with the ISE version set by the system environment variables. The new shortcut will run with IDS 13.2. The snapshot below shows the two sessions side by side.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-OuDF6OTz0Fo/Tis3tGoa6fI/AAAAAAAAAMA/EqsMxGEz9oU/s1600/prog_two_vers.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="353" src="http://1.bp.blogspot.com/-OuDF6OTz0Fo/Tis3tGoa6fI/AAAAAAAAAMA/EqsMxGEz9oU/s640/prog_two_vers.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-5574555815134108003?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/5574555815134108003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/07/set-up-xilinx-ids-environment-for-non.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/5574555815134108003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/5574555815134108003'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/07/set-up-xilinx-ids-environment-for-non.html' title='Set up Xilinx IDS environment for non-IDS tools'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/-8L5vVySNy24/TiszUdWze_I/AAAAAAAAAL8/K9Rz-A2EL0o/s72-c/shortcut_prop_win.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-8899563452089984592</id><published>2011-04-24T13:43:00.004-04:00</published><updated>2011-12-31T07:52:40.698-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fft'/><title type='text'>IFFT with Symmetric Input in System Generator</title><content type='html'>&lt;div style="text-align: left;"&gt;The FFT/IFFT of real data input is symmetric: &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;X(N-k) = X*(k)&lt;/b&gt;. The FFT/IFFT of data with &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;X(N-k) = X*(k)&lt;/b&gt; symmetry may not be real numbers unless &lt;b&gt;X(0)&lt;/b&gt; is real and &lt;b&gt;X(N/2)&lt;/b&gt; is real (this is implied by the symmetry equation &lt;b&gt;X(N-N/2) = X*(N/2)&lt;/b&gt; ). &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;When the &lt;a href="http://www.xilinx.com/support/documentation/ip_documentation/ds808_xfft.pdf"&gt;FFT core&lt;/a&gt; (view all Xilinx documents in &lt;a href="http://myfpgablog.blogspot.com/2011/03/xilinx-document-navigator-is-live.html"&gt;Document Navigator&lt;/a&gt;) is used in SysGen to calculate the IFFT of symmetric input, there are a couple of more things to consider.&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;Set up FFT core for inverse FFT&lt;/u&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;The FFT core needs to be set to IFFT mode by writing 0 to s_axis_config_tdata_fw_inv input through the AXI configuration interface &lt;b&gt;PRIOR&lt;/b&gt; to the start of frame (see the constant blocks in the red circle below)&lt;/div&gt;&lt;div style="text-align: left;"&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/-6n1nA1vYlhQ/TbQ4qnnXXpI/AAAAAAAAALg/s20w2cGO8xA/s1600/ifft_sysgen.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="http://1.bp.blogspot.com/-6n1nA1vYlhQ/TbQ4qnnXXpI/AAAAAAAAALg/s20w2cGO8xA/s640/ifft_sysgen.jpg" width="640" /&gt;&lt;/a&gt;&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;Starting index difference between Matlab and FFT &lt;/u&gt;&lt;/b&gt;&lt;br /&gt;In Matlab, the array index starts from 1, while the index for FFT equations starts from 0. When the symmetric data input to the FFT core is created manually from a script, make sure this starting index difference is accounted for. Using an 8-point FFT as an example, the input array fft_in(1:8) should be set up like the below:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Sample 0:&amp;nbsp;&amp;nbsp; fft_in(1) = real &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Sample 1,7:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; fft_in(2) = conj(fft_in(8))&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Sample 2,6: &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;fft_in(3) = &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;conj(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;fft_in(7))&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Sample 3,5: &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;fft_in(4) = &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;conj(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;fft_in(6))&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Sample 4:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; fft_in(5) = real&lt;/span&gt;&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;Input data range of FFT core&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;The FFT block in SysGen expects the input data to be in the range [-1, 1) or a N bit fixed point with N-1 fractional bits, so make sure the input samples are properly scaled to [-1,1) when they are generated in the script.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;u&gt; &lt;/u&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;u&gt;Exampe&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;An example with 256-point FFT block set to compute IFFT can be &lt;a href="https://sites.google.com/site/jimw567/home/ifft_test_8.zip?attredirects=0&amp;amp;d=1"&gt;downloaded here&lt;/a&gt;. The input samples are symmetric (i.e. &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;X(N-k) = X*(k)&lt;/b&gt;). Below are the magnitudes of the real and imaginary parts of the IFFT outputs, where the imaginary part is negligible (i.e. the IFFT outputs are real.). &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;max_abs_real_fft_sg =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.0078&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;max_abs_imag_fft_sg =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; 3.5763e-007 &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-8899563452089984592?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/8899563452089984592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/04/ifft-with-symmetric-input-in-system.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/8899563452089984592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/8899563452089984592'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/04/ifft-with-symmetric-input-in-system.html' title='IFFT with Symmetric Input in System Generator'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/-6n1nA1vYlhQ/TbQ4qnnXXpI/AAAAAAAAALg/s20w2cGO8xA/s72-c/ifft_sysgen.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-3521032971453651019</id><published>2011-04-13T01:15:00.001-04:00</published><updated>2011-04-13T14:58:23.689-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysGen'/><title type='text'>SysGen xlGenerateButton function example</title><content type='html'>As described in &lt;a href="http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_1/sysgen_ref.pdf"&gt;SysGen Reference Guide&lt;/a&gt; (view all Xilinx documents in &lt;a href="http://myfpgablog.blogspot.com/2011/03/xilinx-document-navigator-is-live.html"&gt;Document Navigator&lt;/a&gt;), the xlGenerateButton function provides a programmatic way to invoke the System Generator code generator. The syntax is&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = xlGenerateButton(sysgenblock)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This looks pretty straightforward: give it the full path name of the System Generator token in the design and let it run. The tricky part is that the actual name for the System Generator token has a space at the very beginning (i.e. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"&lt;span style="background-color: red;"&gt; &lt;/span&gt;System Generator"&lt;/span&gt;), which must be included in the full path name of the SysGen token. In general, when in doubt, you can use the "gcb" function to get the full hierarchical path name of any selected block in a model. In this particular example (&lt;a href="https://sites.google.com/site/jimw567/home/xlgeneratebutton_example.zip?attredirects=0&amp;amp;d=1"&gt;download the model and m script here&lt;/a&gt;), below are the steps to get the full path name of the System Generator token and the snapshot of the output:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open the model &lt;b&gt;system_period_test&lt;/b&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt; Select the System Generator token by clicking on it&lt;/li&gt;&lt;li&gt;Go to the command window and run gcb, which will return the path name&lt;/li&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-pRHK4R4IBPI/TaUvmHOW7OI/AAAAAAAAALU/Dmb4DUr3cDk/s1600/sysgen_token_name.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-pRHK4R4IBPI/TaUvmHOW7OI/AAAAAAAAALU/Dmb4DUr3cDk/s640/sysgen_token_name.jpg" width="636" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;You can now simply start the generation by running the command below:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xlGenerateButton('system_period_test/ System Generator')&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-3521032971453651019?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/3521032971453651019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/04/sysgen-xlgeneratebutton-function.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/3521032971453651019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/3521032971453651019'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/04/sysgen-xlgeneratebutton-function.html' title='SysGen xlGenerateButton function example'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/-pRHK4R4IBPI/TaUvmHOW7OI/AAAAAAAAALU/Dmb4DUr3cDk/s72-c/sysgen_token_name.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-2563009908638090251</id><published>2011-03-24T07:51:00.007-04:00</published><updated>2011-05-03T22:29:53.791-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='offset'/><title type='text'>OFFSET Constraint Entry Methods</title><content type='html'>OFFSET IN/OUT constraints can be specified on IOs using three different methods. It can be entered&lt;br /&gt;&lt;ul&gt;&lt;li&gt;on specific net&lt;/li&gt;&lt;li&gt;on timing group consisting of different pads. This is the method I would &lt;b&gt;recommended&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;globally. All IOs not covered by other more specific OFFSET constraints will be included in the global OFFSET constraint.&lt;/li&gt;&lt;/ul&gt;A simple example (&lt;a href="https://sites.google.com/site/jimw567/offset-example"&gt;download the complete project with HDL and UCF here&lt;/a&gt;) is used below to show the syntax for these three methods and how they are reported by the Timing Analyzer:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;UCF Constraints&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NET "clk_i" TNM_NET = TN_clk_i;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TIMESPEC TS_clk_i = PERIOD "TN_clk_i" 20 ns HIGH 50%;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#global offset in&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;OFFSET = IN 10 ns BEFORE clk_i;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#offset in on time group&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NET a_i[*]&amp;nbsp;&amp;nbsp;&amp;nbsp; TNM = TN_a_i_pads;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NET a_vld_i&amp;nbsp;&amp;nbsp; TNM = TN_a_i_pads;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TIMEGRP TN_a_i_pads OFFSET = IN 8 ns BEFORE clk_i;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;#add P/N of differential pairs to the same timing group&lt;br /&gt;NET d_i_p&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TNM = TN_d_pads;&lt;br /&gt;NET d_i_n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TNM = TN_d_pads;&lt;br /&gt;TIMEGRP TN_d_pads OFFSET = IN 10 ns BEFORE clk_i;&lt;br /&gt;&lt;br /&gt;#offset in on specific net&lt;br /&gt;NET "b_i[*]" OFFSET = IN 6 ns BEFORE clk_i;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Timing Result&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Below is the timing result after the implementation is done.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Each net in the b_i bus is reported separately with 6 ns OFFSET IN requirement.&lt;/li&gt;&lt;li&gt;All nets in TN_a_i_pads group are reported under the OFFSET IN constraint on the timing group.&lt;/li&gt;&lt;li&gt;The c_i bus is not covered by any OFFSET IN constraints on specific net or timing group, so it's reported under the global OFFSET IN constraint.&amp;nbsp;&lt;/li&gt;&lt;li&gt;The differential pair d_i_p and d_i_n are reported under the same timing group.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QkjYrr0xKpk/TcC0XSxyDeI/AAAAAAAAALo/iivA0R6RSG4/s1600/timing_offset_diff.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="438" src="http://4.bp.blogspot.com/-QkjYrr0xKpk/TcC0XSxyDeI/AAAAAAAAALo/iivA0R6RSG4/s640/timing_offset_diff.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-KZAfPFetReU/TYtg_5UpZzI/AAAAAAAAALQ/29fyTYRuMGw/s1600/timing_offset_result.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-2563009908638090251?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/2563009908638090251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/03/offset-constraint-entry-methods.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/2563009908638090251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/2563009908638090251'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/03/offset-constraint-entry-methods.html' title='OFFSET Constraint Entry Methods'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/-QkjYrr0xKpk/TcC0XSxyDeI/AAAAAAAAALo/iivA0R6RSG4/s72-c/timing_offset_diff.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-7341557553102395458</id><published>2011-03-11T06:58:00.015-05:00</published><updated>2012-02-27T21:25:35.498-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doc'/><title type='text'>Xilinx Document Navigator is Live (latest version is 1.2 as of July 26, 2011)</title><content type='html'>&lt;b&gt;Update (Aug 1, 2011)&lt;/b&gt;: Watch&lt;a href="http://www.youtube.com/watch?v=OEY2rRGkQvg&amp;amp;hd=1"&gt; Xilinx Document Navigator 1.2 Overview Video&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Xilinx Document Navigator is an awesome document manager that&lt;br /&gt;&lt;ul&gt;&lt;li&gt;downloads all HW (UG, AppNotes, errata, etc) and SW documents from one "Download" button&lt;/li&gt;&lt;li&gt;automatically checks for updates on all documents&lt;/li&gt;&lt;li&gt;can easily filter, find and search all documents&lt;/li&gt;&lt;li&gt;With improvements made to "User Documents" tab in v1.2 that allow documents/URLs to be organized hierarchically and re-ordered (see the snapshot at the end), DocNav can now be used to manage &lt;b&gt;ALL &lt;/b&gt;your documents, not just Xilinx documents.&amp;nbsp;&lt;a name='more'&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;u&gt;&lt;b&gt;Download&lt;/b&gt;&lt;/u&gt; &lt;br /&gt;The Document Navigator can be downloaded from &lt;a href="http://www.xilinx.com/support/"&gt;http://www.xilinx.com/support/&lt;/a&gt; (see the red rectangle in the snapshot below): &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-v3yOKvlxQ84/T0w63DT4NlI/AAAAAAAAAXA/ZPJv-WjcMz0/s1600/support_docnav.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="342" src="http://2.bp.blogspot.com/-v3yOKvlxQ84/T0w63DT4NlI/AAAAAAAAAXA/ZPJv-WjcMz0/s640/support_docnav.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-lHjtH7F6ChI/TXoMBSxi9nI/AAAAAAAAALI/rDHuZaJ7WDk/s1600/docnav_download.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;u&gt;&lt;b&gt;Main Application Window&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;u&gt;&lt;b&gt;&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Below is the main window of the Document Navigator (DocNav). It's pretty straightforward to use the tool, but I want to point out a few key features in case it helps:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;The document catalog is used by DocNav to keep track all documents. The current status of the catalog is displayed next to it. If any changes are made to the catalog on the server, the status will change to "Update Catalog" and you can simply click on it to update to the latest catalog.&lt;/li&gt;&lt;li&gt;Download button opens the Download Manager from which you can download new or updated documents since last download.&lt;/li&gt;&lt;li&gt;Search button opens Search Tool to search keywords within all documents displayed on the filtered document list.&lt;/li&gt;&lt;li&gt;Find button opens the Find tool bar at the bottom of the window (red rectangle 6).&lt;/li&gt;&lt;li&gt;Status column displays the current status of each document so you can easily see which documents need to be updated.&lt;/li&gt;&lt;li&gt;Find tool bar is used to find documents that match the keyword in its title, Doc ID, etc. The "Auto Filter" on the Find tool bar is really handy to display only matched documents in the document list window.&lt;/li&gt;&lt;li&gt;Filter pane is where you can filter documents based devices, document types, etc. The filter setting can be saved by right clicking on the pane and then select "Save Settings".&lt;/li&gt;&lt;li&gt;&lt;b&gt;New in v1.2 (see the second snapshot below), documents/URLs can be added to folders/subfolders and their order can be easily changed by dragging and dropping.&amp;nbsp; &lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-xWfmVnC4ZRo/TXpYBZvW0EI/AAAAAAAAALM/28CUt5TgM2o/s1600/docnav1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="417" src="https://lh6.googleusercontent.com/-xWfmVnC4ZRo/TXpYBZvW0EI/AAAAAAAAALM/28CUt5TgM2o/s640/docnav1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="434" src="http://4.bp.blogspot.com/-MxQ7i95WqmI/TjFP-W1_PZI/AAAAAAAAAMg/fKasm9d9ZSE/s640/docnav12_userdoc.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-7341557553102395458?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/7341557553102395458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/03/xilinx-document-navigator-is-live.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7341557553102395458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7341557553102395458'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/03/xilinx-document-navigator-is-live.html' title='Xilinx Document Navigator is Live (latest version is 1.2 as of July 26, 2011)'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/-v3yOKvlxQ84/T0w63DT4NlI/AAAAAAAAAXA/ZPJv-WjcMz0/s72-c/support_docnav.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-4283990921049453979</id><published>2011-03-03T06:55:00.092-05:00</published><updated>2011-12-31T07:59:44.202-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysGen'/><category scheme='http://www.blogger.com/atom/ns#' term='fft'/><title type='text'>FFT v8.0 AXI with scaled output</title><content type='html'>The output of the FFT core can be set to "Scaled" to save some logic resources if the full precision is not required. A few things are worth mentioning to get the scaling to work:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;Scaling is done in stages. There are 2 bits in the scaling schedule input for each stage to scale the result by 0 to 3 bits.&lt;/li&gt;&lt;li&gt;The scaling schedule needs to be set &lt;b&gt;BEFORE&lt;/b&gt; the start of the transformation.&amp;nbsp;&lt;/li&gt;&lt;li&gt; It's always a good idea to bring the overflow output out and monitor it to make sure no overflow occurs during scaling.&lt;/li&gt;&lt;li&gt;The bit accurate C model also has a scaling option and scaling schedule input in a slightly difference format than the FFT SysGen block. When comparing the results between the FFT SysGen block and the C model, make sure the same scaling settings are used in both.&lt;/li&gt;&lt;li&gt;When comparing the result between the FFT SysGen block and the Matlab FFT function, remember to scale the output of the FFT function by the same scaling factor.&lt;/li&gt;&lt;/ul&gt;Below are more details about the points above:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Scaling Input Format:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;The description in the &lt;a href="http://www.xilinx.com/support/documentation/ip_documentation/ds808_xfft.pdf"&gt;FFT Datasheet&lt;/a&gt; (view all Xilinx documents in &lt;a href="http://myfpgablog.blogspot.com/2011/03/xilinx-document-navigator-is-live.html"&gt;Document Navigator&lt;/a&gt;) is pretty good, so I just pasted it here for your reference:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-cZTdSheJZFw/TW-DrlWsP8I/AAAAAAAAAKs/km0yr4jcrBk/s1600/fft_sch_input_format.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="https://lh6.googleusercontent.com/-cZTdSheJZFw/TW-DrlWsP8I/AAAAAAAAAKs/km0yr4jcrBk/s640/fft_sch_input_format.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Scaling Schedule Setup&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;In FFT 8.0, the scaling schedule is set via the AXI configuration channel. The data are sent to the core via the data input channel. To make the scaling schedule to take effect, make sure the configuration data are taken by the core before the input samples. Remember that in AXI, the data are only transferred when both TVALID and TREADY are asserted. In this case, check the waveform (see below) to confirm that the condition that &lt;b&gt;s_axis_config_tvalid&lt;/b&gt;=1 and &lt;b&gt;s_axis_config_tready&lt;/b&gt;=1 with desired &lt;b&gt;a_axis_config_scale_sch&lt;/b&gt; happens before &lt;b&gt;s_axis_data_tvalid&lt;/b&gt;=1 and &lt;b&gt;s_axis_data_tready&lt;/b&gt;=1&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-yFwr0zV5m-A/TW-DuVmtnqI/AAAAAAAAAK4/ICdKIKNsdRc/s1600/fft_scale_sch_setup.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="452" src="https://lh6.googleusercontent.com/-yFwr0zV5m-A/TW-DuVmtnqI/AAAAAAAAAK4/ICdKIKNsdRc/s640/fft_scale_sch_setup.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Overflow output&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;The bit growth of the FFT core in full precision mode is &lt;b&gt;NFFT+1&lt;/b&gt; where NFFT is log2(FFT size). For example, for a 256 point FFT, the bit growth is 9 bits. When the scaled output is used, the output has the same width as the input samples, so theoretically the scaling schedule needs to scale back the full bit growth to avoid the overflow. For the 256 point FFT, the scaling schedule can be something like [3 2 2 2] to account for the additional 9 bits. However, for some applications the input samples may never reach the full bit growth going through the FFT core, so the scaling schedule can be smaller to get more dynamic range. This is when you need to monitor the overflow output closely to make sure the overflow doesn't happen. The best way I found for selecting a scaling schedule for maximum dynamic range is to run the bit accurate C model with large set of real input samples and adjust the scaling schedule as needed.&lt;br /&gt;&lt;br /&gt;The snapshot below shows that overflow is observed on the m_axis_data_ovflow output as well as the m_axis_status_ovflow output when the scaling schedule is set too small.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-Rq9EmXZ63ik/TW-DvZ0UU0I/AAAAAAAAAK8/L8xG8dF9T6I/s1600/fft_scale_too_small.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="454" src="https://lh5.googleusercontent.com/-Rq9EmXZ63ik/TW-DvZ0UU0I/AAAAAAAAAK8/L8xG8dF9T6I/s640/fft_scale_too_small.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The snapshot below shows a good transformation of a frame when the scaling schedule is good.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-nSBEAnGOYvI/TW-DtY5u3oI/AAAAAAAAAK0/Kj3FFFB_ezw/s1600/fft_scale_good_frame.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="455" src="https://lh3.googleusercontent.com/-nSBEAnGOYvI/TW-DtY5u3oI/AAAAAAAAAK0/Kj3FFFB_ezw/s640/fft_scale_good_frame.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Set up Scaling in Bit Accurate C Model&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Using the same 256 point FFT as an example, below are the things need to be set up to use the scaling with the bit accurate C model&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;generics.C_HAS_SCALING = 1; % Set to 0 if C_USE_FLT_PT = 1&lt;br /&gt;% Scaling schedule&lt;br /&gt;scaling_sch0 = 2;&lt;br /&gt;scaling_sch1 = 2;&lt;br /&gt;scaling_sch2 = 2;&lt;br /&gt;scaling_sch3 = 2;&lt;br /&gt;&lt;br /&gt;scaling_sch = [scaling_sch3, scaling_sch2, scaling_sch1, scaling_sch0];&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[fft_ba, blkexp, overflow] = xfft_v8_0_bitacc_mex(generics, nfft, input, scaling_sch, direction);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Scale Matlab FFT Output&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;When comparing the Matlab FFT function with the FFT SysGen block, make sure the FFT function output is also scaled by the same scaling factor. e.g.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;scaling_factor = 2^sum(scaling_sch);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;fft_mat = fft(input);&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mag_mat = abs(fft_mat)/scaling_factor;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;OK, now comes my favorite 256 point FFT example that is used a few other blogs. I updated it to turn on the scaling and bring out the overflow output. Below is how the model looks like followed by the plot of the comparison.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-UXz2PRmbsrg/TW-P-KSkwyI/AAAAAAAAALA/wqSyLcmZZME/s1600/fft_scaled_model.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="348" src="https://lh4.googleusercontent.com/-UXz2PRmbsrg/TW-P-KSkwyI/AAAAAAAAALA/wqSyLcmZZME/s640/fft_scaled_model.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-nSBEAnGOYvI/TW-DtY5u3oI/AAAAAAAAAK0/Kj3FFFB_ezw/s1600/fft_scale_good_frame.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-Ua3LZ8VE_z4/TW-QNnT8TEI/AAAAAAAAALE/3ub2w4SZ94s/s1600/fft_compare_result.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="563" src="https://lh6.googleusercontent.com/-Ua3LZ8VE_z4/TW-QNnT8TEI/AAAAAAAAALE/3ub2w4SZ94s/s640/fft_compare_result.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-4283990921049453979?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/4283990921049453979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2011/03/fft-v80-axi-with-scaled-output.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/4283990921049453979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/4283990921049453979'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2011/03/fft-v80-axi-with-scaled-output.html' title='FFT v8.0 AXI with scaled output'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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='https://lh6.googleusercontent.com/-cZTdSheJZFw/TW-DrlWsP8I/AAAAAAAAAKs/km0yr4jcrBk/s72-c/fft_sch_input_format.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-8497989871977808621</id><published>2010-12-08T06:54:00.001-05:00</published><updated>2012-01-14T08:24:55.226-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysGen'/><category scheme='http://www.blogger.com/atom/ns#' term='fft'/><title type='text'>SysGen Example of FFT v8.0 with AXI</title><content type='html'>Starting in IDS 12.3, most, if not all, new/upgraded Xilinx IP cores will only use AXI as user interface. For FFT v8.0 specifically, it provides AXI4-Stream interfaces for input/output data and control. The AXI4-stream interface is a lot simpler than memory mapped AXI4 interface. It uses basic handshake between the master and slave as shown in the snapshot below from the &lt;a href="http://www.xilinx.com/support/documentation/ip_documentation/ds808_xfft.pdf"&gt;FFT v8.0 Data Sheet&lt;/a&gt; (note that all AXI IP cores have separate data sheets than the non-AXI versions).&lt;b&gt; The key thing to remember is that the AXI payload is only transferred when both TVALID and TREADY are high&lt;/b&gt;. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Z-IGtacTmlg/TP9swY2fnII/AAAAAAAAAKc/FlAiQ5tNU18/s1600/axi4_basic_handshake.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="366" src="http://3.bp.blogspot.com/_Z-IGtacTmlg/TP9swY2fnII/AAAAAAAAAKc/FlAiQ5tNU18/s640/axi4_basic_handshake.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I updated the SysGen example in the blog &lt;a href="http://myfpgablog.blogspot.com/2010/07/fft-results-from-matlab-fft-bit.html"&gt;FFT results from Matlab fft, Bit Accurate C model and SysGen FFT block&lt;/a&gt; with FFT v8.0 core to show the use of&amp;nbsp; AXI4 stream interface. Below is the updated SysGen model:&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/_Z-IGtacTmlg/TP9wUsDzpiI/AAAAAAAAAKg/eaLIN-w1mRk/s1600/fft8_sysgen.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="306" src="http://3.bp.blogspot.com/_Z-IGtacTmlg/TP9wUsDzpiI/AAAAAAAAAKg/eaLIN-w1mRk/s640/fft8_sysgen.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;The updated SysGen model and m file can be &lt;a href="http://sites.google.com/site/jimw567/sysgen-example-of-fft-v8-0-with-axi" target="_blank"&gt;downloaded from here&lt;/a&gt;. Again, you will need to download the bit accurate model from &lt;a href="http://www.xilinx.com/products/ipcenter/FFT.htm"&gt;FFT core&lt;/a&gt; web site yourself to run fft_compare.m script.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-8497989871977808621?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/8497989871977808621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2010/12/example-of-fft-v80-with-axi.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/8497989871977808621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/8497989871977808621'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2010/12/example-of-fft-v80-with-axi.html' title='SysGen Example of FFT v8.0 with AXI'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/TP9swY2fnII/AAAAAAAAAKc/FlAiQ5tNU18/s72-c/axi4_basic_handshake.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-8797027925107905054</id><published>2010-11-11T14:50:00.006-05:00</published><updated>2012-01-08T18:47:52.296-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='synthesis'/><title type='text'>Understand maximum frequency reporting in XST</title><content type='html'>Let's say your design has a single 50MHz clock source coming in. It then goes to a DCM or PLL to generate three clock outputs at 50MHz, 100MHz and 150MHz. When you run through synthesis XST reports the maximum frequency of the design like below.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Minimum period: 6.292ns (Maximum Frequency: 158.931MHz)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Which clock is this maximum frequency reported on since the design uses all three derived clocks? Well, it depends if the derived clocks are from DCM or PLL. Let's use two test cases, one with DCM and one with PLL, to see how the maximum frequency is reported. Each test case has the same adder below in each derived clock domain.&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/_Z-IGtacTmlg/TNwQk3JtYiI/AAAAAAAAAKQ/n_tLXIgk9ak/s1600/adder_path.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="339" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/TNwQk3JtYiI/AAAAAAAAAKQ/n_tLXIgk9ak/s640/adder_path.jpg" width="640" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="https://sites.google.com/site/jimw567/home/timing_path.zip?attredirects=0&amp;amp;d=1"&gt;&lt;b&gt;Test case with DCM (click to download the project in IDS 12.3)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;The snapshot below shows the timing summary and the worst case path for the test case with DCM. Note that the minimum period is reported as 6.292ns while the delay of the worst timing path is 2.097ns. This is because the worst case path is in the 150MHz clock domain (note that the source and destination clock of the path is clk0_i rising 3.0x) and XST references it back to the DCM input clock (clk0_i @50MHz) to calculate the maximum clock frequency. In other words, to meet the 2.097ns delay in the 150MHz clock domain, the minimum delay of the DCM input clock must be 2.097*3=6.292 ns or maximum frequency 158.93MHz. As long as the DCM input clock is 158.93MHz or lower, all the paths in all derived clock domains will meet timing.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Z-IGtacTmlg/TNwTk1yHRMI/AAAAAAAAAKU/XnGWhkNXHzk/s1600/adder_delay_dcm.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="411" src="http://4.bp.blogspot.com/_Z-IGtacTmlg/TNwTk1yHRMI/AAAAAAAAAKU/XnGWhkNXHzk/s640/adder_delay_dcm.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="https://sites.google.com/site/jimw567/home/timing_path_pll.zip?attredirects=0&amp;amp;d=1"&gt;Test case with PLL (click to download the project in IDS 12.3)&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;The snapshot below shows the timing summary and the worst case path for the test case with PLL. The minimum period in timing summary is the same as the delay in the worst case path. XST uses the PLL output directly to calculate the maximum frequency. Personally I think this is the wrong way of reporting the maximum frequency because users can't just change the clock frequency of one PLL output and have no way of knowing what the PLL input clock frequency needs to be. It's mostly likely an oversight (read BUG) in XST.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Z-IGtacTmlg/TNxGmmoXkoI/AAAAAAAAAKY/bz9ogXwKBvU/s1600/adder_delay_pll.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="416" src="http://4.bp.blogspot.com/_Z-IGtacTmlg/TNxGmmoXkoI/AAAAAAAAAKY/bz9ogXwKBvU/s640/adder_delay_pll.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-8797027925107905054?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/8797027925107905054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2010/11/understand-maximum-frequency-reporting.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/8797027925107905054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/8797027925107905054'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2010/11/understand-maximum-frequency-reporting.html' title='Understand maximum frequency reporting in XST'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/TNwQk3JtYiI/AAAAAAAAAKQ/n_tLXIgk9ak/s72-c/adder_path.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-1055552152949453489</id><published>2010-10-12T00:52:00.002-04:00</published><updated>2010-10-12T00:58:00.353-04:00</updated><title type='text'>Use Excel to Draw Waveforms</title><content type='html'>I learned a trick yesterday from a &lt;a href="http://twitter.com/#%21/rickysu"&gt;friend's tweet&lt;/a&gt; that Excel can be used to draw waveforms using different cell border outlines. I just tried it out and within a few minutes I got a pretty nice waveform in front of me. There is no learning curve involved and no need to purchase and/or install a special waveform drawing tool. I presume &lt;a href="http://sc.openoffice.org/"&gt;OpenOffice Calc &lt;/a&gt;can be used to do the same thing. &lt;br /&gt;&lt;br /&gt;Below is the waveform in Excel:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Z-IGtacTmlg/TLPpBeEXz3I/AAAAAAAAAKA/KxvymCUQOJ4/s1600/waveform_excel.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="234" src="http://2.bp.blogspot.com/_Z-IGtacTmlg/TLPpBeEXz3I/AAAAAAAAAKA/KxvymCUQOJ4/s640/waveform_excel.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And here how it looks like in "Print Preview":&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Z-IGtacTmlg/TLPpc8E3bdI/AAAAAAAAAKE/06Og43N5cQE/s1600/waveform_print_preview.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="204" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/TLPpc8E3bdI/AAAAAAAAAKE/06Og43N5cQE/s640/waveform_print_preview.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-1055552152949453489?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/1055552152949453489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2010/10/use-excel-to-draw-waveforms.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/1055552152949453489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/1055552152949453489'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2010/10/use-excel-to-draw-waveforms.html' title='Use Excel to Draw Waveforms'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/TLPpBeEXz3I/AAAAAAAAAKA/KxvymCUQOJ4/s72-c/waveform_excel.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-7693376423251001617</id><published>2010-07-22T06:48:00.047-04:00</published><updated>2011-10-29T12:52:04.525-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysGen'/><title type='text'>DDS in System Generator: how to set up periods?</title><content type='html'>If you use &lt;a href="http://www.xilinx.com/support/documentation/ip_documentation/dds_ds558.pdf"&gt;DDS Compiler&lt;/a&gt; in System Generator, you will notice there are 4 clock periods you need to deal with (circled in red in the snapshot below). This can be confusing for first time users. Hopefully this blog can clear up some of the confusions.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Z-IGtacTmlg/TEgjiyenmlI/AAAAAAAAAJE/bW8zLENABYg/s1600/DDS_periods.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="314" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/TEgjiyenmlI/AAAAAAAAAJE/bW8zLENABYg/s640/DDS_periods.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;FPGA clock period (ns)&lt;/b&gt;: only used for FPGA synthesis and implementation. This value does NOT affect simulation in Simulink (i.e. it will NOT affect output frequency of the DDS block).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Simulink System Period&lt;/b&gt;: only used in Simulink simulation. This is the lowest sampling period (highest sampling frequency) among all blocks in the model. There is no significance in its absolute value as long as the sampling periods of all other blocks are multiple of the Simulink System Period. Usually it is set to 1 to keep everything simple. (e.g. every tick in a scope is 1 clock cycle).&lt;/li&gt;&lt;li&gt;&lt;b&gt;DDS System Clock (Mhz)&lt;/b&gt;: It's used to calculate the phase increment for DDS block (see the &lt;a href="http://www.xilinx.com/support/documentation/ip_documentation/dds_ds558.pdf"&gt;DDS datasheet&lt;/a&gt; for details). Set it to match the FPGA clock period (i.e. DDS System Clock (Mhz) = 1/FPGA clock period).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Explicit Sample Period&lt;/b&gt;: This is the sample period used for the DDS block. &lt;b&gt;IMPORTANT: if you set Simulink System Period to anything other than 1, "Use explicit period" MUST be checked and "Explicit Period" set to the same value as Simulink System period. Otherwise, Simulink will use the sample period of 1 for the DDS core and the output frequency will be wrong. &lt;span style="color: red;"&gt;This is likely a bug&lt;/span&gt;.&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;Let's use a simple model (&lt;a href="https://sites.google.com/site/jimw567/home/system_period_test.mdl?attredirects=0&amp;amp;d=1"&gt;download the model for test1 here&lt;/a&gt;) below to show how all these periods play together in SysGen. The clock frequency of the SineGen block is 1/100th of the Simulink System Period (or 1MHz for a 100MHz clock input).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Z-IGtacTmlg/TEglf__NjOI/AAAAAAAAAJM/PmONNJ4_nWE/s1600/dds_model.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://3.bp.blogspot.com/_Z-IGtacTmlg/TEglf__NjOI/AAAAAAAAAJM/PmONNJ4_nWE/s400/dds_model.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Test1: &lt;/b&gt;&lt;br /&gt;FPGA clock period (ns) = 10&lt;br /&gt;Simulink system period = 1&lt;br /&gt;DDS System Clock (MHz) = 100&lt;br /&gt;Use Explicit Sample Period checked and Explicit Period = 1&lt;br /&gt;DDS Output (MHz) = 1 &lt;br /&gt;&lt;br /&gt;As shown in the scope below the DDS output matches the SineGen output:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Z-IGtacTmlg/TEgn3AcWUqI/AAAAAAAAAJU/ulFdwO8YdTc/s1600/dds_test1.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="378" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/TEgn3AcWUqI/AAAAAAAAAJU/ulFdwO8YdTc/s400/dds_test1.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Test2:&lt;/b&gt;&lt;br /&gt;FPGA clock period (ns) = 10&lt;br /&gt;Simulink system period = &lt;b&gt;0.1&lt;/b&gt;&lt;br /&gt;DDS System Clock (MHz) = 100&lt;br /&gt;Use Explicit Sample Period checked and Explicit Period = &lt;b&gt;0.1&lt;/b&gt;&lt;br /&gt;DDS Output (MHz) = 1&lt;br /&gt;&lt;br /&gt;As shown in the scope below the DDS output matches the SineGen output. Note that the Simulink system period is now 1/10th of the period in Test1, so there are 10x more clock cycles in this test with the same simulation time.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Z-IGtacTmlg/TEgpgxR8J2I/AAAAAAAAAJc/6b0dlZfrbc4/s1600/dds_test2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="377" src="http://2.bp.blogspot.com/_Z-IGtacTmlg/TEgpgxR8J2I/AAAAAAAAAJc/6b0dlZfrbc4/s400/dds_test2.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Test3:&lt;/b&gt;&lt;br /&gt;FPGA clock period (ns) = 10&lt;br /&gt;Simulink system period = &lt;b&gt;0.1&lt;/b&gt;&lt;br /&gt;DDS System Clock (MHz) = 100&lt;br /&gt;&lt;b&gt;Use Explicit Sample Period unchecked&lt;/b&gt;&lt;br /&gt;DDS Output (MHz) = 1&lt;br /&gt;&lt;br /&gt;As shown in the scope below the DDS output frequency is 1/10th of SinGen output. The &lt;b&gt;incorrect&lt;/b&gt; DDS output frequency is caused by that when "Use Explicit Sample Period" is unchecked Simulink use a sample period of 1 for the DDS block. So it's very important to check this checkbox and set the explicit period to match the Simulink system period if it's not 1. It's worth mentioning that for sampling frequency related issues it's very helpful to turn on "Sample Time Display" (under Format menu) and then update the diagram by pressing CTRL-D. You can easily see if the sample time used for a particular is correct with sampling time displayed on all signals.&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/_Z-IGtacTmlg/TEhCbkzMluI/AAAAAAAAAJk/qGE_88Y60yA/s1600/dds_test3.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="380" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/TEhCbkzMluI/AAAAAAAAAJk/qGE_88Y60yA/s400/dds_test3.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-7693376423251001617?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/7693376423251001617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2010/07/dds-in-system-generator-how-to-set-up.html#comment-form' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7693376423251001617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7693376423251001617'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2010/07/dds-in-system-generator-how-to-set-up.html' title='DDS in System Generator: how to set up periods?'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/TEgjiyenmlI/AAAAAAAAAJE/bW8zLENABYg/s72-c/DDS_periods.gif' height='72' width='72'/><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-3331462910475270835</id><published>2010-07-13T00:40:00.006-04:00</published><updated>2011-10-29T12:52:18.632-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fft'/><title type='text'>FFT: Valid Values of Number of Stages Using Block RAM</title><content type='html'>If you have used the &lt;a href="http://www.xilinx.com/support/documentation/ip_documentation/xfft_ds260.pdf"&gt;FFT block&lt;/a&gt; in System Generator, you probably have seen the error message below.&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/_Z-IGtacTmlg/TDvo-2-cokI/AAAAAAAAAIk/WeKmENkTCM8/s1600/fft_error_msg.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="130" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/TDvo-2-cokI/AAAAAAAAAIk/WeKmENkTCM8/s400/fft_error_msg.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You've got to love these "you-did-something-wrong-but-I-am-not-gonna-tell-you-how-to-fix-it" error messages. If you read through the datasheet, you will find it's not any better as it asks you to run Core Generator to get the valid values for the FFT transform length you chose. I've gone through this quite a few times, so I put together the table below showing valid values of "Number of Stages Using Block RAM" for all supported FFT sizes (data extracted from CoreGen 12.1) for me to use it as a quick reference. I hope this will also save other people a few minutes by not having to run CoreGen to get this simple info which should have been clearly stated in the error message.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;table border="1" style="text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;FFT Size&lt;/th&gt;&lt;th&gt;Number of Stages Using Block RAM&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;0-1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;128&lt;/td&gt;&lt;td&gt;0-2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;256&lt;/td&gt;&lt;td&gt;0-3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;512&lt;/td&gt;&lt;td&gt;0-4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1024&lt;/td&gt;&lt;td&gt;1-5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2048&lt;/td&gt;&lt;td&gt;2-6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4096&lt;/td&gt;&lt;td&gt;3-7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8192&lt;/td&gt;&lt;td&gt;4-8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16384&lt;/td&gt;&lt;td&gt;5-9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;32768&lt;/td&gt;&lt;td&gt;6-10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;65536&lt;/td&gt;&lt;td&gt;7-11&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-3331462910475270835?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/3331462910475270835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2010/07/fft-valid-values-of-number-of-stages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/3331462910475270835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/3331462910475270835'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2010/07/fft-valid-values-of-number-of-stages.html' title='FFT: Valid Values of Number of Stages Using Block RAM'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/TDvo-2-cokI/AAAAAAAAAIk/WeKmENkTCM8/s72-c/fft_error_msg.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-5996507412396126775</id><published>2010-07-04T07:49:00.001-04:00</published><updated>2011-09-07T20:27:45.312-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysGen'/><category scheme='http://www.blogger.com/atom/ns#' term='fft'/><title type='text'>FFT results from Matlab fft, Bit Accurate C model and SysGen FFT block</title><content type='html'>The usage of  the &lt;a href="http://www.xilinx.com/products/ipcenter/FFT.htm"&gt;FFT core&lt;/a&gt;  is straightforward, however, it does have a lot more knobs to turn  compared to a simple fft() function in Matlab. Sometimes when the output  from the FFT core doesn't match Matlab fft() result you  start to question if there is a bug in the FFT core. I will use a simple example here hopefully to&lt;br /&gt;&lt;ul&gt;&lt;li&gt;provide some assurance that the result from the FFT core match well with Matlab fft() function and FFT bit accurate C model&lt;/li&gt;&lt;li&gt;provide a starting point so you can look at configurations as well as timing of control and data signals of the core in case you didn't have time to read &lt;a href="http://www.xilinx.com/support/documentation/ip_documentation/xfft_ds260.pdf"&gt;the FFT core data sheet&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Below is the SysGen model that uses a 256-point FFT with pipelined streaming IO and unscaled output in natural order. The input vector is a simple ramp (-128:127)/128 in fixed 16.15 format.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Z-IGtacTmlg/TDBr_oE7QkI/AAAAAAAAAH8/q0gCDKQXGPU/s1600/fft_model.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="385" src="http://4.bp.blogspot.com/_Z-IGtacTmlg/TDBr_oE7QkI/AAAAAAAAAH8/q0gCDKQXGPU/s640/fft_model.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;The waveform below shows the FFT signals at the beginning of the simulation in&lt;b&gt; WaveScope&lt;/b&gt; (a great tool in Xilinx Blockset for debugging, by the way). Note that in FFT v7.0 and newer, there is no longer a requirement of 3 cycle offset between xn_index and xn_re/xn_im inputs.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Z-IGtacTmlg/TDBumrcjjAI/AAAAAAAAAIE/PQhmnde6TQA/s1600/fft_start.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="555" src="http://4.bp.blogspot.com/_Z-IGtacTmlg/TDBumrcjjAI/AAAAAAAAAIE/PQhmnde6TQA/s640/fft_start.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The waveform below is at the end of FFT computation and data start to unload. Note that xk_index is incrementing as the core output is in natural order.&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/_Z-IGtacTmlg/TDBwW7IXUvI/AAAAAAAAAIM/4kPOBWXqDMY/s1600/fft_dv.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="564" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/TDBwW7IXUvI/AAAAAAAAAIM/4kPOBWXqDMY/s640/fft_dv.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The simulation results are collected in workspace. A m script is then run to compare the results from Matlab fft(), FFT bit accurate C model, and the Simulink simulation. Below is an overlay plot showing all three outputs, where the difference is negligible.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Z-IGtacTmlg/TDBymWZak2I/AAAAAAAAAIU/a9RIPCAK6j0/s1600/fft_plot.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="566" src="http://2.bp.blogspot.com/_Z-IGtacTmlg/TDBymWZak2I/AAAAAAAAAIU/a9RIPCAK6j0/s640/fft_plot.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The script also prints all elements of outputs side by side for easy comparison.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;idx&amp;nbsp;&amp;nbsp;&amp;nbsp; Matlab&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; Bit Accurate SysGen&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  1.000000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.000000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  81.489376&amp;nbsp;&amp;nbsp;&amp;nbsp; 81.489504&amp;nbsp;&amp;nbsp;&amp;nbsp; 81.489595&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  40.747756&amp;nbsp;&amp;nbsp;&amp;nbsp; 40.747746&amp;nbsp;&amp;nbsp;&amp;nbsp; 40.747868&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  27.168581&amp;nbsp;&amp;nbsp;&amp;nbsp; 27.168709&amp;nbsp;&amp;nbsp;&amp;nbsp; 27.168739&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  20.380016&amp;nbsp;&amp;nbsp;&amp;nbsp; 20.380048&amp;nbsp;&amp;nbsp;&amp;nbsp; 20.380078&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  16.307697&amp;nbsp;&amp;nbsp;&amp;nbsp; 16.307667&amp;nbsp;&amp;nbsp;&amp;nbsp; 16.307587&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;251&amp;nbsp;&amp;nbsp;&amp;nbsp;  16.307697&amp;nbsp;&amp;nbsp;&amp;nbsp; 16.307667&amp;nbsp;&amp;nbsp;&amp;nbsp; 16.307545&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;252&amp;nbsp;&amp;nbsp;&amp;nbsp;  20.380016&amp;nbsp;&amp;nbsp;&amp;nbsp; 20.380048&amp;nbsp;&amp;nbsp;&amp;nbsp; 20.380017&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;253&amp;nbsp;&amp;nbsp;&amp;nbsp;  27.168581&amp;nbsp;&amp;nbsp;&amp;nbsp; 27.168709&amp;nbsp;&amp;nbsp;&amp;nbsp; 27.168495&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;254&amp;nbsp;&amp;nbsp;&amp;nbsp;  40.747756&amp;nbsp;&amp;nbsp;&amp;nbsp; 40.747746&amp;nbsp;&amp;nbsp;&amp;nbsp; 40.747960&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;255&amp;nbsp;&amp;nbsp;&amp;nbsp;  81.489376&amp;nbsp;&amp;nbsp;&amp;nbsp; 81.489504&amp;nbsp;&amp;nbsp;&amp;nbsp; 81.489687&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In case you want to play with the example design, you can &lt;a href="https://sites.google.com/site/jimw567/fft-example-1"&gt;download it from here&lt;/a&gt;. You will need to download the bit accurate C model from &lt;a href="http://www.xilinx.com/products/ipcenter/FFT.htm"&gt;FFT core&lt;/a&gt; web site yourself because it requires registration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-5996507412396126775?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/5996507412396126775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2010/07/fft-results-from-matlab-fft-bit.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/5996507412396126775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/5996507412396126775'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2010/07/fft-results-from-matlab-fft-bit.html' title='FFT results from Matlab fft, Bit Accurate C model and SysGen FFT block'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/TDBr_oE7QkI/AAAAAAAAAH8/q0gCDKQXGPU/s72-c/fft_model.gif' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-2432062778035679732</id><published>2010-06-12T19:59:00.000-04:00</published><updated>2011-08-25T23:28:31.155-04:00</updated><title type='text'>Calculate OFFSET OUT value</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&amp;nbsp;Let's say on your PCB you have an FPGA that sends data to a DAC like the picture below: &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Z-IGtacTmlg/TBQZ1FxJTRI/AAAAAAAAAHo/VjLcupzALeE/s1600/fpgawithdac.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="218" src="http://4.bp.blogspot.com/_Z-IGtacTmlg/TBQZ1FxJTRI/AAAAAAAAAHo/VjLcupzALeE/s640/fpgawithdac.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It's clear that you need an OFFSET OUT constraint on the FPGA data output so that the setup and hold times are met on the DAC side. The question is how to calculate the OFFSET OUT value. The best way to figure it out is to draw all clock and data signals at different points on a piece of paper and write down all propagations delays. You can then do the calculation very easily. The picture below shows clock and data signals at the DAC and FPGA:&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/_Z-IGtacTmlg/TBQdvml2VGI/AAAAAAAAAH0/F6dUBNSYo0o/s1600/clk_data_dac_fpga.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="424" src="http://3.bp.blogspot.com/_Z-IGtacTmlg/TBQdvml2VGI/AAAAAAAAAH0/F6dUBNSYo0o/s640/clk_data_dac_fpga.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now let's plug in all the delay numbers:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CLK_period = 1/64MHz = 15.625ns&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CLK_DELAY_PCB is about 1ns (160mm PCB trace at 1ns/6 inches)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DATA_DELAY_PCB is about 1ns (160mm PCB trace at 1ns/6 inches)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SETUP_DAC = 5.3ns&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt; FPGA DATA OFFSET OUT&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;= CLK period - CLK_DELAY_PCB - DATA_DELAY_PCB - SETUP_DAC&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;= 15.625 - 1 - 1 - 5.3&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;= 8.325 ns&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-2432062778035679732?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/2432062778035679732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2010/06/calculate-offset-out-value.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/2432062778035679732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/2432062778035679732'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2010/06/calculate-offset-out-value.html' title='Calculate OFFSET OUT value'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/TBQZ1FxJTRI/AAAAAAAAAHo/VjLcupzALeE/s72-c/fpgawithdac.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-1309210520679206</id><published>2010-06-01T07:01:00.009-04:00</published><updated>2011-03-11T07:03:15.406-05:00</updated><title type='text'>Virtex6 and Spartan6 handbooks - OBSOLETE</title><content type='html'>Now that &lt;a href="http://myfpgablog.blogspot.com/2011/03/xilinx-document-navigator-is-live.html"&gt;Xilinx Document Navigator is live&lt;/a&gt;, I am marking this blog as &lt;b&gt;&lt;span style="color: red;"&gt;OBSOLETE. &lt;/span&gt;&lt;/b&gt;&lt;span style="color: red;"&gt;&lt;span style="color: black;"&gt;I highly recommend everybody give the Xilinx Document Navigator a try. You will love it.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I always found myself having dozens of Virtex6 and Spartan6 DS/UGs open to get the information I want, so I&amp;nbsp; merged individual PDFs into one document for each family to not only reduce the cluttering on my desktop but also make search a lot easier. The handbooks can be downloaded from the links below in case somebody else may find them useful:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Download&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Virtex-6 "Handbook": combined V6 datasheets and user guides, which&amp;nbsp;are the most up-to-date versions as of Aug 4, 2010.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/5559324/doc/Virtex6_handbook_04Nov2010.zip"&gt;Download Winzip compressed&lt;/a&gt; (23MB)&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Spartan-6 "Handbook": combined&amp;nbsp;S6 datasheets and user guides, which are the most up-to-date versions as of Aug 4, 2010.&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/5559324/doc/Spartan6_handbook_04Nov2010.zip"&gt;Download Winzip compressed&lt;/a&gt; (16MB) &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;V6 handbook contents: &lt;/b&gt;  &lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; border: medium none; width: 607px;"&gt;&lt;tbody&gt;&lt;tr style="height: 13.5pt;"&gt;   &lt;td nowrap="nowrap" style="border: 1pt solid windowtext; height: 13.5pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;Name&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: windowtext windowtext windowtext -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;Version&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: windowtext windowtext windowtext -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;Date&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;DS150: Virtex-6 Family   Overview&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/data_sheets/ds150.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/data_sheets/ds150.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;2.2&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Jan 29, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG362 Virtex-6 FPGA   Clocking Resources User Guide &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug362.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug362.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.5&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Aug 16, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG364 Virtex-6 FPGA   Configurable Logic Block User Guide &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug364.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug364.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.1&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Sep 16, 2009&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG363 Virtex-6 FPGA Memory   Resources User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug363.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug363.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.5&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Aug 3, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG361 Virtex-6 FPGA   SelectIO Resources User Guide &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug361.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug361.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.3&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Aug 16, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG369 Virtex-6 FPGA DSP48E1   Slice User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug369.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug369.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.2&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Sep 16, 2009&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 13.5pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 13.5pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG370 Virtex-6 FPGA System   Monitor User Guide &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug370.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug370.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.1&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Jun 14, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG368 Virtex-6 FPGA   Embedded Tri-Mode Ethernet MAC User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug368.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug368.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.2&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Jan 17, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG366 Virtex-6 FPGA GTX   Transceivers User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug366.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug366.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;2.4&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Oct 1, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 13.5pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 13.5pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG371 Virtex-6 FPGA GTH   Transceivers User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug371.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug371.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;2.1&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Oct 4, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 13.5pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 13.5pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG373 Virtex-6 FPGA PCB   Design Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug373.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug373.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.2&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Jun 10, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 13.5pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 13.5pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG360 Virtex-6 FPGA   Configuration User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug360.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug360.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;3.2&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Nov 1, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 13.5pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 13.5pt; padding: 0in 5.4pt; width: 329.4pt;" valign="top" width="439"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;DS152 Virtex-6 FPGA Data   Sheet: DC and Switching Characteristics&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/data_sheets/ds152.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/data_sheets/ds152.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 45pt;" valign="top" width="60"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;2.10&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 81pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Oct 18, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;S6 handbook contents:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; border: medium none; width: 607px;"&gt;&lt;tbody&gt;&lt;tr style="height: 13.5pt;"&gt;   &lt;td nowrap="nowrap" style="border: 1pt solid windowtext; height: 13.5pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;Name&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: windowtext windowtext windowtext -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;Version&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: windowtext windowtext windowtext -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 13.5pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;Date&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;DS160: Spartan-6 Family   Overview&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/data_sheets/ds160.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/data_sheets/ds160.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.5&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Aug 2, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG382 Spartan-6 FPGA   Clocking Resources User Guide &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug382.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug382.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.4&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Aug 24, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG384 Spartan-6 FPGA   Configurable Logic Block User Guide &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug384.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug384.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.1&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Feb 23, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG383 Spartan-6 FPGA Block   RAM Resources User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug383.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug383.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.3&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Oct 13, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG381 Spartan-6 FPGA   SelectIO Resources User Guide &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug381.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug381.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.3&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Mar 15, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG389 Spartan-6 FPGA DSP48A1   Slice User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug389.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug389.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.1&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Aug&amp;nbsp; 13, 2009&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG388 Spartan-6 FPGA Memory   Controller User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug388.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug388.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;2.3&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Aug 9,2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG386 Spartan-6 FPGA GTP   Transceivers User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug386.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug386.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;2.2&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Apr 30, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG393 Spartan-6 FPGA PCB   Design and Pin Planning Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug393.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug393.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.2&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Jul 15, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG394 Spartan-6 FPGA Power   Management User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug394.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug394.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.0&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;May 18, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;UG380 Spartan-6 FPGA   Configuration User Guide&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug380.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/user_guides/ug380.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;2.2&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Jul 30, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 12.75pt; padding: 0in 5.4pt; width: 4.45in;" valign="top" width="427"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;DS162 Spartan-6 FPGA Data   Sheet: DC and Switching Characteristics &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.xilinx.com/support/documentation/data_sheets/ds162.pdf"&gt;&lt;span style="font-size: 10pt;"&gt;http://www.xilinx.com/support/documentation/data_sheets/ds162.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 44.15pt;" valign="top" width="59"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;1.9&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap="nowrap" style="border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 12.75pt; padding: 0in 5.4pt; width: 90.85pt;" valign="top" width="121"&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Aug 23, 2010&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-1309210520679206?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/1309210520679206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2010/06/virtex6-and-spartan6-handbooks.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/1309210520679206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/1309210520679206'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2010/06/virtex6-and-spartan6-handbooks.html' title='Virtex6 and Spartan6 handbooks - OBSOLETE'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-684891680658235824</id><published>2010-04-04T15:21:00.006-04:00</published><updated>2011-10-29T17:54:16.849-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Cool Programs in My Toolbox</title><content type='html'>Over years I have installed many cool little programs on my machine. They become handy for so many different things. I had to rebuild my computer recently and took me a while to google the Internet to find all the goodies. It occurred to me that it would be handy if I build a list for all these programs and put it somewhere I can easily access. And here the list goes (I will add things as I go, so it will always be work-in-progress):&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" style="font-family: inherit;"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td valign="top"&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;span class="yshortcuts" id="lw_1270408075_0"&gt;&lt;a href="http://www.mythicsoft.com/page.aspx?type=agentransack&amp;amp;page=home"&gt;Agent Ransack&lt;/a&gt;: search for files based on file names and/or particular string pattern in file contents&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.cutepdf.com/" rel="nofollow" target="_blank"&gt;&lt;span class="yshortcuts" id="lw_1270408075_0"&gt;CutePDF&lt;/span&gt;&lt;/a&gt;&lt;span class="yshortcuts" id="lw_1270408075_1"&gt;: print anything to a PDF file &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.ccleaner.com/" rel="nofollow" target="_blank"&gt;&lt;span class="yshortcuts" id="lw_1270408075_1"&gt;CCleaner&lt;/span&gt;&lt;/a&gt;&lt;span class="yshortcuts" id="lw_1270408075_2"&gt;:cleaning registry, temporary files, etc on Windows &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: small;"&gt;&lt;span class="yshortcuts" id="lw_1270408075_2"&gt;&lt;a href="http://www.freelaunchbar.com/"&gt;Free Launch Bar&lt;/a&gt;: A much better replacement of Windows Quick Launch Bar that allows you to group programs&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span class="yshortcuts" id="lw_1270408075_2"&gt;&lt;a href="http://www.pdfsam.org/"&gt;http://www.pdfsam.org&lt;/a&gt; : Merge and Split PDFs&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.rapidee.com/"&gt;Rapid Environment Editor&lt;/a&gt; : Very nice GUI for setting and editing environment variables&lt;br /&gt;&lt;a href="http://www.wisdom-soft.com/products/screenhunter_free.htm"&gt;ScreenHunter Free&lt;/a&gt;: Screen capture tool&lt;br /&gt;&lt;a href="http://www.wireshark.org/"&gt;WireShark&lt;/a&gt; : Network sniffer for debugging Ethernet designs &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-684891680658235824?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/684891680658235824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2010/04/cool-programs-in-my-toolbox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/684891680658235824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/684891680658235824'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2010/04/cool-programs-in-my-toolbox.html' title='Cool Programs in My Toolbox'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-2766562289058394854</id><published>2010-01-12T23:05:00.003-05:00</published><updated>2010-01-12T23:27:36.706-05:00</updated><title type='text'>Spartan6 Configuration Examples</title><content type='html'>The web links below will bring you directly to the block diagram for the selected configuration mode in the "Spartan6 FPGA Configuration User Guide" (UG380 v1.0 Jun 24, 2009). This is also the landing page for ADEPT (&lt;a href="http://mysite.verizon.net/jimwu88/adept/"&gt;website&lt;/a&gt; and &lt;a href="http://myadeptblog.blogspot.com/"&gt;blog&lt;/a&gt;) when the "Example" button on the "&lt;a href="http://myadeptblog.blogspot.com/2009/11/special-pin-setup-window_11.html"&gt;Special Pin Setup&lt;/a&gt;" window is pressed.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug380.pdf#page=24&amp;amp;view=fit"&gt;Master Serial example&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug380.pdf#page=26&amp;amp;view=fit"&gt;Slave Serial example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug380.pdf#page=38&amp;amp;view=fit"&gt;Master SPI example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug380.pdf#page=46&amp;amp;view=fit"&gt;Master BPI example&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug380.pdf#page=30&amp;amp;view=fit"&gt;Master SelectMAP example&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug380.pdf#page=32&amp;amp;view=fit"&gt;Slave SelectMAP example&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug380.pdf#page=57&amp;amp;view=fit"&gt;JTAG example&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-2766562289058394854?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/2766562289058394854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2010/01/spartan6-configuration-examples.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/2766562289058394854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/2766562289058394854'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2010/01/spartan6-configuration-examples.html' title='Spartan6 Configuration Examples'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-6046234000663798398</id><published>2009-12-16T23:56:00.005-05:00</published><updated>2011-10-27T08:58:06.861-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysGen'/><category scheme='http://www.blogger.com/atom/ns#' term='HWCOSIM'/><title type='text'>SysGen: Create New HWCOSIM Target with NMM Ports</title><content type='html'>Hardware Co-Simulation (HWCOSIM) is a great feature in System Generator (SysGen) that allows users to run the full or part of a SysGen design on the FPGA and increase the simulation speed dramatically. SysGen already includes HWCOSIM plugins for commonly used DSP demo boards. Users can easily use the SysGen Board Description Builder (SBDBuilder) to create new HWCOSIM plugins for unsupported boards or unsupported features (for example non-memory mapped or NMM ports) on existing boards. Below are&amp;nbsp; step-by-step instructions on how to create a new HWCOSIM plugin with NMM ports using ML506 as an example.&lt;br /&gt;&lt;br /&gt;Step 1: Open "System Generator" properties window and select "New Compilation Target".&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Z-IGtacTmlg/SyqAvbSbUQI/AAAAAAAAAE0/w9djOyT0iiE/s1600-h/hwcosim_select_new_target.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/SyqAvbSbUQI/AAAAAAAAAE0/w9djOyT0iiE/s640/hwcosim_select_new_target.gif" width="492" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Step 2: The SBDBuilder window pops up. &lt;br /&gt;&lt;b&gt;Board Name&lt;/b&gt;: use a descriptive name so you know what the target is later.&lt;br /&gt;&lt;b&gt;System Clock Frequency/Pin Location&lt;/b&gt;: enter the actual clock frequency and pin location for your board.&lt;br /&gt;&lt;b&gt;JTAG Options Boundary Scan Position&lt;/b&gt;: the position of the target device in the JTAG chain. You can use IMPACT to help fill this in (see a snapshot below for the JTAG chain detected by IMPACT). As shown in the JTAG chain snapshot, the target device xc5vsx50t is the 5th in the chain.&lt;br /&gt;&lt;b&gt;JTAG Options IR Lengths: &lt;/b&gt;click the "Detect" button next to it auto-fill it.&lt;br /&gt;&lt;b&gt;Target Devices: &lt;/b&gt;click "Add" button to select the target device. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Z-IGtacTmlg/SyqBl9fP-RI/AAAAAAAAAFM/lWgHclnfkio/s1600-h/ml506_sbdbuilder.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/_Z-IGtacTmlg/SyqBl9fP-RI/AAAAAAAAAFM/lWgHclnfkio/s640/ml506_sbdbuilder.gif" width="564" /&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://2.bp.blogspot.com/_Z-IGtacTmlg/SyqDsXt8eXI/AAAAAAAAAFU/xl87mSPl79g/s1600-h/ml506_jtag_chain.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" src="http://2.bp.blogspot.com/_Z-IGtacTmlg/SyqDsXt8eXI/AAAAAAAAAFU/xl87mSPl79g/s640/ml506_jtag_chain.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Step 3: Click "Add" button in the "Non-Memory Mapped Ports" section to add NMM ports for HWCOSIM. This brings up the "Configure a Port" window below. Enter a port name, select port direction, Pin LOC and select PULLUP or PULLDOWN if needed. Click "Add Pin" button and the newly added pin will show up in the Pin List below. Click "Save and Start New" button if you want to add more pins or click "Save and Close" if you are done adding NMM ports. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Z-IGtacTmlg/SyqBIOXEOlI/AAAAAAAAAFE/XK6D9Xp-rC4/s1600-h/ml506_add_nmm.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="396" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/SyqBIOXEOlI/AAAAAAAAAFE/XK6D9Xp-rC4/s640/ml506_add_nmm.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Step 4: The SBDBuilder with all information entered is shown below. Click the "Install" button to install the new board configuration to the SysGen plugins directory. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Z-IGtacTmlg/SyqBl9fP-RI/AAAAAAAAAFM/lWgHclnfkio/s1600-h/ml506_sbdbuilder.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/_Z-IGtacTmlg/SyqBl9fP-RI/AAAAAAAAAFM/lWgHclnfkio/s640/ml506_sbdbuilder.gif" width="564" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Step 5: A window with tokens for the NMM ports will pop up once the installation is complete.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Z-IGtacTmlg/SyqHK4wQouI/AAAAAAAAAFc/qqi3K8wM5vQ/s1600-h/ml506_plugin_installation.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://4.bp.blogspot.com/_Z-IGtacTmlg/SyqHK4wQouI/AAAAAAAAAFc/qqi3K8wM5vQ/s640/ml506_plugin_installation.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Step 6: Save the library with the NMM port tokens and they can now be used in your SysGen model like any other SysGen block. A test model is shown below.&lt;br /&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://4.bp.blogspot.com/_Z-IGtacTmlg/SyqHmogN40I/AAAAAAAAAFk/NKFqCUH6Nfc/s1600-h/test_model_with_nmm.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="404" src="http://4.bp.blogspot.com/_Z-IGtacTmlg/SyqHmogN40I/AAAAAAAAAFk/NKFqCUH6Nfc/s640/test_model_with_nmm.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;Step 7: Open "System Generator" properties window again and now you should see the newly created board "ML506 JTAG NMM" in the HWCOSIM target list. Select it as the compilation target.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Z-IGtacTmlg/SyqIR9m2CcI/AAAAAAAAAF0/p1SsAxxx4R0/s1600-h/ml506_jtag_nmm_target.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_Z-IGtacTmlg/SyqIR9m2CcI/AAAAAAAAAF0/p1SsAxxx4R0/s640/ml506_jtag_nmm_target.gif" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Step 8: That's it. The rest of steps to use the new compilation target are the same as any other HWCOSIM. The only difference is that Simulink no longer has control/visibility of the two NMM ports. They are now implemented as IOs on FPGA. In this example, while the simulation is running, if you toggle the GPIO SW1 on the board, it will turn on/off the GPIO LED0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-6046234000663798398?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/6046234000663798398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2009/12/sysgen-create-new-hwcosim-target-with.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/6046234000663798398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/6046234000663798398'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2009/12/sysgen-create-new-hwcosim-target-with.html' title='SysGen: Create New HWCOSIM Target with NMM Ports'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/SyqAvbSbUQI/AAAAAAAAAE0/w9djOyT0iiE/s72-c/hwcosim_select_new_target.gif' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-7245076036381860849</id><published>2009-11-28T10:58:00.075-05:00</published><updated>2011-04-27T20:04:25.126-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysGen'/><category scheme='http://www.blogger.com/atom/ns#' term='fft'/><title type='text'>IFFT in System Generator</title><content type='html'>The FFT block in Xilinx Blockset can be used to calculate both DFT and IDFT because the two equations are almost identical: &lt;br /&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://3.bp.blogspot.com/_Z-IGtacTmlg/SxGtMu11lII/AAAAAAAAAD0/viKsG4rcEcY/s1600/fft_eqns.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_Z-IGtacTmlg/SxGtMu11lII/AAAAAAAAAD0/viKsG4rcEcY/s640/fft_eqns.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;By default, the FFT block is configured to calculate DFT. The setup and timing of control/data signals for IDFT are the same as DFT except for two things:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The FFT block needs to be set up for IDFT by setting fwd_inv_we signal to 1 and fwd_inv signal to 0 before the start of the transform&amp;nbsp;&lt;/li&gt;&lt;li&gt;The FFT output needs to be manually scaled to account for the factor &lt;b&gt;1/N&lt;/b&gt; in Equation 2 above. The scaling can be done either by using the scaling schedule input or shifting the FFT output if the FFT block is set to "unscaled".&lt;/li&gt;&lt;/ol&gt;The picture below shows the timing of control/data signals at the beginning of a data frame.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Z-IGtacTmlg/SxG811BUDCI/AAAAAAAAAD8/4GoPs3FVAgg/s1600/fft_timing.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_Z-IGtacTmlg/SxG811BUDCI/AAAAAAAAAD8/4GoPs3FVAgg/s640/fft_timing.gif" /&gt;&lt;/a&gt;&lt;/div&gt;Now let's use a simple 8-point IDFT example to show how everything is put together. Below is the IDFT calculation of a test vector xn_re in Matlab:&lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt;xn_re=[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8];&lt;br /&gt;&amp;gt;&amp;gt;ifft(xn_re)&lt;br /&gt;ans =&lt;br /&gt;Columns 1 through 5&lt;br /&gt;0.4500  -0.0500-0.1207i  -0.0500-0.0500i  -0.0500-0.0207i 0.0500          &lt;br /&gt;&lt;br /&gt;Columns 6 through 8&lt;br /&gt;-0.0500+0.0207i  -0.0500+0.0500i  -0.0500+0.1207i&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/jimw567/home/ifft_test.mdl"&gt;The idft_test simulink/sysgen model for the 8-point can be downloaded here.&lt;/a&gt; The model includes a block called &lt;b&gt;WaveScope&lt;/b&gt;, which is a "hidden" gem in System Generator for debugging SysGen designs, especially for hardware engineers who are used to viewing waveforms in HDL simulators.&lt;br /&gt;&lt;br /&gt;The picture below shows the waveform at the beginning of the simulation in Wavescope. fwd_inv_we=1 and fwd_inv=0 for 1 cycle to set up the block for IDFT. Also the scale_sch is set to "010101" at the beginning to scale the FFT result down by 8 (the 1/N factor in Equation 2).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Z-IGtacTmlg/SxHBU-_EeuI/AAAAAAAAAEE/RYqqMV_7WgA/s1600/ifft_wavescope_start.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_Z-IGtacTmlg/SxHBU-_EeuI/AAAAAAAAAEE/RYqqMV_7WgA/s640/ifft_wavescope_start.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The picture below shows the waveform in Wavescope at the end of simulation, which shows that the xk_re and xk_im outputs when dv=1 match the Matlab results above when taking the quantization errors into account.&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/_Z-IGtacTmlg/SxHBhvjgZiI/AAAAAAAAAEM/B9ng1Q8ua3c/s1600/ifft_wavescope_end.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_Z-IGtacTmlg/SxHBhvjgZiI/AAAAAAAAAEM/B9ng1Q8ua3c/s640/ifft_wavescope_end.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-7245076036381860849?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/7245076036381860849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2009/11/ifft-in-system-generator.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7245076036381860849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7245076036381860849'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2009/11/ifft-in-system-generator.html' title='IFFT in System Generator'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/SxGtMu11lII/AAAAAAAAAD0/viKsG4rcEcY/s72-c/fft_eqns.gif' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-1531707995893628237</id><published>2009-11-24T21:39:00.054-05:00</published><updated>2011-10-29T12:52:56.872-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Really impressed with 7-Zip</title><content type='html'>&lt;b&gt;Update Aug 20, 2011&lt;/b&gt;:&amp;nbsp; Just found out that 7-Zip can also extract CD/DVD image files (.iso). Nice! Below are all the file formats it supports:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Packing / unpacking: 7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM&lt;/li&gt;&lt;li&gt;Unpacking only: ARJ, CAB, CHM, CPIO, CramFS, DEB, DMG, FAT, HFS, ISO, LZH, LZMA,                        MBR, MSI, NSIS, NTFS, RAR, RPM, SquashFS, UDF, VHD, WIM, XAR and Z.&lt;/li&gt;&lt;/ul&gt;I have been using Winzip to compress files for as long as I can remember. One of my colleagues mentioned another compression tool called &lt;a href="http://download.cnet.com/7-Zip/3000-2250_4-10045185.html?tag=mncol;pop"&gt;7-Zip&lt;/a&gt; to me a couple of weeks ago and I am really impressed with the high compression ratio achieved by 7-Zip. Besides it's free and supports all compression file formats (.zip, .rar, .gz, .7z) that I know of. Below is a chart that compares the compressed file sizes between Winzip 10 and 7-Zip 4.65 on several files that I use for my daily work:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" style="width: 614px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;File&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Uncompressed &lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;.zip&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;.7z&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%smaller&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug365.pdf"&gt;Virtex-6 UG365&lt;/a&gt;&lt;/td&gt;  &lt;td&gt;&lt;br /&gt;15.8MB&lt;/td&gt;  &lt;td&gt;5.4MB&lt;/td&gt;&lt;td&gt;4MB&lt;/td&gt;&lt;td&gt;26%&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;&lt;a href="http://mysite.verizon.net/jimwu88/adept/"&gt;ADEPT 0.38.6&lt;/a&gt;&lt;/td&gt; &lt;td&gt;12.6MB&lt;/td&gt;&lt;td&gt;5.3MB&lt;/td&gt;&lt;td&gt;4.4MB&lt;/td&gt;&lt;td&gt;17%&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.xilinx.com/products/boards/sp601/reference_designs.htm"&gt;SP601 Base Reference Design rdf0003 &lt;/a&gt;&lt;/td&gt;&lt;td&gt;56.3MB&lt;/td&gt;&lt;td&gt;17.5MB&lt;/td&gt;&lt;td&gt;10MB&lt;/td&gt;&lt;td&gt;43%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-1531707995893628237?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/1531707995893628237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2009/11/really-impressed-with-7-zip.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/1531707995893628237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/1531707995893628237'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2009/11/really-impressed-with-7-zip.html' title='Really impressed with 7-Zip'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-9158739671129331496</id><published>2009-10-27T05:40:00.006-04:00</published><updated>2011-10-29T12:53:09.382-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='implmentation'/><title type='text'>Don't optimize my LUT please!</title><content type='html'>Sometimes  you manually instantiate a LUT primitive (e.g. LUT6_2) to add routing delays to the signal path or precisely control the routing resources used but only to find out that the tool either optimizes it out or swaps pins. This can be prevented by using the LOCK_PINS and SAVE NET FLAG (S) constraints (&lt;a href="http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/cgd.pdf"&gt;Xilinx Constrants Guide&lt;/a&gt;). Below are the code snippets for Verilog and VHDL that work in ISE 11.3:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Verilog&lt;/b&gt; &lt;b&gt;Example&lt;/b&gt; (&lt;a href="https://sites.google.com/site/jimw567/home/luts_vlog.v"&gt;download luts_vlog.v&lt;/a&gt;):&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;(* S="TRUE" *)&lt;/b&gt; reg [5:0]&amp;nbsp; lut_in_r;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(* LOCK_PINS="ALL", BEL="A6LUT" *) &lt;/span&gt;&lt;/b&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;LUT6_2 #(&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .INIT (64'h0000_0000_0000_0001)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;) LUT_U0 (&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .I0 (lut_in_r[0]), &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .I1 (lut_in_r[1]), &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .I2 (lut_in_r[2]), &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .I3 (lut_in_r[3]), &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .I4 (lut_in_r[4]), &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .I5 (1'b1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .O5 (lut_out5_d ),&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .O6 (lut_out6_d )&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;);&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;VHDL Example &lt;/b&gt;(&lt;a href="https://sites.google.com/site/jimw567/home/luts_vhd.vhd"&gt;download luts_vhd.vhd&lt;/a&gt;):&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;"&gt;attribute &lt;b&gt;LOCK_PINS&lt;/b&gt; : string;&lt;br /&gt;attribute &lt;b&gt;BEL&amp;nbsp;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : string;&lt;br /&gt;attribute &lt;b&gt;S&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : string;&lt;br /&gt;attribute &lt;b&gt;BEL&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; of LUT_U0&amp;nbsp;&amp;nbsp; : label&amp;nbsp; is &lt;b&gt;"A6LUT"&lt;/b&gt;;&lt;br /&gt;attribute &lt;b&gt;LOCK_PINS&lt;/b&gt; of LUT_U0&amp;nbsp;&amp;nbsp; : label&amp;nbsp; is &lt;b&gt;"ALL"&lt;/b&gt;;&lt;br /&gt;attribute &lt;b&gt;S&amp;nbsp;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; of lut_in_r : signal is &lt;b&gt;"TRUE"&lt;/b&gt;;&lt;br /&gt;&lt;br /&gt;LUT_U0: LUT6_2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; generic map (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INIT =&amp;gt; X"0000000000000001"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; port map (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I0 =&amp;gt; lut_in_r(0), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I1 =&amp;gt; lut_in_r(1), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2 =&amp;gt; lut_in_r(2), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I3 =&amp;gt; lut_in_r(3), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I4 =&amp;gt; lut_in_r(4), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I5 =&amp;gt; '1',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; O5 =&amp;gt; lut_out5_d,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; O6 =&amp;gt; lut_out6_d&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; );&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;After synthesis, you should see messages like below showing that XST picked up the design constraints:&lt;br /&gt;&lt;span style="font-family: 'Courier New';"&gt;    Set user-defined property "S =  TRUE" for signal &lt;lut_in_r&gt;.&lt;/lut_in_r&gt;&lt;/span&gt; &lt;br /&gt;&lt;pre style="font-family: 'Courier New'; margin: 0px; text-indent: 0px;"&gt;Set user-defined property "BEL =  A6LUT" for instance &lt;lut_u0&gt; in unit &lt;luts_vhd&gt;.&lt;/luts_vhd&gt;&lt;/lut_u0&gt;&lt;/pre&gt;&lt;pre style="font-family: 'Courier New'; margin: 0px; text-indent: 0px;"&gt;Set user-defined property "LOCK_PINS =  ALL" for instance &lt;lut_u0&gt; in unit &lt;luts_vhd&gt;.&lt;/luts_vhd&gt;&lt;/lut_u0&gt;&lt;/pre&gt;&lt;pre style="font-family: 'Courier New'; margin: 0px; text-indent: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;After the implementation is done, open the design in FPGA_EDITOR and check that the placement of the LUT and the pin order match the source code. Below is a snapshot of what it looks like for the example above:&lt;br /&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://2.bp.blogspot.com/_Z-IGtacTmlg/SuYEv_CyoCI/AAAAAAAAAC0/CQMisZpgwYk/s1600-h/luts_lockpins.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_Z-IGtacTmlg/SuYEv_CyoCI/AAAAAAAAAC0/CQMisZpgwYk/s320/luts_lockpins.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-9158739671129331496?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/9158739671129331496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2009/10/dont-optimize-my-lut-please.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/9158739671129331496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/9158739671129331496'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2009/10/dont-optimize-my-lut-please.html' title='Don&apos;t optimize my LUT please!'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/SuYEv_CyoCI/AAAAAAAAAC0/CQMisZpgwYk/s72-c/luts_lockpins.gif' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-7059258011172143981</id><published>2009-10-11T16:19:00.001-04:00</published><updated>2009-10-11T16:21:46.247-04:00</updated><title type='text'>Wait, what about DDR OFFSET IN/OUT using DCM clock with phase shift?</title><content type='html'>I recently wrote two blogs about DDR OFFSET constraints:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://myfpgablog.blogspot.com/2009/10/offset-in-constraints-for-source.html"&gt;OFFSET IN constraints for source synchronous DDR inputs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://myfpgablog.blogspot.com/2009/10/ddr-offset-inout-constraints-with-dcm.html"&gt;DDR OFFSET IN/OUT constraints with DCM&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Looks like I'm going to make a career out of talking about the OFFSET constraints on DDR IOs ;).&amp;nbsp; Here comes another one on DDR IOs clocked by DCM clock with phase shift.&lt;br /&gt;&lt;br /&gt;The design example used here is exactly the same as in&lt;a href="http://myfpgablog.blogspot.com/2009/10/ddr-offset-inout-constraints-with-dcm.html"&gt; DDR OFFSET IN/OUT constraints with DCM&lt;/a&gt; except that a 30 degree phase shift is added to the DCM CLK0 output. The clock period in this example is 20ns, so 30 degrees phase shift translates to ~1.7ns (20ns*30/360). The timing reports on the OFFSET constraints are almost the same. The only difference is that now a ~1.7ns delay added to the time when the clock rising and falling edges.&lt;br /&gt;&lt;br /&gt;Below are the timing reports showing the effect of the 30 degree (or 1.7ns) phase shift (highlighted in red) from the DCM:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Timing constraint: TIMEGRP "TN_ddr_in_pads" OFFSET = IN 5 ns VALID 10 ns BEFORE COMP "clk_i"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "RISING";&lt;/b&gt;&lt;br /&gt;&amp;nbsp;1 path analyzed, 1 endpoint analyzed, 0 failing endpoints&lt;br /&gt;&amp;nbsp;0 timing errors detected. (0 setup errors, 0 hold errors)&lt;br /&gt;&amp;nbsp;Minimum allowable offset is&amp;nbsp;&amp;nbsp; 2.718ns.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Slack (setup path):&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.282ns (requirement - (data path - clock path - clock arrival + uncertainty))&lt;br /&gt;&amp;nbsp; Source:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ddr_d_i (PAD)&lt;br /&gt;&amp;nbsp; Destination:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IDDR2_inst (FF)&lt;br /&gt;&amp;nbsp; &lt;b&gt;Destination Clock:&amp;nbsp;&amp;nbsp;&amp;nbsp; clk1 rising at &lt;span style="color: red;"&gt;1.641ns&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; Requirement:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5.000ns&lt;br /&gt;&amp;nbsp; Data Path Delay:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.724ns (Levels of Logic = 2)&lt;br /&gt;&amp;nbsp; Clock Path Delay:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -1.515ns (Levels of Logic = 4)&lt;br /&gt;&amp;nbsp; Clock Uncertainty:&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.120ns&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Timing constraint:&amp;nbsp; TIMEGRP "TN_ddr_in_pads" OFFSET = IN 5 ns VALID 10 ns BEFORE COMP "clk_i"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "FALLING"; &lt;/b&gt;&lt;br /&gt;&amp;nbsp;1 path analyzed, 1 endpoint analyzed, 0 failing endpoints&lt;br /&gt;&amp;nbsp;0 timing errors detected. (0 setup errors, 0 hold errors)&lt;br /&gt;&amp;nbsp;Minimum allowable offset is&amp;nbsp;&amp;nbsp; 2.729ns.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Slack (setup path):&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.271 ns (requirement - (data path - clock path - clock arrival + uncertainty))&lt;br /&gt;&amp;nbsp; Source:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ddr_d_i&amp;nbsp; (PAD)&lt;br /&gt;&amp;nbsp; Destination:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IDDR2_inst&amp;nbsp; (FF)&lt;br /&gt;&amp;nbsp; &lt;b&gt;Destination Clock:&amp;nbsp;&amp;nbsp;&amp;nbsp; clk1 falling at &lt;span style="color: red;"&gt;1.641&lt;/span&gt;ns&lt;/b&gt;&lt;br /&gt;&amp;nbsp; Requirement:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5.000ns&lt;br /&gt;&amp;nbsp; Data Path Delay:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.724ns (Levels of Logic = 2)&lt;br /&gt;&amp;nbsp; Clock Path Delay:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -1.526ns (Levels of Logic = 4)&lt;br /&gt;&amp;nbsp; Clock Uncertainty:&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.120ns&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;b&gt;Timing constraint:&amp;nbsp; TIMEGRP "TN_ddr_out_pads" OFFSET = OUT 8 ns AFTER COMP "clk_i" "RISING"; &lt;/b&gt;&lt;br /&gt;&amp;nbsp;1 path analyzed, 1 endpoint analyzed, 0 failing endpoints&lt;br /&gt;&amp;nbsp;0 timing errors detected.&lt;br /&gt;&amp;nbsp;Minimum allowable offset is&amp;nbsp;&amp;nbsp; 6.846ns.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Slack (slowest paths):&amp;nbsp;&amp;nbsp; 1.154 ns (requirement - (clock arrival + clock path + data path + uncertainty))&lt;br /&gt;&amp;nbsp; Source:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ODDR2_inst&amp;nbsp; (FF)&lt;br /&gt;&amp;nbsp; Destination:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ddr_d_o&amp;nbsp; (PAD)&lt;br /&gt;&amp;nbsp; &lt;b&gt;Source Clock:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clk1 rising at &lt;span style="color: red;"&gt;1.641&lt;/span&gt;ns&lt;/b&gt;&lt;br /&gt;&amp;nbsp; Requirement:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8.000ns&lt;br /&gt;&amp;nbsp; Data Path Delay:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.561ns (Levels of Logic = 1)&lt;br /&gt;&amp;nbsp; Clock Path Delay:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.524ns (Levels of Logic = 4)&lt;br /&gt;&amp;nbsp; Clock Uncertainty:&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.120ns&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Timing constraint:&amp;nbsp; TIMEGRP "TN_ddr_out_pads" OFFSET = OUT 8 ns AFTER COMP "clk_i" "FALLING"; &lt;/b&gt;&lt;br /&gt;&amp;nbsp;1 path analyzed, 1 endpoint analyzed, 0 failing endpoints&lt;br /&gt;&amp;nbsp;0 timing errors detected.&lt;br /&gt;&amp;nbsp;Minimum allowable offset is&amp;nbsp;&amp;nbsp; 6.850ns.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Slack (slowest paths):&amp;nbsp;&amp;nbsp; 1.150 ns (requirement - (clock arrival + clock path + data path + uncertainty))&lt;br /&gt;&amp;nbsp; Source:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ODDR2_inst&amp;nbsp; (FF)&lt;br /&gt;&amp;nbsp; Destination:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ddr_d_o&amp;nbsp; (PAD)&lt;br /&gt;&amp;nbsp; &lt;b&gt;Source Clock:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clk1 falling at&lt;span style="color: red;"&gt; 1.641&lt;/span&gt;ns&lt;/b&gt;&lt;br /&gt;&amp;nbsp; Requirement:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8.000ns&lt;br /&gt;&amp;nbsp; Data Path Delay:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.579ns (Levels of Logic = 1)&lt;br /&gt;&amp;nbsp; Clock Path Delay:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.510ns (Levels of Logic = 4)&lt;br /&gt;&amp;nbsp; Clock Uncertainty:&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.120ns&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-7059258011172143981?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/7059258011172143981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2009/10/wait-what-about-ddr-offset-inout-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7059258011172143981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/7059258011172143981'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2009/10/wait-what-about-ddr-offset-inout-using.html' title='Wait, what about DDR OFFSET IN/OUT using DCM clock with phase shift?'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-5863126204202839988</id><published>2009-10-11T15:29:00.005-04:00</published><updated>2009-10-11T22:25:29.766-04:00</updated><title type='text'>DDR OFFSET IN/OUT constraints with DCM</title><content type='html'>&lt;a href="http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/ug612.pdf"&gt;UG612: Xilinx Timing Constraints User Guide&lt;/a&gt; shows two options to constrain the OFFSET for DDR inputs and outputs. The option 1 is how OFFSET values for DDR IOs are constrained in ISE 9.x and earlier versions. Although it still works in the latest ISE versions (i.e. 10.x and 11.x), but it has always been difficult and painful to use because of a couple of reasons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The offset values in the OFFSET constraints for the falling edge need to be manually adjusted as the reference point (i.e. time 0) is always the rising edge of the clock.&amp;nbsp;&lt;/li&gt;&lt;li&gt;If the clock for the DDR IOs comes from a DCM, you need to watch out in the ngdbuild report for the TIMESPEC on the DCM input clock not propagated through the DCM due the TNM used in more than one constraint. &lt;/li&gt;&lt;/ul&gt;With that, I highly recommend the option 2 for people using the latest IDS. Below is a Spartan6 example with IDDR, ODDR, and DCM: &lt;br /&gt;&lt;br /&gt;Design top level:&lt;br /&gt;&lt;pre&gt;module ss_ddr (&lt;br /&gt;     input  clk_i,&lt;br /&gt;     input  rst_i,&lt;br /&gt;     input  ddr_d_i,&lt;br /&gt;     output ddr_d_o&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;wire clk0, clk180;&lt;br /&gt;wire clkgen1_locked;&lt;br /&gt;wire d_rising_d, d_falling_d;&lt;br /&gt;reg d_rising_r, d_falling_r;&lt;br /&gt;&lt;br /&gt;clkgen_dcm clkgen1 (&lt;br /&gt;   // Clock in ports&lt;br /&gt;  .CLK_IN1 (clk_i),&lt;br /&gt;  // Clock out ports&lt;br /&gt;  .CLK_OUT1 (clk1),&lt;br /&gt;  .CLK_OUT2 (clk2),&lt;br /&gt;  // Status and control signals&lt;br /&gt;  .RESET    (rst_i),&lt;br /&gt;  .LOCKED   (clkgen1_locked)&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;assign clk0 = clk1;&lt;br /&gt;assign clk180 = ~clk1;&lt;br /&gt;    &lt;br /&gt;IDDR2 #(&lt;br /&gt;   .DDR_ALIGNMENT ("NONE"), // Sets output alignment to "NONE", "C0" or "C1" &lt;br /&gt;   .INIT_Q0       (1'b0), // Sets initial state of the Q0 output to 1'b0 or 1'b1&lt;br /&gt;   .INIT_Q1       (1'b0), // Sets initial state of the Q1 output to 1'b0 or 1'b1&lt;br /&gt;   .SRTYPE        ("SYNC") // Specifies "SYNC" or "ASYNC" set/reset&lt;br /&gt;) IDDR2_inst (&lt;br /&gt;   .Q0 (d_rising_d), // 1-bit output captured with C0 clock&lt;br /&gt;   .Q1 (d_falling_d), // 1-bit output captured with C1 clock&lt;br /&gt;   .C0 (clk0), // 1-bit clock input&lt;br /&gt;   .C1 (clk180), // 1-bit clock input&lt;br /&gt;   .CE (1'b1), // 1-bit clock enable input&lt;br /&gt;   .D  (ddr_d_i),   // 1-bit DDR data input&lt;br /&gt;   .R  (1'b0),   // 1-bit reset input&lt;br /&gt;   .S  (1'b0)    // 1-bit set input&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;always @(posedge clk0)&lt;br /&gt;    d_rising_r &amp;lt;= d_rising_d;&lt;br /&gt;&lt;br /&gt;always @(posedge clk180)&lt;br /&gt;    d_falling_r &amp;lt;= d_falling_d;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ODDR2 #(&lt;br /&gt;      .DDR_ALIGNMENT ("NONE"), // Sets output alignment to "NONE", "C0" or "C1" &lt;br /&gt;      .INIT          (1'b0),    // Sets initial state of the Q output to 1'b0 or 1'b1&lt;br /&gt;      .SRTYPE        ("SYNC") // Specifies "SYNC" or "ASYNC" set/reset&lt;br /&gt;   ) ODDR2_inst (&lt;br /&gt;      .Q  (ddr_d_o),   // 1-bit DDR output data&lt;br /&gt;      .C0 (clk0),   // 1-bit clock input&lt;br /&gt;      .C1 (clk180),   // 1-bit clock input&lt;br /&gt;      .CE (1'b1), // 1-bit clock enable input&lt;br /&gt;      .D0 (d_rising_r), // 1-bit data input (associated with C0)&lt;br /&gt;      .D1 (d_falling_r), // 1-bit data input (associated with C1)&lt;br /&gt;      .R  (1'b0),   // 1-bit reset input&lt;br /&gt;      .S  (1'b0)    // 1-bit set input&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;endmodule                  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;UCF constraints: &lt;/b&gt;&lt;br /&gt;&lt;pre&gt;NET "clk_i" TNM_NET = "TN_clk_i";&lt;br /&gt;TIMESPEC TS_clk_i = PERIOD "TN_clk_i" 20 ns HIGH 50%;&lt;br /&gt;&lt;br /&gt;#UG612: Option 2&lt;br /&gt;INST "ddr_d_i" TNM = TN_ddr_in_pads;&lt;br /&gt;TIMEGRP "TN_ddr_in_pads" OFFSET = IN 5 ns VALID 10 ns BEFORE "clk_i" RISING;&lt;br /&gt;TIMEGRP "TN_ddr_in_pads" OFFSET = IN 5 ns VALID 10 ns BEFORE "clk_i" FALLING;&lt;br /&gt;&lt;br /&gt;INST "ddr_d_o" TNM = TN_ddr_out_pads;&lt;br /&gt;TIMEGRP "TN_ddr_out_pads" OFFSET = OUT 8 ns AFTER "clk_i" RISING;&lt;br /&gt;TIMEGRP "TN_ddr_out_pads" OFFSET = OUT 8 ns AFTER "clk_i" FALLING;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Timing reports: &lt;/b&gt;(only OFFSET OUT reports are shown below. Please check &lt;a href="http://myfpgablog.blogspot.com/2009/10/offset-in-constraints-for-source.html"&gt;this older blog&lt;/a&gt; for the OFFSET IN reports)&lt;br /&gt;&lt;pre&gt;Timing constraint: TIMEGRP "TN_ddr_out_pads" OFFSET = OUT 8 ns AFTER COMP "clk_i" "RISING";&lt;br /&gt; 1 path analyzed, 1 endpoint analyzed, 0 failing endpoints&lt;br /&gt; 0 timing errors detected.&lt;br /&gt; Minimum allowable offset is   5.205ns.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Slack (slowest paths):  2.795ns (requirement - (clock arrival + clock path + data path + uncertainty))&lt;br /&gt;  Source:               ODDR2_inst (FF)&lt;br /&gt;  Destination:          ddr_d_o (PAD)&lt;br /&gt;  Source Clock:         clk1 rising at 0.000ns&lt;br /&gt;  Requirement:          8.000ns&lt;br /&gt;  Data Path Delay:      3.561ns (Levels of Logic = 1)&lt;br /&gt;  Clock Path Delay:     1.524ns (Levels of Logic = 4)&lt;br /&gt;  Clock Uncertainty:    0.120ns&lt;br /&gt;&lt;br /&gt;  Clock Uncertainty:          0.120ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE&lt;br /&gt;    Total System Jitter (TSJ):  0.000ns&lt;br /&gt;    Total Input Jitter (TIJ):   0.000ns&lt;br /&gt;    Discrete Jitter (DJ):       0.120ns&lt;br /&gt;    Phase Error (PE):           0.060ns&lt;br /&gt;&lt;br /&gt;  Maximum Clock Path: clk_i to ODDR2_inst&lt;br /&gt;    Location             Delay type         Delay(ns)  Logical Resource(s)&lt;br /&gt;    -------------------------------------------------  -------------------&lt;br /&gt;    N4.I                 Tiopi                 1.140   clk_i&lt;br /&gt;                                                       clkgen1/clkin1_buf&lt;br /&gt;                                                       ProtoComp0.IMUX&lt;br /&gt;    BUFIO2_X1Y15.I       net (fanout=1)        0.418   clkgen1/clkin1&lt;br /&gt;    BUFIO2_X1Y15.DIVCLK  Tbufcko_DIVCLK        0.070   SP6_BUFIO_INSERT_ML_BUFIO2_5&lt;br /&gt;    DCM_X0Y1.CLKIN       net (fanout=1)        0.854   clkgen1/dcm_sp_inst_ML_NEW_DIVCLK&lt;br /&gt;    DCM_X0Y1.CLK0        Tdmcko_CLK           -3.868   clkgen1/dcm_sp_inst&lt;br /&gt;    BUFGMUX_X2Y3.I0      net (fanout=1)        0.943   clkgen1/clk0&lt;br /&gt;    BUFGMUX_X2Y3.O       Tgi0o                 0.239   clkgen1/clkout1_buf&lt;br /&gt;    OLOGIC_X0Y10.CLK0    net (fanout=7)        1.728   clk1&lt;br /&gt;    -------------------------------------------------  ---------------------------&lt;br /&gt;    Total                                      1.524ns (-2.419ns logic, 3.943ns route)&lt;br /&gt;&lt;br /&gt;  Maximum Data Path: ODDR2_inst to ddr_d_o&lt;br /&gt;    Location             Delay type         Delay(ns)  Logical Resource(s)&lt;br /&gt;    -------------------------------------------------  -------------------&lt;br /&gt;    OLOGIC_X0Y10.OQ      Tockq                 0.775   ODDR2_inst&lt;br /&gt;    V3.O                 net (fanout=1)        0.296   ddr_d_o_OBUF&lt;br /&gt;    V3.PAD               Tioop                 2.490   ddr_d_o_OBUF&lt;br /&gt;                                                       ddr_d_o&lt;br /&gt;    -------------------------------------------------  ---------------------------&lt;br /&gt;    Total                                      3.561ns (3.265ns logic, 0.296ns route)&lt;br /&gt;                                                       (91.7% logic, 8.3% route)&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;iming constraint: TIMEGRP "TN_ddr_out_pads" OFFSET = OUT 8 ns AFTER COMP "clk_i" "FALLING";&lt;br /&gt; 1 path analyzed, 1 endpoint analyzed, 0 failing endpoints&lt;br /&gt; 0 timing errors detected.&lt;br /&gt; Minimum allowable offset is   5.209ns.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Slack (slowest paths):  2.791ns (requirement - (clock arrival + clock path + data path + uncertainty))&lt;br /&gt;  Source:               ODDR2_inst (FF)&lt;br /&gt;  Destination:          ddr_d_o (PAD)&lt;br /&gt;  Source Clock:         clk1 falling at 0.000ns&lt;br /&gt;  Requirement:          8.000ns&lt;br /&gt;  Data Path Delay:      3.579ns (Levels of Logic = 1)&lt;br /&gt;  Clock Path Delay:     1.510ns (Levels of Logic = 4)&lt;br /&gt;  Clock Uncertainty:    0.120ns&lt;br /&gt;&lt;br /&gt;  Clock Uncertainty:          0.120ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE&lt;br /&gt;    Total System Jitter (TSJ):  0.000ns&lt;br /&gt;    Total Input Jitter (TIJ):   0.000ns&lt;br /&gt;    Discrete Jitter (DJ):       0.120ns&lt;br /&gt;    Phase Error (PE):           0.060ns&lt;br /&gt;&lt;br /&gt;  Maximum Clock Path: clk_i to ODDR2_inst&lt;br /&gt;    Location             Delay type         Delay(ns)  Logical Resource(s)&lt;br /&gt;    -------------------------------------------------  -------------------&lt;br /&gt;    N4.I                 Tiopi                 1.140   clk_i&lt;br /&gt;                                                       clkgen1/clkin1_buf&lt;br /&gt;                                                       ProtoComp0.IMUX&lt;br /&gt;    BUFIO2_X1Y15.I       net (fanout=1)        0.418   clkgen1/clkin1&lt;br /&gt;    BUFIO2_X1Y15.DIVCLK  Tbufcko_DIVCLK        0.070   SP6_BUFIO_INSERT_ML_BUFIO2_5&lt;br /&gt;    DCM_X0Y1.CLKIN       net (fanout=1)        0.854   clkgen1/dcm_sp_inst_ML_NEW_DIVCLK&lt;br /&gt;    DCM_X0Y1.CLK0        Tdmcko_CLK           -3.868   clkgen1/dcm_sp_inst&lt;br /&gt;    BUFGMUX_X2Y3.I0      net (fanout=1)        0.943   clkgen1/clk0&lt;br /&gt;    BUFGMUX_X2Y3.O       Tgi0o                 0.239   clkgen1/clkout1_buf&lt;br /&gt;    OLOGIC_X0Y10.CLK1    net (fanout=7)        1.714   clk1&lt;br /&gt;    -------------------------------------------------  ---------------------------&lt;br /&gt;    Total                                      1.510ns (-2.419ns logic, 3.929ns route)&lt;br /&gt;&lt;br /&gt;  Maximum Data Path: ODDR2_inst to ddr_d_o&lt;br /&gt;    Location             Delay type         Delay(ns)  Logical Resource(s)&lt;br /&gt;    -------------------------------------------------  -------------------&lt;br /&gt;    OLOGIC_X0Y10.OQ      Tockq                 0.793   ODDR2_inst&lt;br /&gt;    V3.O                 net (fanout=1)        0.296   ddr_d_o_OBUF&lt;br /&gt;    V3.PAD               Tioop                 2.490   ddr_d_o_OBUF&lt;br /&gt;                                                       ddr_d_o&lt;br /&gt;    -------------------------------------------------  ---------------------------&lt;br /&gt;    Total                                      3.579ns (3.283ns logic, 0.296ns route)&lt;br /&gt;                                                       (91.7% logic, 8.3% route)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;OK, I know this blog is long, but here comes the reward for those who stick around: &lt;a href="http://my-design-space.googlegroups.com/web/ss_ddr.zip?gda=DkkztT0AAAC3W4jbnuJvUjQN3-GQDtyNnnN6ttQcB3WZZ2LAlI-8I_ZQKjgk8C2PJ83Z0RFu0HXlNv--OykrTYJH3lVGu2Z5&amp;amp;gsc=NQwSWwsAAADWbRyGt5g3pzoU7yvdEEB4"&gt; the complete ISE project targeting Spartan6 6slx45t is available for download here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-5863126204202839988?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/5863126204202839988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2009/10/ddr-offset-inout-constraints-with-dcm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/5863126204202839988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/5863126204202839988'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2009/10/ddr-offset-inout-constraints-with-dcm.html' title='DDR OFFSET IN/OUT constraints with DCM'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-4083646524898538445</id><published>2009-10-05T22:38:00.010-04:00</published><updated>2009-10-11T08:34:44.814-04:00</updated><title type='text'>OFFSET IN constraints for source synchronous DDR inputs</title><content type='html'>There are several ways to set up OFFSET IN constraints for source synchronous DDR inputs. Personally I like to put all inputs into a timing group and add OFFSET IN constraint on the timing group. There are several advantages with this method:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Inputs with different names can be easily grouped together.&lt;/li&gt;&lt;li&gt;Only one (SDR) or two (DDR) OFFSET IN constraints are required for each timing group.&lt;/li&gt;&lt;li&gt;Timing report is more concise because of fewer OFFSET IN constraints required.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Below is a Spartan6 design example with just one IDDR2 primitive instantiated:&lt;br /&gt;&lt;pre&gt;module ss_ddr_in (&lt;br /&gt;     input  clk_i,&lt;br /&gt;     input  ddr_d_i,&lt;br /&gt;     output d_rising_o,&lt;br /&gt;     output d_falling_o&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;wire clk0, clk180;&lt;br /&gt;&lt;br /&gt;assign clk0 = clk_i;&lt;br /&gt;assign clk180 = ~clk_i;&lt;br /&gt;    &lt;br /&gt;IDDR2 #(&lt;br /&gt;   .DDR_ALIGNMENT ("NONE"), // Sets output alignment to "NONE", "C0" or "C1" &lt;br /&gt;   .INIT_Q0       (1'b0), // Sets initial state of the Q0 output to 1'b0 or 1'b1&lt;br /&gt;   .INIT_Q1       (1'b0), // Sets initial state of the Q1 output to 1'b0 or 1'b1&lt;br /&gt;   .SRTYPE        ("SYNC") // Specifies "SYNC" or "ASYNC" set/reset&lt;br /&gt;) IDDR2_inst (&lt;br /&gt;   .Q0 (d_rising_o), // 1-bit output captured with C0 clock&lt;br /&gt;   .Q1 (d_falling_o), // 1-bit output captured with C1 clock&lt;br /&gt;   .C0 (clk0), // 1-bit clock input&lt;br /&gt;   .C1 (clk180), // 1-bit clock input&lt;br /&gt;   .CE (1'b1), // 1-bit clock enable input&lt;br /&gt;   .D  (ddr_d_i),   // 1-bit DDR data input&lt;br /&gt;   .R  (1'b0),   // 1-bit reset input&lt;br /&gt;   .S  (1'b0)    // 1-bit set input&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;endmodule&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Below are UCF constraints for the data input. &lt;/b&gt;&lt;br /&gt;&lt;pre&gt;NET "clk_i" TNM_NET = clk_i;&lt;br /&gt;TIMESPEC TS_clk_i = PERIOD "clk_i" 20 ns HIGH 50%;&lt;br /&gt;&lt;br /&gt;INST "ddr_d_i" TNM = TN_ddr_in_pads;&lt;br /&gt;TIMEGRP "TN_ddr_in_pads" OFFSET = IN 5 ns VALID 10 ns BEFORE "clk_i" RISING;&lt;br /&gt;TIMEGRP "TN_ddr_in_pads" OFFSET = IN 5 ns VALID 10 ns BEFORE "clk_i" FALLING;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Timing report on the OFFSET constraints:&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;Timing constraint: TIMEGRP "TN_ddr_in_pads" OFFSET = IN 5 ns VALID 10 ns BEFORE COMP "clk_i"         "RISING";&lt;br /&gt; 1 path analyzed, 1 endpoint analyzed, 0 failing endpoints&lt;br /&gt; 0 timing errors detected. (0 setup errors, 0 hold errors)&lt;br /&gt; Offset is  -0.666ns.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Slack (setup path):     5.666ns (requirement - (data path - clock path - clock arrival + uncertainty))&lt;br /&gt;  Source:               ddr_d_i (PAD)&lt;br /&gt;  Destination:          IDDR2_inst (FF)&lt;br /&gt;  Destination Clock:    clk_i_BUFGP rising at 0.000ns&lt;br /&gt;  Requirement:          5.000ns&lt;br /&gt;  Data Path Delay:      2.724ns (Levels of Logic = 2)&lt;br /&gt;  Clock Path Delay:     3.390ns (Levels of Logic = 2)&lt;br /&gt;  Clock Uncertainty:    0.000ns&lt;br /&gt;&lt;br /&gt;  Maximum Data Path: ddr_d_i to IDDR2_inst&lt;br /&gt;    Location             Delay type         Delay(ns)  Logical Resource(s)&lt;br /&gt;    -------------------------------------------------  -------------------&lt;br /&gt;    W4.I                 Tiopi                 1.140   ddr_d_i&lt;br /&gt;                                                       ddr_d_i_IBUF&lt;br /&gt;                                                       ProtoComp0.IMUX.1&lt;br /&gt;    ILOGIC_X0Y7.D        net (fanout=1)        0.128   ddr_d_i_IBUF&lt;br /&gt;    ILOGIC_X0Y7.CLK0     Tidock                1.456   ProtoComp2.D2OFFBYP_SRC&lt;br /&gt;                                                       IDDR2_inst&lt;br /&gt;    -------------------------------------------------  ---------------------------&lt;br /&gt;    Total                                      2.724ns (2.596ns logic, 0.128ns route)&lt;br /&gt;                                                       (95.3% logic, 4.7% route)&lt;br /&gt;&lt;br /&gt;  Minimum Clock Path: clk_i to IDDR2_inst&lt;br /&gt;    Location             Delay type         Delay(ns)  Logical Resource(s)&lt;br /&gt;    -------------------------------------------------  -------------------&lt;br /&gt;    N4.I                 Tiopi                 1.049   clk_i&lt;br /&gt;                                                       SP6_AUTOBUF_BUFGP_ML_IBUF_4&lt;br /&gt;                                                       ProtoComp0.IMUX&lt;br /&gt;    BUFGMUX_X3Y13.I0     net (fanout=1)        0.747   SP6_AUTOBUF_BUFGP_ML_IBUF_4_ML_NEW_I&lt;br /&gt;    BUFGMUX_X3Y13.O      Tgi0o                 0.220   clk_i_BUFGP&lt;br /&gt;    ILOGIC_X0Y7.CLK0     net (fanout=2)        1.374   clk_i_BUFGP&lt;br /&gt;    -------------------------------------------------  ---------------------------&lt;br /&gt;    Total                                      3.390ns (1.269ns logic, 2.121ns route)&lt;br /&gt;                                                       (37.4% logic, 62.6% route)&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;Timing constraint: TIMEGRP "TN_ddr_in_pads" OFFSET = IN 5 ns VALID 10 ns BEFORE COMP "clk_i"         "FALLING";&lt;br /&gt; 1 path analyzed, 1 endpoint analyzed, 0 failing endpoints&lt;br /&gt; 0 timing errors detected. (0 setup errors, 0 hold errors)&lt;br /&gt; Offset is  -0.666ns.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Slack (setup path):     5.666ns (requirement - (data path - clock path - clock arrival + uncertainty))&lt;br /&gt;  Source:               ddr_d_i (PAD)&lt;br /&gt;  Destination:          IDDR2_inst (FF)&lt;br /&gt;  Destination Clock:    clk_i_BUFGP falling at 0.000ns&lt;br /&gt;  Requirement:          5.000ns&lt;br /&gt;  Data Path Delay:      2.724ns (Levels of Logic = 2)&lt;br /&gt;  Clock Path Delay:     3.390ns (Levels of Logic = 2)&lt;br /&gt;  Clock Uncertainty:    0.000ns&lt;br /&gt;&lt;br /&gt;  Maximum Data Path: ddr_d_i to IDDR2_inst&lt;br /&gt;    Location             Delay type         Delay(ns)  Logical Resource(s)&lt;br /&gt;    -------------------------------------------------  -------------------&lt;br /&gt;    W4.I                 Tiopi                 1.140   ddr_d_i&lt;br /&gt;                                                       ddr_d_i_IBUF&lt;br /&gt;                                                       ProtoComp0.IMUX.1&lt;br /&gt;    ILOGIC_X0Y7.D        net (fanout=1)        0.128   ddr_d_i_IBUF&lt;br /&gt;    ILOGIC_X0Y7.CLK1     Tidock                1.456   ProtoComp2.D2OFFBYP_SRC&lt;br /&gt;                                                       IDDR2_inst&lt;br /&gt;    -------------------------------------------------  ---------------------------&lt;br /&gt;    Total                                      2.724ns (2.596ns logic, 0.128ns route)&lt;br /&gt;                                                       (95.3% logic, 4.7% route)&lt;br /&gt;&lt;br /&gt;  Minimum Clock Path: clk_i to IDDR2_inst&lt;br /&gt;    Location             Delay type         Delay(ns)  Logical Resource(s)&lt;br /&gt;    -------------------------------------------------  -------------------&lt;br /&gt;    N4.I                 Tiopi                 1.049   clk_i&lt;br /&gt;                                                       SP6_AUTOBUF_BUFGP_ML_IBUF_4&lt;br /&gt;                                                       ProtoComp0.IMUX&lt;br /&gt;    BUFGMUX_X3Y13.I0     net (fanout=1)        0.747   SP6_AUTOBUF_BUFGP_ML_IBUF_4_ML_NEW_I&lt;br /&gt;    BUFGMUX_X3Y13.O      Tgi0o                 0.220   clk_i_BUFGP&lt;br /&gt;    ILOGIC_X0Y7.CLK1     net (fanout=2)        1.374   clk_i_BUFGP&lt;br /&gt;    -------------------------------------------------  ---------------------------&lt;br /&gt;    Total                                      3.390ns (1.269ns logic, 2.121ns route)&lt;br /&gt;                                                       (37.4% logic, 62.6% route)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Please note that ISE  continues to improve the constraint syntax and report format, so you may see things work slightly differently in previous versions of ISE.&lt;br /&gt;&lt;br /&gt;Below is a list of references that can be very useful:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/cgd.pdf"&gt;Constraints Guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/ug612.pdf"&gt;UG612: Xilinx Timing Constraints User Guide&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/white_papers/wp237.pdf"&gt;WP237: What are OFFSET Constraints&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-4083646524898538445?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/4083646524898538445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2009/10/offset-in-constraints-for-source.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/4083646524898538445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/4083646524898538445'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2009/10/offset-in-constraints-for-source.html' title='OFFSET IN constraints for source synchronous DDR inputs'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-5501900715954057172</id><published>2009-09-28T21:28:00.005-04:00</published><updated>2011-02-10T00:33:30.675-05:00</updated><title type='text'>OFFSET IN constraints on diff inputs ignored in IDS 11.3. Fixed in 12.4</title><content type='html'>Below is a simple test case with differential input clock and data.&lt;br /&gt;&lt;pre&gt;`timescale 1ns / 1ps&lt;br /&gt;&lt;br /&gt;module s3a_ibufds (&lt;br /&gt;    input  clk_i_p, clk_i_n,&lt;br /&gt;    input  d_i_p, d_i_n,                      &lt;br /&gt;    output d_o_p, d_o_n                      &lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;wire d_in, clk_in;&lt;br /&gt;reg d_r1, d_r2;&lt;br /&gt;&lt;br /&gt;IBUFDS #(&lt;br /&gt;   .IBUF_DELAY_VALUE("0"),    // Specify the amount of added input delay for&lt;br /&gt;                              //    the buffer: "0"-"16" (Spartan-3A)&lt;br /&gt;   .IFD_DELAY_VALUE("AUTO"),  // Specify the amount of added delay for input&lt;br /&gt;                              //    register: "AUTO", "0"-"8" (Spartan-3A)&lt;br /&gt;   .IOSTANDARD("DEFAULT")     // Specify the input I/O standard&lt;br /&gt;) IBUFDS_clk (&lt;br /&gt;   .O  (clk_in),  // Buffer output&lt;br /&gt;   .I  (clk_i_p),  // Diff_p buffer input (connect directly to top-level port)&lt;br /&gt;   .IB (clk_i_n) // Diff_n buffer input (connect directly to top-level port)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;IBUFDS #(&lt;br /&gt;   .IBUF_DELAY_VALUE("0"),    // Specify the amount of added input delay for&lt;br /&gt;                              //    the buffer: "0"-"16" (Spartan-3A)&lt;br /&gt;   .IFD_DELAY_VALUE("AUTO"),  // Specify the amount of added delay for input&lt;br /&gt;                              //    register: "AUTO", "0"-"8" (Spartan-3A)&lt;br /&gt;   .IOSTANDARD("DEFAULT")     // Specify the input I/O standard&lt;br /&gt;) IBUFDS_d (&lt;br /&gt;   .O  (d_in),  // Buffer output&lt;br /&gt;   .I  (d_i_p),  // Diff_p buffer input (connect directly to top-level port)&lt;br /&gt;   .IB (d_i_n) // Diff_n buffer input (connect directly to top-level port)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;always @(posedge clk_in) begin&lt;br /&gt;    d_r1 &amp;lt;= d_in;&lt;br /&gt;    d_r2 &amp;lt;= d_r1;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;assign d_o_p = d_r2;&lt;br /&gt;&lt;br /&gt;endmodule&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;When the OFFSET IN constraints are specified with input nets,&amp;nbsp; they are simply ignored by the timing analyzer in ISE 11.3 (see UCF constraints and TA snapshot below):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;NET "clk_i_p" TNM_NET = clk_i_p;&lt;br /&gt;TIMESPEC TS_clk_i_p = PERIOD "clk_i_p" 20 ns HIGH 50%;&lt;br /&gt;NET "d_i_p" OFFSET = IN 2 ns VALID 4 ns BEFORE "clk_i_p" RISING;&lt;br /&gt;NET "d_i_n" OFFSET = IN 2 ns VALID 4 ns BEFORE "clk_i_p" RISING;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Z-IGtacTmlg/SsFg9EWpuyI/AAAAAAAAABY/5Gw2A-JwgpE/s1600-h/offset_with_net.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/SsFg9EWpuyI/AAAAAAAAABY/5Gw2A-JwgpE/s640/offset_with_net.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is probably caused by a bug in TA. As a workaround, the OFFSET IN constraints can be also specified with TIMEGRP and the tool will correctly analyze the timing constraint (see the UCF constraints and TA snapshot below).&lt;br /&gt;&lt;b&gt;&lt;span style="color: red;"&gt;[Update Feb 10th, 2011: Verified that the bug has been fixed in IDS 12.4]&lt;/span&gt;&lt;/b&gt; &lt;b style="color: red;"&gt;The project archive can be downloaded &lt;a href="http://dl.dropbox.com/u/5559324/design/timing_offset.zip"&gt;here&lt;/a&gt; in case anybody is interested.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;NET "clk_i_p" TNM_NET = clk_i_p;&lt;br /&gt;TIMESPEC TS_clk_i_p = PERIOD "clk_i_p" 20 ns HIGH 50%;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;INST "d_i_p" TNM = TN_d_pads;&lt;br /&gt;INST "d_i_n" TNM = TN_d_pads;&lt;br /&gt;TIMEGRP "TN_d_pads" OFFSET = IN 2 ns VALID 4 ns BEFORE clk_i_p;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Z-IGtacTmlg/SsFiIFLZWzI/AAAAAAAAABg/_zRAMqsACIs/s1600-h/offset_with_tnm.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://1.bp.blogspot.com/_Z-IGtacTmlg/SsFiIFLZWzI/AAAAAAAAABg/_zRAMqsACIs/s640/offset_with_tnm.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;pre&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-5501900715954057172?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/5501900715954057172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2009/09/offset-in-constraints-on-diff-inputs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/5501900715954057172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/5501900715954057172'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2009/09/offset-in-constraints-on-diff-inputs.html' title='OFFSET IN constraints on diff inputs ignored in IDS 11.3. Fixed in 12.4'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_Z-IGtacTmlg/SsFg9EWpuyI/AAAAAAAAABY/5Gw2A-JwgpE/s72-c/offset_with_net.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-317475051497754609</id><published>2009-09-23T23:56:00.008-04:00</published><updated>2011-11-11T11:40:15.137-05:00</updated><title type='text'>Virtex6 Configuration Examples</title><content type='html'>The web links below will bring you directly to the block diagram for the selected configuration mode from the "Virtex6 FPGA Configuration User Guide" (UG360 v2.0 Nov 15, 2009). This is also the landing page for ADEPT (&lt;a href="http://mysite.verizon.net/jimwu88/adept/"&gt;website&lt;/a&gt; and &lt;a href="http://myadeptblog.blogspot.com/"&gt;blog&lt;/a&gt;) when the "Example" button on the "&lt;a href="http://myadeptblog.blogspot.com/2009/11/special-pin-setup-window_11.html"&gt;Special Pin Setup&lt;/a&gt;" window is pressed.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug360.pdf#page=24&amp;amp;view=fit"&gt;Master Serial example&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug360.pdf#page=26&amp;amp;view=fit"&gt;Slave Serial example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug360.pdf#page=47&amp;amp;view=fit"&gt;Master SPI example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug360.pdf#page=48&amp;amp;view=fit"&gt;Master BPI-Up example&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug360.pdf#page=48&amp;amp;view=fit"&gt;Master BPI-Down example&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug360.pdf#page=31&amp;amp;view=fit"&gt;Master SelectMAP example&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug360.pdf#page=33&amp;amp;view=fit"&gt;Slave SelectMAP example&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xilinx.com/support/documentation/user_guides/ug360.pdf#page=57&amp;amp;view=fit"&gt;JTAG example&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-317475051497754609?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/317475051497754609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2009/09/virtex6-configuration-examples.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/317475051497754609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/317475051497754609'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2009/09/virtex6-configuration-examples.html' title='Virtex6 Configuration Examples'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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></entry><entry><id>tag:blogger.com,1999:blog-419958562532914083.post-4242280787205278958</id><published>2009-09-18T22:19:00.000-04:00</published><updated>2009-09-18T22:22:08.460-04:00</updated><title type='text'>Virtex4 ODDR tristate control</title><content type='html'>The tristate control of the tristate buffer in IOB is active low. It's important to code this in RTL for the tool to correctly implement it in HW. e.g.&lt;br /&gt;&lt;br /&gt;assign dqbit = (ts_ddrbit == 1'b0) ? out_ddrbit : 1'bz;&lt;br /&gt;&lt;br /&gt;A code example with IDDR, ODDRs for both the data and tristate control in Virtex4 is shown below. It's tested with Xilinx IDS 11.3.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;`timescale 1ns / 1ps&lt;br /&gt;&lt;br /&gt;module tristate_oddr(&lt;br /&gt;    input iddr_clk,&lt;br /&gt;    input oddr_clk,&lt;br /&gt;    inout dqbit,&lt;br /&gt;    input ts_ddrbit1,&lt;br /&gt;  input ts_ddrbit2,&lt;br /&gt;  input dq_bit1,&lt;br /&gt;  input dq_bit2,&lt;br /&gt; &lt;br /&gt;    output test_out1,&lt;br /&gt;  output test_out2&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;wire out_ddrbit, ts_ddr_bit;&lt;br /&gt;&lt;br /&gt;ODDR #(&lt;br /&gt;    .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"&lt;br /&gt;    .INIT   (1'b0), // Initial value of Q: 1’b0 or 1’b1&lt;br /&gt;    .SRTYPE ("SYNC") // Set/Reset type: "SYNC" or "ASYNC"&lt;br /&gt;) oddr_out_ddrbit (&lt;br /&gt;    .Q  (out_ddrbit), // 1-bit DDR output&lt;br /&gt;    .C  (oddr_clk), // 1-bit clock input&lt;br /&gt;    .CE (1'b1), // 1-bit clock enable input&lt;br /&gt;    .D1 (dq_bit1), // 1-bit data input (positive edge)&lt;br /&gt;    .D2 (dq_bit2), // 1-bit data input (negative edge)&lt;br /&gt;    .R  (1'b0), // 1-bit reset&lt;br /&gt;    .S  (1'b0) // 1-bit set&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;ODDR #(&lt;br /&gt;    .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"&lt;br /&gt;    .INIT   (1'b0), // Initial value of Q: 1’b0 or 1’b1&lt;br /&gt;    .SRTYPE ("SYNC") // Set/Reset type: "SYNC" or "ASYNC"&lt;br /&gt;) oddr_ts_ddrbit (&lt;br /&gt;    .Q  (ts_ddrbit), // 1-bit DDR output&lt;br /&gt;    .C  (oddr_clk), // 1-bit clock input&lt;br /&gt;    .CE (1'b1), // 1-bit clock enable input&lt;br /&gt;    .D1 (ts_ddrbit1), // 1-bit data input (positive edge)&lt;br /&gt;    .D2 (ts_ddrbit2), // 1-bit data input (negative edge)&lt;br /&gt;    .R  (1'b0), // 1-bit reset&lt;br /&gt;    .S  (1'b0) // 1-bit set&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//IMPORTANT: the tristate control of the tristate buffer in IOB is active low.&lt;br /&gt;assign dqbit = (ts_ddrbit == 1'b0) ? out_ddrbit : 1'bz;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IDDR #(&lt;br /&gt;    .DDR_CLK_EDGE ("OPPOSITE_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE"&lt;br /&gt;    // or "SAME_EDGE_PIPELINED"&lt;br /&gt;    .INIT_Q1 (1'b0), // Initial value of Q1: 1’b0 or 1’b1&lt;br /&gt;    .INIT_Q2 (1'b0), // Initial value of Q2: 1’b0 or 1’b1&lt;br /&gt;    .SRTYPE  ("SYNC") // Set/Reset type: "SYNC" or "ASYNC"&lt;br /&gt;) IDDR_dqbit (&lt;br /&gt;    .Q1 (test_out1), // 1-bit output for positive edge of clock&lt;br /&gt;    .Q2 (test_out2), // 1-bit output for negative edge of clock&lt;br /&gt;    .C  (iddr_clk), // 1-bit clock input&lt;br /&gt;    .CE (1'b1), // 1-bit clock enable input&lt;br /&gt;    .D  (dqbit), // 1-bit DDR data input&lt;br /&gt;    .R  (1'b0), // 1-bit reset&lt;br /&gt;    .S  (1'b0) // 1-bit set&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;endmodule&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Below is what the implementation looks like in FPGA_EDITOR:&lt;br /&gt;&lt;br /&gt;IDDR, ODDR and IOBUF:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J8f8qH7bwyM/SrQo3hN2G1I/AAAAAAAAAAM/f15KbVoJOtI/s1600-h/iddr_oddr_trioddr.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 278px;" src="http://3.bp.blogspot.com/_J8f8qH7bwyM/SrQo3hN2G1I/AAAAAAAAAAM/f15KbVoJOtI/s320/iddr_oddr_trioddr.gif" alt="" id="BLOGGER_PHOTO_ID_5382972388888943442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Inside ODDR:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_J8f8qH7bwyM/SrQ4bp80zXI/AAAAAAAAAAk/Mq463d3_5yk/s1600-h/inside_oddr.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 210px; height: 320px;" src="http://1.bp.blogspot.com/_J8f8qH7bwyM/SrQ4bp80zXI/AAAAAAAAAAk/Mq463d3_5yk/s320/inside_oddr.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5382989502383181170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Inside IOB:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J8f8qH7bwyM/SrQs_Gs85gI/AAAAAAAAAAc/Xwp7AweN0lY/s1600-h/inside_iob.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 138px;" src="http://3.bp.blogspot.com/_J8f8qH7bwyM/SrQs_Gs85gI/AAAAAAAAAAc/Xwp7AweN0lY/s320/inside_iob.gif" alt="" id="BLOGGER_PHOTO_ID_5382976917257119234" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/419958562532914083-4242280787205278958?l=myfpgablog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myfpgablog.blogspot.com/feeds/4242280787205278958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myfpgablog.blogspot.com/2009/09/virtex4-oddr-tristate-control.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/4242280787205278958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/419958562532914083/posts/default/4242280787205278958'/><link rel='alternate' type='text/html' href='http://myfpgablog.blogspot.com/2009/09/virtex4-oddr-tristate-control.html' title='Virtex4 ODDR tristate control'/><author><name>Jim Wu</name><uri>http://www.blogger.com/profile/14984103795351065801</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/_J8f8qH7bwyM/SrQo3hN2G1I/AAAAAAAAAAM/f15KbVoJOtI/s72-c/iddr_oddr_trioddr.gif' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
