File indexing completed on 2025-02-02 03:54:46
0001 <!DOCTYPE html> 0002 <html><head> 0003 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 0004 <title>light52_muldiv.vhdl</title> 0005 <meta name="generator" content="KF5::SyntaxHighlighting - Definition (VHDL) - Theme (Breeze Dark)"/> 0006 </head><body style="background-color:#232629;color:#cfcfc2"><pre> 0007 <span style="color:#7a7c7d">--------------------------------------------------------------------------------</span> 0008 <span style="color:#7a7c7d">-- light52_muldiv.vhdl -- Simple multiplier/divider module.</span> 0009 <span style="color:#7a7c7d">--------------------------------------------------------------------------------</span> 0010 <span style="color:#7a7c7d">-- The 8051 mul and div instructions are both unsigned and operands are 8 bit.</span> 0011 <span style="color:#7a7c7d">--</span> 0012 <span style="color:#7a7c7d">-- This module implements the division as a sequential state machine which takes</span> 0013 <span style="color:#7a7c7d">-- 8 cycles to complete. </span> 0014 <span style="color:#7a7c7d">-- The multiplier can be implemented as sequential or as combinational, in which</span> 0015 <span style="color:#7a7c7d">-- case it will use a DSP block in those architectures that support it.</span> 0016 <span style="color:#7a7c7d">-- No attempt has been made to make this module generic or reusable.</span> 0017 <span style="color:#7a7c7d">--</span> 0018 <span style="color:#7a7c7d">-- If you want a combinational multiplier but don't want to waste a DSP block </span> 0019 <span style="color:#7a7c7d">-- in this module, you need to modify this file adding whatever synthesis </span> 0020 <span style="color:#7a7c7d">-- pragmas your tool of choice needs.</span> 0021 <span style="color:#7a7c7d">--</span> 0022 <span style="color:#7a7c7d">-- Note that unlike the division state machine, the combinational product logic</span> 0023 <span style="color:#7a7c7d">-- is always operating: when SEQUENTIAL_MULTIPLIER=true, prod_out equals </span> 0024 <span style="color:#7a7c7d">-- data_a * data_b with a latency of 1 clock cycle, and mul_ready is hardwired</span> 0025 <span style="color:#7a7c7d">-- to '1'.</span> 0026 <span style="color:#7a7c7d">--</span> 0027 <span style="color:#7a7c7d">-- </span><span style="color:#ca9219;background-color:#451e1a;font-weight:bold">FIXME</span><span style="color:#7a7c7d"> explain division algorithm.</span> 0028 <span style="color:#7a7c7d">--------------------------------------------------------------------------------</span> 0029 <span style="color:#7a7c7d">-- GENERICS:</span> 0030 <span style="color:#7a7c7d">-- </span> 0031 <span style="color:#7a7c7d">-- SEQUENTIAL_MULTIPLIER -- Sequential vs. combinational multiplier.</span> 0032 <span style="color:#7a7c7d">-- When true, a sequential implementation will be used for the multiplier, </span> 0033 <span style="color:#7a7c7d">-- which will usually save a lot of logic or a dedicated multiplier.</span> 0034 <span style="color:#7a7c7d">-- When false, a combinational registered multiplier will be used.</span> 0035 <span style="color:#7a7c7d">--</span> 0036 <span style="color:#7a7c7d">--------------------------------------------------------------------------------</span> 0037 <span style="color:#7a7c7d">-- INTERFACE SIGNALS:</span> 0038 <span style="color:#7a7c7d">--</span> 0039 <span style="color:#7a7c7d">-- clk : Clock, active rising edge.</span> 0040 <span style="color:#7a7c7d">-- reset : Synchronous reset. Clears only the control registers not</span> 0041 <span style="color:#7a7c7d">-- visible to the programmer -- not the output registers.</span> 0042 <span style="color:#7a7c7d">-- </span> 0043 <span style="color:#7a7c7d">-- data_a : Numerator input, should be connected to the ACC register.</span> 0044 <span style="color:#7a7c7d">-- data_b : Denominator input, should be connected to the B register.</span> 0045 <span style="color:#7a7c7d">-- start : Assert for 1 cycle to start the division state machine</span> 0046 <span style="color:#7a7c7d">-- (and the product if SEQUENTIAL_MULTIPLIER=true);</span> 0047 <span style="color:#7a7c7d">-- </span> 0048 <span style="color:#7a7c7d">-- prod_out : Product output, valid only when mul_ready='1'.</span> 0049 <span style="color:#7a7c7d">-- quot_out : Quotient output, valid only when div_ready='1'.</span> 0050 <span style="color:#7a7c7d">-- rem_out : Remainder output, valid only when div_ready='1'.</span> 0051 <span style="color:#7a7c7d">-- div_ov_out : Division overflow flag, valid only when div_ready='1'.</span> 0052 <span style="color:#7a7c7d">-- mul_ov_out : Product overflow flag, valid only when mul_ready='1'.</span> 0053 <span style="color:#7a7c7d">-- </span> 0054 <span style="color:#7a7c7d">-- mul_ready : Asserted permanently if SEQUENTIAL_MULTIPLIER=false.</span> 0055 <span style="color:#7a7c7d">-- div_ready : Deasserted the cycle after start is asserted.</span> 0056 <span style="color:#7a7c7d">-- Asserted when the division has completed.</span> 0057 <span style="color:#7a7c7d">--</span> 0058 <span style="color:#7a7c7d">--------------------------------------------------------------------------------</span> 0059 <span style="color:#7a7c7d">-- Copyright (C) 2012 Jose A. Ruiz</span> 0060 <span style="color:#7a7c7d">-- </span> 0061 <span style="color:#7a7c7d">-- This source file may be used and distributed without </span> 0062 <span style="color:#7a7c7d">-- restriction provided that this copyright statement is not </span> 0063 <span style="color:#7a7c7d">-- removed from the file and that any derivative work contains </span> 0064 <span style="color:#7a7c7d">-- the original copyright notice and the associated disclaimer. </span> 0065 <span style="color:#7a7c7d">-- </span> 0066 <span style="color:#7a7c7d">-- This source file is free software; you can redistribute it </span> 0067 <span style="color:#7a7c7d">-- and/or modify it under the terms of the GNU Lesser General </span> 0068 <span style="color:#7a7c7d">-- Public License as published by the Free Software Foundation; </span> 0069 <span style="color:#7a7c7d">-- either version 2.1 of the License, or (at your option) any </span> 0070 <span style="color:#7a7c7d">-- later version. </span> 0071 <span style="color:#7a7c7d">-- </span> 0072 <span style="color:#7a7c7d">-- This source is distributed in the hope that it will be </span> 0073 <span style="color:#7a7c7d">-- useful, but WITHOUT ANY WARRANTY; without even the implied </span> 0074 <span style="color:#7a7c7d">-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR </span> 0075 <span style="color:#7a7c7d">-- PURPOSE. See the GNU Lesser General Public License for more </span> 0076 <span style="color:#7a7c7d">-- details. </span> 0077 <span style="color:#7a7c7d">-- </span> 0078 <span style="color:#7a7c7d">-- You should have received a copy of the GNU Lesser General </span> 0079 <span style="color:#7a7c7d">-- Public License along with this source; if not, download it </span> 0080 <span style="color:#7a7c7d">-- from http://www.opencores.org/lgpl.shtml</span> 0081 <span style="color:#7a7c7d">--------------------------------------------------------------------------------</span> 0082 0083 <span style="font-weight:bold">library</span> ieee; 0084 <span style="font-weight:bold">use</span> ieee<span style="color:#27ae60">.</span>std_logic_1164<span style="color:#27ae60">.</span><span style="font-weight:bold">all</span>; 0085 <span style="font-weight:bold">use</span> ieee<span style="color:#27ae60">.</span>numeric_std<span style="color:#27ae60">.</span><span style="font-weight:bold">all</span>; 0086 0087 <span style="font-weight:bold">use</span> work<span style="color:#27ae60">.</span>light52_pkg<span style="color:#27ae60">.</span><span style="font-weight:bold">all</span>; 0088 <span style="font-weight:bold">use</span> work<span style="color:#27ae60">.</span>light52_ucode_pkg<span style="color:#27ae60">.</span><span style="font-weight:bold">all</span>; 0089 0090 <span style="color:#fdbc4b;font-weight:bold">entity</span> <span style="color:#f67400;font-weight:bold">light52_muldiv</span> <span style="font-weight:bold">is</span> 0091 <span style="color:#fdbc4b;font-weight:bold">generic</span> ( 0092 SEQUENTIAL_MULTIPLIER <span style="color:#27ae60">:</span> <span style="color:#2980b9">boolean</span> <span style="color:#27ae60">:=</span> <span style="font-weight:bold">false</span> 0093 ); 0094 <span style="color:#fdbc4b;font-weight:bold">port</span>( 0095 clk <span style="color:#27ae60">:</span> <span style="font-weight:bold">in</span> <span style="color:#2980b9">std_logic</span>; 0096 reset <span style="color:#27ae60">:</span> <span style="font-weight:bold">in</span> <span style="color:#2980b9">std_logic</span>; 0097 0098 data_a <span style="color:#27ae60">:</span> <span style="font-weight:bold">in</span> t_byte; 0099 data_b <span style="color:#27ae60">:</span> <span style="font-weight:bold">in</span> t_byte; 0100 start <span style="color:#27ae60">:</span> <span style="font-weight:bold">in</span> <span style="color:#2980b9">std_logic</span>; 0101 0102 prod_out <span style="color:#27ae60">:</span> <span style="font-weight:bold">out</span> t_word; 0103 quot_out <span style="color:#27ae60">:</span> <span style="font-weight:bold">out</span> t_byte; 0104 rem_out <span style="color:#27ae60">:</span> <span style="font-weight:bold">out</span> t_byte; 0105 div_ov_out <span style="color:#27ae60">:</span> <span style="font-weight:bold">out</span> <span style="color:#2980b9">std_logic</span>; 0106 mul_ov_out <span style="color:#27ae60">:</span> <span style="font-weight:bold">out</span> <span style="color:#2980b9">std_logic</span>; 0107 0108 mul_ready <span style="color:#27ae60">:</span> <span style="font-weight:bold">out</span> <span style="color:#2980b9">std_logic</span>; 0109 div_ready <span style="color:#27ae60">:</span> <span style="font-weight:bold">out</span> <span style="color:#2980b9">std_logic</span> 0110 ); 0111 <span style="color:#fdbc4b;font-weight:bold">end entity light52_muldiv;</span> 0112 0113 <span style="color:#fdbc4b;font-weight:bold">architecture</span> <span style="color:#f67400;font-weight:bold">sequential</span> <span style="font-weight:bold">of</span> <span style="color:#8e44ad">light52_muldiv</span> <span style="font-weight:bold">is</span> 0114 0115 <span style="color:#27ae60">signal</span> bit_ctr <span style="color:#27ae60">:</span> <span style="color:#2980b9">integer</span> <span style="font-weight:bold">range</span> <span style="color:#f67400">0</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">8</span>; 0116 0117 <span style="color:#27ae60">signal</span> b_shift_reg <span style="color:#27ae60">:</span> t_word; 0118 0119 <span style="color:#27ae60">signal</span> den_ge_256 <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic</span>; 0120 <span style="color:#27ae60">signal</span> num_ge_den <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic</span>; 0121 <span style="color:#27ae60">signal</span> sub_num <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic</span>; 0122 0123 <span style="color:#27ae60">signal</span> denominator <span style="color:#27ae60">:</span> t_byte; 0124 <span style="color:#27ae60">signal</span> rem_reg <span style="color:#27ae60">:</span> t_byte; 0125 <span style="color:#27ae60">signal</span> quot_reg <span style="color:#27ae60">:</span> t_byte; 0126 <span style="color:#27ae60">signal</span> prod_reg <span style="color:#27ae60">:</span> t_word; 0127 <span style="color:#27ae60">signal</span> ready <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic</span>; 0128 0129 <span style="color:#27ae60">signal</span> load_regs <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic</span>; 0130 0131 <span style="color:#fdbc4b;font-weight:bold">begin</span> 0132 0133 <span style="color:#7a7c7d">-- Control logic ---------------------------------------------------------------</span> 0134 0135 <span style="color:#f67400;font-weight:bold">control_counter</span><span style="color:#27ae60">:</span> <span style="color:#3daee9;font-weight:bold">process</span>(clk) 0136 <span style="font-weight:bold">alias</span> sig <span style="font-weight:bold">is</span> <span style="color:#27ae60"><<</span><span style="color:#27ae60">signal</span> g_test(<span style="color:#f67400">0</span>)<span style="color:#27ae60">.</span>i_test<span style="color:#27ae60">.</span>sig <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic</span><span style="color:#27ae60">>></span>; 0137 <span style="color:#3daee9;font-weight:bold">begin</span> 0138 <span style="color:#fdbc4b;font-weight:bold">if</span> clk<span style="color:#f67400">'event</span> <span style="font-weight:bold">and</span> clk<span style="color:#27ae60">=</span><span style="color:#f67400">'1'</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0139 <span style="color:#fdbc4b;font-weight:bold">if</span> reset<span style="color:#27ae60">=</span><span style="color:#f67400">'1'</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0140 bit_ctr <span style="color:#27ae60"><=</span> <span style="color:#f67400">8</span>; 0141 <span style="color:#fdbc4b;font-weight:bold">else</span> 0142 <span style="color:#fdbc4b;font-weight:bold">if</span> load_regs<span style="color:#27ae60">=</span><span style="color:#f67400">'1'</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0143 bit_ctr <span style="color:#27ae60"><=</span> <span style="color:#f67400">0</span>; 0144 <span style="color:#fdbc4b;font-weight:bold">elsif</span> bit_ctr <span style="color:#27ae60">/=</span> <span style="color:#f67400">8</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0145 bit_ctr <span style="color:#27ae60"><=</span> bit_ctr <span style="color:#27ae60">+</span> <span style="color:#f67400">1</span>; 0146 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0147 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0148 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0149 <span style="color:#3daee9;font-weight:bold">end process control_counter;</span> 0150 0151 <span style="color:#7a7c7d">-- Internal signal ready is asserted after 8 cycles.</span> 0152 <span style="color:#7a7c7d">-- The sequential multiplier will use this signal too, IF it takes 8 cycles.</span> 0153 0154 ready <span style="color:#27ae60"><=</span> <span style="color:#f67400">'1'</span> <span style="font-weight:bold">when</span> bit_ctr <span style="color:#27ae60">>=</span> <span style="color:#f67400">8</span> <span style="font-weight:bold">else</span> <span style="color:#f67400">'0'</span>; 0155 0156 0157 <span style="color:#7a7c7d">---- Divider logic -------------------------------------------------------------</span> 0158 0159 <span style="color:#7a7c7d">-- What we do is a simple base-2 'shift-and-subtract' algorithm that takes</span> 0160 <span style="color:#7a7c7d">-- 8 cycles to complete. We can get away with this because we deal with unsigned</span> 0161 <span style="color:#7a7c7d">-- numbers only.</span> 0162 0163 <span style="color:#f67400;font-weight:bold">divider_registers</span><span style="color:#27ae60">:</span> <span style="color:#3daee9;font-weight:bold">process</span>(clk) 0164 <span style="color:#3daee9;font-weight:bold">begin</span> 0165 <span style="color:#fdbc4b;font-weight:bold">if</span> clk<span style="color:#f67400">'event</span> <span style="font-weight:bold">and</span> clk<span style="color:#27ae60">=</span><span style="color:#f67400">'1'</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0166 <span style="color:#7a7c7d">-- denominator shift register</span> 0167 <span style="color:#fdbc4b;font-weight:bold">if</span> load_regs<span style="color:#27ae60">=</span><span style="color:#f67400">'1'</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0168 b_shift_reg <span style="color:#27ae60"><=</span> <span style="color:#f44f4f">"0"</span> <span style="color:#27ae60">&</span> data_b <span style="color:#27ae60">&</span> <span style="color:#f44f4f">"0000000"</span>; 0169 <span style="color:#7a7c7d">-- Division overflow can be determined upon loading B reg data.</span> 0170 <span style="color:#7a7c7d">-- OV will be raised only on div-by-zero.</span> 0171 <span style="color:#fdbc4b;font-weight:bold">if</span> data_b<span style="color:#27ae60">=</span>X<span style="color:#f44f4f">"00"</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0172 div_ov_out <span style="color:#27ae60"><=</span> <span style="color:#f67400">'1'</span>; 0173 <span style="color:#fdbc4b;font-weight:bold">else</span> 0174 div_ov_out <span style="color:#27ae60"><=</span> <span style="color:#f67400">'0'</span>; 0175 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0176 <span style="color:#fdbc4b;font-weight:bold">else</span> 0177 b_shift_reg <span style="color:#27ae60"><=</span> <span style="color:#f44f4f">"0"</span> <span style="color:#27ae60">&</span> b_shift_reg(b_shift_reg<span style="color:#f67400">'high</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">1</span>); 0178 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0179 0180 <span style="color:#7a7c7d">-- numerator register</span> 0181 <span style="color:#fdbc4b;font-weight:bold">if</span> load_regs<span style="color:#27ae60">=</span><span style="color:#f67400">'1'</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0182 rem_reg <span style="color:#27ae60"><=</span> data_a; 0183 <span style="color:#fdbc4b;font-weight:bold">elsif</span> bit_ctr<span style="color:#27ae60">/=</span><span style="color:#f67400">8</span> <span style="font-weight:bold">and</span> sub_num<span style="color:#27ae60">=</span><span style="color:#f67400">'1'</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0184 rem_reg <span style="color:#27ae60"><=</span> rem_reg <span style="color:#27ae60">-</span> denominator; 0185 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0186 0187 <span style="color:#7a7c7d">--- quotient register</span> 0188 <span style="color:#fdbc4b;font-weight:bold">if</span> load_regs<span style="color:#27ae60">=</span><span style="color:#f67400">'1'</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0189 quot_reg <span style="color:#27ae60"><=</span> (<span style="color:#27ae60">others</span> <span style="color:#27ae60">=></span> <span style="color:#f67400">'0'</span>); 0190 <span style="color:#fdbc4b;font-weight:bold">elsif</span> bit_ctr<span style="color:#27ae60">/=</span><span style="color:#f67400">8</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0191 quot_reg <span style="color:#27ae60"><=</span> quot_reg(quot_reg<span style="color:#f67400">'high-1</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>) <span style="color:#27ae60">&</span> sub_num; 0192 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0193 0194 load_regs <span style="color:#27ae60"><=</span> start; 0195 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0196 <span style="color:#3daee9;font-weight:bold">end process divider_registers;</span> 0197 0198 denominator <span style="color:#27ae60"><=</span> b_shift_reg(<span style="color:#f67400">7</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>); 0199 0200 <span style="color:#7a7c7d">-- The 16-bit comparison between b_shift_reg (denominator) and the zero-extended </span> 0201 <span style="color:#7a7c7d">-- rem_reg (numerator) can be simplified by splitting it in 2: </span> 0202 <span style="color:#7a7c7d">-- If the shifted denominator high byte is not zero, it is >=256...</span> 0203 den_ge_256 <span style="color:#27ae60"><=</span> <span style="color:#f67400">'1'</span> <span style="font-weight:bold">when</span> b_shift_reg(<span style="color:#f67400">15</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">8</span>) <span style="color:#27ae60">/=</span> X<span style="color:#f44f4f">"00"</span> <span style="font-weight:bold">else</span> <span style="color:#f67400">'0'</span>; 0204 <span style="color:#7a7c7d">-- ...otherwise we need to compare the low bytes.</span> 0205 num_ge_den <span style="color:#27ae60"><=</span> <span style="color:#f67400">'1'</span> <span style="font-weight:bold">when</span> rem_reg <span style="color:#27ae60">>=</span> denominator <span style="font-weight:bold">else</span> <span style="color:#f67400">'0'</span>; 0206 sub_num <span style="color:#27ae60"><=</span> <span style="color:#f67400">'1'</span> <span style="font-weight:bold">when</span> den_ge_256<span style="color:#27ae60">=</span><span style="color:#f67400">'0'</span> <span style="font-weight:bold">and</span> num_ge_den<span style="color:#27ae60">=</span><span style="color:#f67400">'1'</span> <span style="font-weight:bold">else</span> <span style="color:#f67400">'0'</span>; 0207 0208 0209 quot_out <span style="color:#27ae60"><=</span> quot_reg; 0210 prod_out <span style="color:#27ae60"><=</span> prod_reg; 0211 rem_out <span style="color:#27ae60"><=</span> rem_reg; 0212 0213 div_ready <span style="color:#27ae60"><=</span> ready; 0214 0215 <span style="color:#7a7c7d">---- Multiplier logic ----------------------------------------------------------</span> 0216 0217 <span style="color:#7a7c7d">---- Combinational multiplier -----------------------------</span> 0218 <span style="color:#f67400;font-weight:bold">multiplier_combinational</span><span style="color:#27ae60">:</span> <span style="color:#fdbc4b;font-weight:bold">if</span> <span style="font-weight:bold">not</span> SEQUENTIAL_MULTIPLIER <span style="color:#fdbc4b;font-weight:bold">generate</span> 0219 0220 <span style="color:#f67400;font-weight:bold">registered_combinational_multiplier</span><span style="color:#27ae60">:</span><span style="color:#3daee9;font-weight:bold">process</span>(clk) 0221 <span style="color:#3daee9;font-weight:bold">begin</span> 0222 <span style="color:#fdbc4b;font-weight:bold">if</span> clk<span style="color:#f67400">'event</span> <span style="font-weight:bold">and</span> clk<span style="color:#27ae60">=</span><span style="color:#f67400">'1'</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0223 prod_reg <span style="color:#27ae60"><=</span> data_a <span style="color:#27ae60">*</span> data_b; <span style="color:#7a7c7d">-- t_byte is unsigned</span> 0224 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0225 <span style="color:#3daee9;font-weight:bold">end process registered_combinational_multiplier;</span> 0226 0227 <span style="color:#7a7c7d">-- The multiplier output is valid in the cycle after the operands are loaded,</span> 0228 <span style="color:#7a7c7d">-- so by the time MUL is executed it's already done.</span> 0229 mul_ready <span style="color:#27ae60"><=</span> <span style="color:#f67400">'1'</span>; 0230 0231 mul_ov_out <span style="color:#27ae60"><=</span> <span style="color:#f67400">'1'</span> <span style="font-weight:bold">when</span> prod_reg(<span style="color:#f67400">15</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">8</span>)<span style="color:#27ae60">/=</span>X<span style="color:#f44f4f">"00"</span> <span style="font-weight:bold">else</span> <span style="color:#f67400">'0'</span>; 0232 prod_out <span style="color:#27ae60"><=</span> prod_reg; 0233 0234 <span style="color:#fdbc4b;font-weight:bold">end generate multiplier_combinational;</span> 0235 0236 <span style="color:#7a7c7d">---- Sequential multiplier --------------------------------</span> 0237 <span style="color:#f67400;font-weight:bold">multiplier_sequential</span><span style="color:#27ae60">:</span> <span style="color:#fdbc4b;font-weight:bold">if</span> SEQUENTIAL_MULTIPLIER <span style="color:#fdbc4b;font-weight:bold">generate</span> 0238 0239 <span style="font-weight:bold">assert</span> <span style="font-weight:bold">false</span> 0240 <span style="font-weight:bold">report</span> <span style="color:#f44f4f">"Sequential multiplier implementation not done yet."</span><span style="color:#27ae60">&</span> 0241 <span style="color:#f44f4f">" Use combinational implementation."</span> 0242 <span style="font-weight:bold">severity</span> <span style="font-weight:bold">failure</span>; 0243 0244 <span style="color:#fdbc4b;font-weight:bold">end generate multiplier_sequential;</span> 0245 0246 <span style="color:#fdbc4b;font-weight:bold">end sequential;</span> 0247 0248 0249 <span style="font-weight:bold">with</span> Types; <span style="font-weight:bold">use</span> Types; 0250 <span style="font-weight:bold">with</span> Files_Map; 0251 0252 <span style="color:#fdbc4b;font-weight:bold">package</span> <span style="color:#f67400;font-weight:bold">fixed_pkg</span> <span style="font-weight:bold">is</span> <span style="font-weight:bold">new</span> <span style="color:#f67400;font-weight:bold">IEEE</span><span style="color:#27ae60">.</span>fixed_generic_pkg 0253 <span style="font-weight:bold">generic map </span>( 0254 fixed_overflow_style <span style="color:#27ae60">=></span> IEEE<span style="color:#27ae60">.</span>fixed_float_types<span style="color:#27ae60">.</span>fixed_saturate<span style="color:#27ae60">,</span> 0255 fixed_guard_bits <span style="color:#27ae60">=></span> <span style="color:#f67400">3</span><span style="color:#27ae60">,</span> 0256 no_warning <span style="color:#27ae60">=></span> <span style="font-weight:bold">false</span> 0257 ); 0258 0259 <span style="color:#fdbc4b;font-weight:bold">package</span> <span style="color:#f67400;font-weight:bold">p</span> <span style="font-weight:bold">is</span> 0260 <span style="color:#27ae60">type</span> int_ptr <span style="color:#27ae60">is</span> <span style="font-weight:bold">access</span> <span style="color:#2980b9">integer</span>; 0261 <span style="color:#27ae60">type</span> rec <span style="color:#27ae60">is</span> <span style="font-weight:bold">record</span> 0262 data <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic_vector</span>(<span style="color:#f67400">31</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>); 0263 ack <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic</span>; 0264 value <span style="color:#27ae60">:</span> <span style="color:#2980b9">integer</span>; 0265 link <span style="color:#27ae60">:</span> rec_ptr; 0266 <span style="font-weight:bold">end record;</span> 0267 <span style="color:#27ae60">type</span> int_vec <span style="color:#27ae60">is</span> <span style="font-weight:bold">array</span> (<span style="color:#2980b9">integer</span> <span style="font-weight:bold">range</span> <span style="color:#27ae60"><></span>) <span style="font-weight:bold">of</span> <span style="color:#2980b9">integer</span>; 0268 <span style="color:#27ae60">type</span> int_vec_ptr <span style="color:#27ae60">is</span> <span style="font-weight:bold">access</span> int_vec; 0269 <span style="font-weight:bold">procedure</span> <span style="color:#f67400;font-weight:bold">UNIFORM</span>(<span style="color:#27ae60">variable</span> SEED1<span style="color:#27ae60">,</span> SEED2 <span style="color:#27ae60">:</span> <span style="font-weight:bold">inout</span> <span style="color:#2980b9">POSITIVE</span>; <span style="color:#27ae60">variable</span> X <span style="color:#27ae60">:</span> <span style="font-weight:bold">out</span> <span style="color:#2980b9">REAL</span>); 0270 <span style="color:#27ae60">constant</span> def_arr <span style="color:#27ae60">:</span> t_int_array <span style="color:#27ae60">:=</span> (<span style="color:#f67400">0</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">2</span> <span style="color:#27ae60">=></span> <span style="color:#f67400">10</span>); 0271 0272 <span style="color:#7a7c7d">-- type range</span> 0273 <span style="color:#27ae60">type</span> newInt <span style="color:#27ae60">is</span> <span style="font-weight:bold">range</span> <span style="color:#27ae60">-</span><span style="color:#f67400">4</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">3</span>; 0274 <span style="color:#27ae60">type</span> CAPACITY <span style="color:#27ae60">is</span> <span style="font-weight:bold">range</span> <span style="color:#f67400">0</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">1</span><span style="color:#f67400">E5</span> <span style="color:#fdbc4b;font-weight:bold">units</span> 0275 pF; 0276 nF <span style="color:#27ae60">=</span> <span style="color:#f67400">1000</span> pF; 0277 <span style="color:#fdbc4b;font-weight:bold">end units;</span> 0278 0279 <span style="color:#7a7c7d">-- type protected</span> 0280 <span style="color:#27ae60">type</span> prot <span style="color:#27ae60">is</span> <span style="font-weight:bold">protected</span> 0281 <span style="color:#2980b9;font-weight:bold">function</span> <span style="color:#f67400;font-weight:bold">meth</span>(a <span style="color:#27ae60">:</span> int) <span style="color:#fdbc4b;font-weight:bold">return</span> <span style="color:#2980b9">bit</span>; 0282 <span style="font-weight:bold">end protected;</span> 0283 0284 <span style="color:#7a7c7d">-- type protected body</span> 0285 <span style="color:#27ae60">type</span> prot <span style="color:#27ae60">is</span> <span style="font-weight:bold">protected</span> <span style="font-weight:bold">body</span> 0286 <span style="color:#27ae60">variable</span> var <span style="color:#27ae60">:</span> <span style="color:#2980b9">positive</span>; 0287 <span style="color:#27ae60">constant</span> const <span style="color:#27ae60">:</span> <span style="color:#2980b9">boolean</span>; 0288 0289 <span style="color:#2980b9;font-weight:bold">function</span> <span style="color:#f67400;font-weight:bold">meth</span>(a <span style="color:#27ae60">:</span> int) <span style="color:#fdbc4b;font-weight:bold">return</span> <span style="color:#2980b9">bit</span> <span style="font-weight:bold">is</span> 0290 <span style="color:#2980b9;font-weight:bold">begin</span> 0291 <span style="color:#2980b9;font-weight:bold">end function;</span> 0292 <span style="font-weight:bold">end protected body;</span> 0293 0294 <span style="color:#2980b9;font-weight:bold">function</span> <span style="color:#f67400;font-weight:bold">\?=\</span> (L<span style="color:#27ae60">,</span> R <span style="color:#27ae60">:</span> <span style="color:#2980b9">BOOLEAN</span>) <span style="color:#fdbc4b;font-weight:bold">return</span> <span style="color:#2980b9">BOOLEAN</span>; 0295 0296 <span style="color:#fdbc4b;font-weight:bold">end package;</span> 0297 0298 <span style="color:#fdbc4b;font-weight:bold">package</span> <span style="color:#fdbc4b;font-weight:bold">body</span> <span style="color:#f67400;font-weight:bold">p</span> <span style="font-weight:bold">is</span> 0299 <span style="color:#2980b9;font-weight:bold">function</span> <span style="color:#f67400;font-weight:bold">\?=\</span> (L<span style="color:#27ae60">,</span> R <span style="color:#27ae60">:</span> <span style="color:#2980b9">BOOLEAN</span>) <span style="color:#fdbc4b;font-weight:bold">return</span> <span style="color:#2980b9">BOOLEAN</span> <span style="font-weight:bold">is</span> 0300 <span style="color:#2980b9;font-weight:bold">begin</span> 0301 <span style="color:#fdbc4b;font-weight:bold">if</span> <span style="font-weight:bold">not</span> (format(format<span style="color:#f67400">'left</span>) <span style="color:#27ae60">=</span> <span style="color:#f67400">'%'</span>) <span style="color:#fdbc4b;font-weight:bold">then</span> 0302 <span style="font-weight:bold">report</span> <span style="color:#f44f4f">"to_string: Illegal format string """</span> <span style="color:#27ae60">&</span> format <span style="color:#27ae60">&</span> <span style="color:#f67400">'"'</span> 0303 <span style="font-weight:bold">severity</span> <span style="font-weight:bold">error</span>; 0304 <span style="color:#fdbc4b;font-weight:bold">return</span> <span style="color:#f44f4f">""</span>; 0305 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0306 <span style="color:#fdbc4b;font-weight:bold">return</span> L <span style="color:#27ae60">=</span> R; 0307 <span style="color:#2980b9;font-weight:bold">end function \?=\;</span> 0308 0309 <span style="font-weight:bold">procedure</span> <span style="color:#f67400;font-weight:bold">test</span> <span style="color:#fdbc4b;font-weight:bold">is</span> 0310 <span style="color:#27ae60">variable</span> v <span style="color:#27ae60">:</span> int_ptr; 0311 <span style="color:#27ae60">variable</span> i <span style="color:#27ae60">:</span> <span style="color:#2980b9">integer</span>; 0312 <span style="font-weight:bold">begin</span> 0313 v <span style="color:#27ae60">:=</span> <span style="font-weight:bold">null</span>; 0314 deallocate(v); 0315 v <span style="color:#27ae60">:=</span> <span style="font-weight:bold">new</span> <span style="color:#2980b9">integer</span>; 0316 v <span style="color:#27ae60">:=</span> <span style="font-weight:bold">new</span> integer<span style="color:#f67400">'(5)</span>; 0317 v<span style="color:#27ae60">.</span><span style="font-weight:bold">all</span> <span style="color:#27ae60">:=</span> <span style="color:#f67400">5</span>; 0318 r<span style="color:#27ae60">.</span><span style="font-weight:bold">all</span><span style="color:#27ae60">.</span>value <span style="color:#27ae60">:=</span> <span style="color:#f67400">1</span>; 0319 a <span style="color:#27ae60">:=</span> <span style="font-weight:bold">new</span> int_vec(<span style="color:#f67400">1</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">3</span>); 0320 a<span style="color:#27ae60">.</span><span style="font-weight:bold">all</span>(<span style="color:#f67400">5</span>) <span style="color:#27ae60">:=</span> <span style="color:#f67400">2</span>; 0321 a(<span style="color:#f67400">1</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">2</span>) <span style="color:#27ae60">:=</span> (<span style="color:#f67400">1</span><span style="color:#27ae60">,</span> <span style="color:#f67400">2</span>); 0322 s <span style="color:#27ae60">:=</span> <span style="font-weight:bold">new</span> string<span style="color:#f67400">'("")</span>; 0323 <span style="font-weight:bold">end procedure;</span> 0324 0325 <span style="font-weight:bold">procedure</span> <span style="color:#f67400;font-weight:bold">test2</span>(x <span style="color:#27ae60">:</span> <span style="font-weight:bold">inout</span> rec_ptr) <span style="color:#fdbc4b;font-weight:bold">is</span> 0326 <span style="font-weight:bold">begin</span> 0327 x<span style="color:#27ae60">.</span>value <span style="color:#27ae60">:=</span> x<span style="color:#27ae60">.</span>value <span style="color:#27ae60">+</span> <span style="color:#f67400">1</span>; 0328 <span style="font-weight:bold">end procedure;</span> 0329 0330 <span style="font-weight:bold">procedure</span> <span style="color:#f67400;font-weight:bold">test3</span> <span style="color:#fdbc4b;font-weight:bold">is</span> 0331 <span style="color:#27ae60">type</span> a; 0332 <span style="color:#27ae60">type</span> a <span style="color:#27ae60">is</span> <span style="font-weight:bold">access</span> <span style="color:#2980b9">integer</span>; 0333 <span style="color:#27ae60">variable</span> v <span style="color:#27ae60">:</span> a; 0334 <span style="font-weight:bold">begin</span> 0335 <span style="font-weight:bold">end procedure;</span> 0336 0337 <span style="color:#27ae60">type</span> int_ptr_array <span style="color:#27ae60">is</span> <span style="font-weight:bold">array</span> (<span style="color:#2980b9">integer</span> <span style="font-weight:bold">range</span> <span style="color:#27ae60"><></span>) <span style="font-weight:bold">of</span> int_ptr; 0338 0339 <span style="font-weight:bold">procedure</span> <span style="color:#f67400;font-weight:bold">tets4</span> <span style="color:#fdbc4b;font-weight:bold">is</span> 0340 <span style="color:#27ae60">type</span> bvp <span style="color:#27ae60">is</span> <span style="font-weight:bold">access</span> <span style="color:#2980b9">bit_vector</span>; 0341 <span style="color:#27ae60">variable</span> y <span style="color:#27ae60">:</span> int_ptr(<span style="color:#f67400">1</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">3</span>) <span style="color:#27ae60">:=</span> int_ptr<span style="color:#f67400">'(null)</span>; 0342 <span style="font-weight:bold">begin</span> 0343 <span style="font-weight:bold">end procedure;</span> 0344 0345 <span style="font-weight:bold">procedure</span> <span style="color:#f67400;font-weight:bold">Restore_Origin</span> (Mark <span style="color:#27ae60">:</span> Instance_Index_Type) <span style="color:#fdbc4b;font-weight:bold">is</span> 0346 <span style="font-weight:bold">begin</span> 0347 <span style="color:#fdbc4b;font-weight:bold">for</span> I <span style="font-weight:bold">in</span> reverse Mark <span style="color:#27ae60">+</span> <span style="color:#f67400">1</span> <span style="color:#27ae60">..</span> Prev_Instance_Table<span style="color:#27ae60">.</span>Last <span style="color:#fdbc4b;font-weight:bold">loop</span> 0348 <span style="font-weight:bold">declare</span> 0349 El <span style="color:#27ae60">:</span> Instance_Entry_Type renames Prev_Instance_Table<span style="color:#27ae60">.</span>Table (I); 0350 <span style="font-weight:bold">begin</span> 0351 Origin_Table<span style="color:#27ae60">.</span>Table (El<span style="color:#27ae60">.</span>N) <span style="color:#27ae60">:=</span> El<span style="color:#27ae60">.</span>Old_Origin; 0352 <span style="font-weight:bold">end;</span> 0353 <span style="color:#fdbc4b;font-weight:bold">end loop;</span> 0354 Prev_Instance_Table<span style="color:#27ae60">.</span>Set_Last (Mark); 0355 <span style="font-weight:bold">end Restore_Origin;</span> 0356 0357 <span style="color:#7a7c7d">-- Instantiate a list. Simply create a new list and instantiate nodes of</span> 0358 <span style="color:#7a7c7d">-- that list.</span> 0359 <span style="color:#2980b9;font-weight:bold">function</span> <span style="color:#f67400;font-weight:bold">Instantiate_Iir_List</span> (L <span style="color:#27ae60">:</span> Iir_List; Is_Ref <span style="color:#27ae60">:</span> <span style="color:#2980b9">Boolean</span>) 0360 <span style="color:#fdbc4b;font-weight:bold">return</span> Iir_List 0361 <span style="font-weight:bold">is</span> 0362 Res <span style="color:#27ae60">:</span> Iir_List; 0363 El <span style="color:#27ae60">:</span> Iir; 0364 <span style="color:#2980b9;font-weight:bold">begin</span> 0365 <span style="color:#fdbc4b;font-weight:bold">case</span> to_integer(<span style="color:#2980b9">unsigned</span>(CTRL_REF(x<span style="color:#27ae60">*</span><span style="color:#f67400">4</span><span style="color:#27ae60">+</span><span style="color:#f67400">3</span> <span style="color:#27ae60">downto</span> x<span style="color:#27ae60">*</span><span style="color:#f67400">4</span>))) <span style="font-weight:bold">is</span> 0366 <span style="color:#fdbc4b;font-weight:bold">when</span> <span style="color:#f67400;font-weight:bold">Null_Iir_List</span> 0367 <span style="color:#27ae60">|</span> <span style="color:#f67400;font-weight:bold">Iir_List_All</span> <span style="color:#27ae60">=></span> 0368 <span style="color:#fdbc4b;font-weight:bold">return</span> L; 0369 <span style="color:#fdbc4b;font-weight:bold">when</span> <span style="font-weight:bold">others</span> <span style="color:#27ae60">=></span> 0370 It <span style="color:#27ae60">:=</span> List_Iterate (L); 0371 <span style="color:#fdbc4b;font-weight:bold">while</span> Is_Valid (It) <span style="color:#fdbc4b;font-weight:bold">loop</span> 0372 El <span style="color:#27ae60">:=</span> Get_Element (It); 0373 Append_Element (Res<span style="color:#27ae60">,</span> Instantiate_Iir (El<span style="color:#27ae60">,</span> Is_Ref)); 0374 <span style="color:#fdbc4b;font-weight:bold">end loop;</span> 0375 <span style="color:#fdbc4b;font-weight:bold">for</span> I <span style="font-weight:bold">in</span> Flist_First <span style="color:#27ae60">..</span> Flist_Last (L) <span style="color:#fdbc4b;font-weight:bold">loop</span> 0376 Set_Nth_Element (Res<span style="color:#27ae60">,</span> I<span style="color:#27ae60">,</span> Instantiate_Iir (El<span style="color:#27ae60">,</span> Is_Ref)); 0377 <span style="color:#fdbc4b;font-weight:bold">end loop;</span> 0378 <span style="color:#fdbc4b;font-weight:bold">return</span> Res; 0379 <span style="color:#fdbc4b;font-weight:bold">end case;</span> 0380 <span style="color:#2980b9;font-weight:bold">end Instantiate_Iir_List;</span> 0381 <span style="color:#fdbc4b;font-weight:bold">end package body;</span> 0382 0383 <span style="color:#7a7c7d">-- Library bar</span> 0384 <span style="font-weight:bold">context</span> foo<span style="color:#27ae60">.</span>test_context; 0385 0386 <span style="font-weight:bold">context</span> <span style="color:#f67400;font-weight:bold">foo</span> <span style="font-weight:bold">is</span> 0387 <span style="font-weight:bold">context</span> foo<span style="color:#27ae60">.</span>test_context; 0388 <span style="font-weight:bold">end context foo;</span> 0389 0390 <span style="color:#fdbc4b;font-weight:bold">entity</span> <span style="color:#f67400;font-weight:bold">concat</span> <span style="font-weight:bold">is</span> 0391 <span style="color:#fdbc4b;font-weight:bold">end entity;</span> 0392 0393 <span style="color:#fdbc4b;font-weight:bold">entity</span> <span style="color:#f67400;font-weight:bold">foo</span> <span style="font-weight:bold">is</span> 0394 <span style="color:#fdbc4b;font-weight:bold">port</span> ( 0395 x <span style="color:#27ae60">:</span> <span style="font-weight:bold">in</span> my_int ); 0396 <span style="color:#fdbc4b;font-weight:bold">end entity;</span> 0397 0398 <span style="color:#fdbc4b;font-weight:bold">architecture</span> <span style="color:#f67400;font-weight:bold">t</span> <span style="font-weight:bold">of</span> <span style="color:#8e44ad">concat</span> <span style="font-weight:bold">is</span> 0399 <span style="color:#27ae60">type</span> int_array <span style="color:#27ae60">is</span> <span style="font-weight:bold">array</span> (<span style="color:#2980b9">integer</span> <span style="font-weight:bold">range</span> <span style="color:#27ae60"><></span>) <span style="font-weight:bold">of</span> <span style="color:#2980b9">integer</span>; 0400 <span style="color:#27ae60">type</span> small <span style="color:#27ae60">is</span> <span style="font-weight:bold">range</span> <span style="color:#f67400">1</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">3</span>; 0401 0402 <span style="color:#fdbc4b;font-weight:bold">component</span> <span style="color:#f67400;font-weight:bold">or_entity</span> <span style="font-weight:bold">is</span> 0403 <span style="color:#fdbc4b;font-weight:bold">port</span>( 0404 input_1<span style="color:#27ae60">:</span> <span style="font-weight:bold">in</span> <span style="color:#2980b9">std_logic</span>; 0405 output<span style="color:#27ae60">:</span> <span style="font-weight:bold">out</span> <span style="color:#2980b9">std_logic</span> 0406 ); 0407 <span style="color:#fdbc4b;font-weight:bold">end component;</span> 0408 <span style="color:#fdbc4b;font-weight:bold">begin</span> 0409 <span style="color:#3daee9;font-weight:bold">process</span> 0410 <span style="color:#27ae60">variable</span> s <span style="color:#27ae60">:</span> <span style="color:#2980b9">string</span>(<span style="color:#f67400">1</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">5</span>); 0411 <span style="color:#27ae60">variable</span> t <span style="color:#27ae60">:</span> int_array(<span style="color:#f67400">1</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">2</span>); 0412 <span style="color:#27ae60">variable</span> c <span style="color:#27ae60">:</span> <span style="color:#2980b9">bit_vector</span>(<span style="color:#f67400">1</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">4</span>); 0413 <span style="color:#3daee9;font-weight:bold">begin</span> 0414 x <span style="color:#27ae60">:=</span> ( <span style="color:#f67400">1</span><span style="color:#27ae60">,</span> <span style="color:#f67400">2</span><span style="color:#27ae60">,</span> <span style="color:#f67400">3</span> ); 0415 z <span style="color:#27ae60">:=</span> x <span style="color:#27ae60">&</span> y; 0416 w <span style="color:#27ae60">:=</span> <span style="color:#f67400">1</span> <span style="color:#27ae60">&</span> x; 0417 s <span style="color:#27ae60">:=</span> <span style="color:#f67400">'h'</span> <span style="color:#27ae60">&</span> string<span style="color:#f67400">'("ello")</span>; 0418 <span style="font-weight:bold">assert</span> <span style="color:#f44f4f">"10"</span> <span style="color:#27ae60">=</span> (b(<span style="color:#f67400">1</span>) <span style="color:#27ae60">&</span> <span style="color:#f44f4f">"0"</span>); 0419 <span style="font-weight:bold">wait</span>; 0420 <span style="color:#3daee9;font-weight:bold">end process;</span> 0421 0422 <span style="color:#2980b9;font-weight:bold">function</span> <span style="color:#f67400;font-weight:bold">CounterVal</span>(Seconds <span style="color:#27ae60">:</span> <span style="color:#2980b9">integer</span> <span style="color:#27ae60">:=</span> <span style="color:#f67400">0</span>) <span style="color:#fdbc4b;font-weight:bold">return</span> <span style="color:#2980b9">integer</span> <span style="font-weight:bold">is</span> 0423 <span style="color:#27ae60">variable</span> TotalSeconds <span style="color:#27ae60">:</span> interger; 0424 <span style="color:#2980b9;font-weight:bold">begin</span> 0425 TotalSeconds <span style="color:#27ae60">:=</span> Seconds <span style="color:#27ae60">+</span> Minutes <span style="color:#27ae60">*</span> <span style="color:#f67400">60</span>; 0426 <span style="color:#fdbc4b;font-weight:bold">return</span> TotalSeconds <span style="color:#27ae60">*</span> ClockFrequencyHz <span style="color:#27ae60">-</span><span style="color:#f67400">1</span>; 0427 <span style="color:#2980b9;font-weight:bold">end function;</span> 0428 0429 <span style="color:#27ae60">type</span> enum_type <span style="color:#27ae60">is</span> (a<span style="color:#27ae60">,</span> b<span style="color:#27ae60">,</span> c<span style="color:#27ae60">,</span> <span style="color:#27ae60">...,</span> z); 0430 <span style="color:#27ae60">type</span> int_array <span style="color:#27ae60">is</span> <span style="font-weight:bold">array</span>(<span style="color:#f67400">3</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>) <span style="font-weight:bold">of</span> <span style="color:#2980b9">integer</span>; 0431 0432 <span style="font-weight:bold">subtype</span> addr_int <span style="font-weight:bold">is</span> <span style="color:#2980b9">integer</span> <span style="font-weight:bold">range</span> <span style="color:#f67400">0</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">65535</span>; 0433 <span style="font-weight:bold">subtype</span> sub_enum_type <span style="font-weight:bold">is</span> enum_type <span style="font-weight:bold">range</span> a <span style="color:#27ae60">to</span> m; 0434 0435 <span style="color:#f67400;font-weight:bold">inst1</span><span style="color:#27ae60">:</span> <span style="font-weight:bold">entity</span> <span style="color:#8e44ad">work.counter1</span>(rtl) 0436 <span style="font-weight:bold">generic map </span>(BITS1 <span style="color:#27ae60">=></span> <span style="color:#f67400">8</span>) 0437 <span style="font-weight:bold">port map </span>( 0438 clk1 <span style="color:#27ae60">=></span> Clock<span style="color:#27ae60">,</span> 0439 DATA_OUT <span style="color:#27ae60">=></span> pwm_data_o(<span style="color:#f67400">3</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">5</span>)<span style="color:#27ae60">,</span> 0440 COMP_IN(<span style="color:#f67400">1</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>) <span style="color:#27ae60">=></span> compensate_i<span style="color:#27ae60">,</span> 0441 WRITE_IN <span style="color:#27ae60">=></span> (<span style="color:#27ae60">others</span> <span style="color:#27ae60">=></span> <span style="color:#f67400">'0'</span>) 0442 ); 0443 0444 <span style="color:#f67400;font-weight:bold">inst2</span><span style="color:#27ae60">:</span> <span style="font-weight:bold">component</span> <span style="color:#8e44ad">counter2</span> 0445 <span style="font-weight:bold">generic map </span>(BITS1 <span style="color:#27ae60">=></span> <span style="color:#f67400">8</span>) 0446 <span style="font-weight:bold">port map </span>(clk1 <span style="color:#27ae60">=></span> Clock); 0447 0448 <span style="color:#f67400;font-weight:bold">inst3</span><span style="color:#27ae60">:</span> <span style="font-weight:bold">configuration</span> <span style="color:#8e44ad">counter3</span> 0449 <span style="font-weight:bold">generic map </span>(BITS1 <span style="color:#27ae60">=></span> <span style="color:#f67400">8</span>) 0450 <span style="font-weight:bold">port map </span>(clk1 <span style="color:#27ae60">=></span> Clock); 0451 0452 <span style="color:#f67400;font-weight:bold">THE_PWM_GEN</span> <span style="color:#27ae60">:</span> <span style="color:#8e44ad">pwm_generator</span> 0453 <span style="font-weight:bold">generic map</span>( 0454 dsfds <span style="color:#27ae60">=></span> ds 0455 ) 0456 <span style="font-weight:bold">port map</span>( 0457 CLK <span style="color:#27ae60">=></span> clk_i<span style="color:#27ae60">,</span> 0458 DATA_IN <span style="color:#27ae60">=></span> pwm_data_i<span style="color:#27ae60">,</span> 0459 DATA_OUT <span style="color:#27ae60">=></span> pwm_data_o(<span style="color:#f67400">3</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">5</span>)<span style="color:#27ae60">,</span> 0460 COMP_IN(<span style="color:#f67400">1</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>) <span style="color:#27ae60">=></span> compensate_i<span style="color:#27ae60">,</span> 0461 WRITE_IN <span style="color:#27ae60">=></span> (<span style="color:#27ae60">others</span> <span style="color:#27ae60">=></span> <span style="color:#f67400">'0'</span>) 0462 ); 0463 0464 <span style="color:#fdbc4b;font-weight:bold">end architecture;</span> 0465 0466 <span style="color:#fdbc4b;font-weight:bold">architecture</span> <span style="color:#f67400;font-weight:bold">a2</span> <span style="font-weight:bold">of</span> <span style="color:#8e44ad">e</span> <span style="font-weight:bold">is</span> 0467 <span style="color:#2980b9;font-weight:bold">function</span> <span style="color:#f44f4f">">"</span>(a<span style="color:#27ae60">,</span> b<span style="color:#27ae60">:</span> my_int) <span style="color:#fdbc4b;font-weight:bold">return</span> <span style="color:#2980b9">boolean</span>; 0468 <span style="color:#fdbc4b;font-weight:bold">begin</span> 0469 <span style="color:#3daee9;font-weight:bold">process</span> <span style="font-weight:bold">is</span> 0470 <span style="color:#27ae60">variable</span> x<span style="color:#27ae60">,</span> y <span style="color:#27ae60">:</span> my_int; 0471 <span style="color:#3daee9;font-weight:bold">begin</span> 0472 <span style="font-weight:bold">assert</span> x <span style="color:#27ae60">></span> y; 0473 <span style="font-weight:bold">assert</span> x <span style="color:#27ae60"><</span> y; <span style="color:#7a7c7d">-- Error</span> 0474 <span style="color:#3daee9;font-weight:bold">end process;</span> 0475 0476 <span style="color:#f67400;font-weight:bold">billowitch_tc586</span><span style="color:#27ae60">:</span> <span style="color:#fdbc4b;font-weight:bold">block</span> <span style="font-weight:bold">is</span> 0477 <span style="color:#27ae60">type</span> real_cons_vector <span style="color:#27ae60">is</span> <span style="font-weight:bold">array</span> (<span style="color:#f67400">15</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>) <span style="font-weight:bold">of</span> <span style="color:#2980b9">real</span>; 0478 <span style="color:#27ae60">type</span> real_cons_vector_file <span style="color:#27ae60">is</span> <span style="font-weight:bold">file</span> <span style="font-weight:bold">of</span> real_cons_vector; 0479 <span style="color:#27ae60">constant</span> C19 <span style="color:#27ae60">:</span> real_cons_vector <span style="color:#27ae60">:=</span> (<span style="color:#27ae60">others</span> <span style="color:#27ae60">=></span> <span style="color:#f67400">3</span><span style="color:#27ae60">.</span><span style="color:#f67400">0</span>); 0480 <span style="font-weight:bold">begin</span> 0481 <span style="color:#fdbc4b;font-weight:bold">end block;</span> 0482 <span style="color:#fdbc4b;font-weight:bold">end architecture;</span> 0483 0484 <span style="color:#fdbc4b;font-weight:bold">architecture</span> <span style="color:#f67400;font-weight:bold">arch</span> <span style="font-weight:bold">of</span> <span style="color:#8e44ad">ent</span> <span style="font-weight:bold">is</span> 0485 <span style="color:#fdbc4b;font-weight:bold">begin</span> 0486 <span style="color:#f67400;font-weight:bold">LL</span><span style="color:#27ae60">:</span> <span style="color:#fdbc4b;font-weight:bold">if</span> test<span style="color:#27ae60">=</span><span style="color:#f67400">10</span> <span style="color:#fdbc4b;font-weight:bold">generate</span> 0487 <span style="color:#fdbc4b;font-weight:bold">begin</span> 0488 <span style="color:#fdbc4b;font-weight:bold">end;</span> 0489 <span style="color:#fdbc4b;font-weight:bold">elsif</span> test<span style="color:#27ae60">=</span><span style="color:#f67400">5</span> <span style="color:#fdbc4b;font-weight:bold">generate</span> 0490 <span style="color:#fdbc4b;font-weight:bold">begin</span> 0491 <span style="color:#fdbc4b;font-weight:bold">end;</span> 0492 <span style="color:#fdbc4b;font-weight:bold">end generate;</span> 0493 0494 <span style="color:#f67400;font-weight:bold">LL</span><span style="color:#27ae60">:</span> <span style="color:#fdbc4b;font-weight:bold">if</span> <span style="color:#f67400;font-weight:bold">l1</span><span style="color:#27ae60">:</span> SPEED <span style="color:#27ae60">=</span> <span style="color:#f44f4f">"fast"</span> <span style="color:#fdbc4b;font-weight:bold">generate</span> 0495 <span style="color:#fdbc4b;font-weight:bold">elsif</span> test<span style="color:#27ae60">=</span><span style="color:#f67400">5</span> <span style="color:#fdbc4b;font-weight:bold">generate</span> 0496 <span style="color:#fdbc4b;font-weight:bold">end generate;</span> 0497 <span style="color:#fdbc4b;font-weight:bold">end architecture arch;</span> 0498 0499 0500 <span style="color:#fdbc4b;font-weight:bold">architecture</span> <span style="color:#f67400;font-weight:bold">thing_arch</span> <span style="font-weight:bold">of</span> <span style="color:#8e44ad">designthing</span> <span style="font-weight:bold">is</span> 0501 0502 <span style="color:#fdbc4b;font-weight:bold">component</span> <span style="color:#f67400;font-weight:bold">pwm_generator</span> 0503 <span style="color:#fdbc4b;font-weight:bold">port</span>( 0504 CLK <span style="color:#27ae60">:</span> <span style="font-weight:bold">in</span> <span style="color:#2980b9">std_logic</span>; 0505 DATA_IN <span style="color:#27ae60">:</span> <span style="font-weight:bold">in</span> <span style="color:#2980b9">std_logic_vector</span>(<span style="color:#f67400">15</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>); 0506 ); 0507 <span style="color:#fdbc4b;font-weight:bold">end component pwm_generator;</span> 0508 0509 <span style="color:#27ae60">attribute</span> NOM_FREQ <span style="color:#27ae60">:</span> <span style="color:#2980b9">string</span>; 0510 <span style="color:#27ae60">attribute</span> NOM_FREQ <span style="font-weight:bold">of</span> clk_source <span style="color:#27ae60">:</span> <span style="font-weight:bold">label</span> <span style="font-weight:bold">is</span> <span style="color:#f44f4f">"133.00"</span>; 0511 <span style="color:#27ae60">signal</span> clk_i <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic</span>; 0512 0513 <span style="color:#fdbc4b;font-weight:bold">begin</span> 0514 0515 <span style="color:#f67400;font-weight:bold">gen_no_comp</span><span style="color:#27ae60">:</span> <span style="color:#fdbc4b;font-weight:bold">if</span> TEMP <span style="color:#27ae60">=</span> <span style="color:#f67400">0</span> <span style="color:#fdbc4b;font-weight:bold">generate</span> 0516 compensate_i <span style="color:#27ae60"><=</span> (<span style="color:#27ae60">others</span> <span style="color:#27ae60">=></span> <span style="color:#f67400">'0'</span>); 0517 <span style="color:#fdbc4b;font-weight:bold">end generate;</span> 0518 0519 <span style="color:#f67400;font-weight:bold">gen_no_comp</span><span style="color:#27ae60">:</span> <span style="color:#fdbc4b;font-weight:bold">for</span> i <span style="font-weight:bold">in</span> <span style="color:#f67400">0</span> <span style="color:#27ae60">to</span> TEMP <span style="color:#fdbc4b;font-weight:bold">generate</span> 0520 compensate_i <span style="color:#27ae60"><=</span> (<span style="color:#27ae60">others</span> <span style="color:#27ae60">=></span> <span style="color:#f67400">'0'</span>) <span style="font-weight:bold">after</span> <span style="color:#f67400">10</span> <span style="color:#2980b9">ns</span>; 0521 compensate_i <span style="color:#27ae60"><=</span> (<span style="color:#27ae60">others</span> <span style="color:#27ae60">=></span> <span style="color:#f67400">'0'</span>) ; 0522 <span style="color:#fdbc4b;font-weight:bold">end generate;</span> 0523 0524 <span style="color:#7a7c7d">---------------------------------------------------------------------------</span> 0525 <span style="color:#7a7c7d">-- LED blinking when activity on inputs</span> 0526 <span style="color:#7a7c7d">---------------------------------------------------------------------------</span> 0527 <span style="color:#f67400;font-weight:bold">PROC_TIMER</span> <span style="color:#27ae60">:</span> <span style="color:#3daee9;font-weight:bold">process</span> <span style="color:#3daee9;font-weight:bold">begin</span> 0528 <span style="font-weight:bold">wait</span> <span style="font-weight:bold">until</span> <span style="font-weight:bold">rising_edge</span>(clk_i); 0529 timer <span style="color:#27ae60"><=</span> timer <span style="color:#27ae60">+</span> <span style="color:#f67400">1</span>; 0530 <span style="font-weight:bold">wait</span> <span style="font-weight:bold">for</span> <span style="color:#f67400">10</span> <span style="color:#2980b9">ns</span>; 0531 leds <span style="color:#27ae60"><=</span> (last_inp <span style="font-weight:bold">xor</span> inp_status(<span style="color:#f67400">3</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>)) <span style="font-weight:bold">or</span> leds <span style="font-weight:bold">or</span> last_leds; 0532 <span style="color:#fdbc4b;font-weight:bold">if</span> timer <span style="color:#27ae60">=</span> <span style="color:#f67400">0</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0533 leds <span style="color:#27ae60"><=</span> <span style="font-weight:bold">not</span> inp_status(<span style="color:#f67400">3</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>); 0534 last_leds <span style="color:#27ae60"><=</span> x<span style="color:#f44f4f">"0"</span>; 0535 <span style="color:#fdbc4b;font-weight:bold">elsif</span> gf <span style="color:#fdbc4b;font-weight:bold">then</span> 0536 fdsa <span style="color:#27ae60"><=</span> <span style="color:#f67400">'1'</span>; 0537 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0538 0539 <span style="color:#f67400;font-weight:bold">xz</span><span style="color:#27ae60">:</span> <span style="color:#fdbc4b;font-weight:bold">for</span> x <span style="font-weight:bold">in</span> <span style="color:#f67400">0</span> <span style="color:#27ae60">to</span> <span style="color:#f67400">7</span> <span style="color:#fdbc4b;font-weight:bold">loop</span> 0540 dsadf; 0541 <span style="color:#fdbc4b;font-weight:bold">end loop;</span> 0542 0543 <span style="color:#fdbc4b;font-weight:bold">case</span> c <span style="font-weight:bold">is</span> 0544 <span style="color:#fdbc4b;font-weight:bold">when</span> <span style="color:#f67400;font-weight:bold">XXX</span> <span style="color:#27ae60">=></span> 0545 c <span style="color:#27ae60"><=</span> <span style="color:#f67400">1</span>; 0546 d <span style="color:#27ae60"><=</span> <span style="color:#f67400">21321</span>; 0547 <span style="color:#fdbc4b;font-weight:bold">when</span> <span style="color:#f67400;font-weight:bold">YYYY</span> <span style="color:#27ae60">=></span> 0548 c <span style="color:#27ae60"><=</span> <span style="color:#f67400">2</span>; 0549 <span style="color:#fdbc4b;font-weight:bold">end case;</span> 0550 <span style="color:#3daee9;font-weight:bold">end process;</span> 0551 0552 0553 <span style="color:#f67400;font-weight:bold">generate_with_begin</span><span style="color:#27ae60">:</span> <span style="color:#fdbc4b;font-weight:bold">if</span> TEMP <span style="color:#27ae60">=</span> <span style="color:#f67400">0</span> <span style="color:#fdbc4b;font-weight:bold">generate</span> 0554 <span style="color:#27ae60">signal</span> <span style="color:#27ae60">:</span> test <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic</span>; 0555 <span style="color:#fdbc4b;font-weight:bold">begin</span> 0556 compensate_i <span style="color:#27ae60"><=</span> (<span style="color:#27ae60">others</span> <span style="color:#27ae60">=></span> <span style="color:#f67400">'0'</span>); 0557 <span style="color:#fdbc4b;font-weight:bold">if</span> timer <span style="color:#27ae60">=</span> <span style="color:#f67400">0</span> <span style="color:#fdbc4b;font-weight:bold">then</span> 0558 leds <span style="color:#27ae60"><=</span> <span style="font-weight:bold">not</span> inp_status(<span style="color:#f67400">3</span> <span style="color:#27ae60">downto</span> <span style="color:#f67400">0</span>); 0559 last_leds <span style="color:#27ae60"><=</span> x<span style="color:#f44f4f">"0"</span>; 0560 <span style="color:#fdbc4b;font-weight:bold">elsif</span> gf <span style="color:#fdbc4b;font-weight:bold">then</span> 0561 fdsa <span style="color:#27ae60"><=</span> <span style="color:#f67400">'1'</span>; 0562 <span style="color:#fdbc4b;font-weight:bold">end if;</span> 0563 <span style="color:#fdbc4b;font-weight:bold">end generate generate_with_begin;</span> 0564 0565 <span style="color:#f67400;font-weight:bold">PROC_TIMER</span> <span style="color:#27ae60">:</span> <span style="color:#3daee9;font-weight:bold">process</span> 0566 <span style="color:#27ae60">variable</span> x <span style="color:#27ae60">:</span> <span style="color:#2980b9">std_logic</span>; 0567 <span style="color:#3daee9;font-weight:bold">begin</span> 0568 x <span style="color:#27ae60">:=</span> <span style="color:#f67400">'0'</span>; 0569 <span style="color:#3daee9;font-weight:bold">end process PROC_TIMER;</span> 0570 0571 <span style="color:#da4453;font-weight:bold;text-decoration:underline">end architecture thing_arc;</span> <span style="color:#7a7c7d">--this is not correct (wrong name)</span> 0572 0573 <span style="color:#f67400">1</span><span style="color:#27ae60">+</span><span style="color:#f67400">1</span> 0574 <span style="color:#f67400">2</span><span style="color:#2980b9">ns</span> 0575 0576 <span style="color:#f67400">1_2_3</span> 0577 <span style="color:#f67400">12_3</span> 0578 <span style="color:#f67400">1</span><span style="color:#27ae60">.</span><span style="color:#f67400">2</span> 0579 <span style="color:#f67400">1</span><span style="color:#27ae60">.</span><span style="color:#f67400">2_3</span> 0580 <span style="color:#f67400">1_3</span><span style="color:#27ae60">.</span><span style="color:#f67400">2_3</span> 0581 <span style="color:#f67400">12_3</span><span style="color:#f67400">e+1</span> 0582 <span style="color:#f67400">12_3</span><span style="color:#f67400">e-1</span> 0583 <span style="color:#f67400">12_3</span><span style="color:#f67400">e1_1</span> 0584 <span style="color:#f67400">12_3</span><span style="color:#27ae60">.</span><span style="color:#f67400">4</span><span style="color:#f67400">e1_1</span> 0585 <span style="color:#f67400">12_3</span><span style="color:#f67400">e1</span>_ 0586 <span style="color:#f67400">12_3</span><span style="color:#da4453;font-weight:bold;text-decoration:underline">e</span> 0587 0588 <span style="color:#f67400">2</span><span style="color:#27ae60">#</span><span style="color:#f67400">1_2_3</span><span style="color:#27ae60">#</span><span style="color:#f67400">E+8</span> 0589 <span style="color:#f67400">2</span><span style="color:#27ae60">#</span><span style="color:#f67400">1_2</span><span style="color:#27ae60">.</span><span style="color:#f67400">3</span><span style="color:#27ae60">#</span><span style="color:#f67400">E+8</span> 0590 <span style="color:#f67400">2</span><span style="color:#27ae60">#</span><span style="color:#f67400">1_f2</span><span style="color:#27ae60">.</span><span style="color:#f67400">3</span><span style="color:#27ae60">#</span> 0591 0592 <span style="color:#f67400">3</span><span style="color:#27ae60">.</span><span style="color:#f67400">14159_26536</span> <span style="color:#7a7c7d">-- A literal of type universal_real.</span> 0593 <span style="color:#f67400">5280</span> <span style="color:#7a7c7d">-- A literal of type universal_integer.</span> 0594 <span style="color:#f67400">10</span><span style="color:#27ae60">.</span><span style="color:#f67400">7</span> <span style="color:#2980b9">ns</span> <span style="color:#7a7c7d">-- A literal of a physical type.</span> 0595 O<span style="color:#f44f4f">"4777"</span> <span style="color:#7a7c7d">-- A bit string literal.</span> 0596 <span style="color:#f44f4f">"54LS281"</span> <span style="color:#7a7c7d">-- A string literal.</span> 0597 <span style="color:#f44f4f">""</span> <span style="color:#7a7c7d">-- A string literal representing a null array.</span> 0598 B<span style="color:#f44f4f">"1111_1111_1111"</span> <span style="color:#7a7c7d">-- Equivalent to the string literal "111111111111".</span> 0599 X<span style="color:#f44f4f">"FFF"</span> <span style="color:#7a7c7d">-- Equivalent to B"1111_1111_1111".</span> 0600 O<span style="color:#f44f4f">"777"</span> <span style="color:#7a7c7d">-- Equivalent to B"111_111_111".</span> 0601 X<span style="color:#f44f4f">"777"</span> <span style="color:#7a7c7d">-- Equivalent to B"0111_0111_0111".</span> 0602 B<span style="color:#f44f4f">"XXXX_01LH"</span> <span style="color:#7a7c7d">-- Equivalent to the string literal "XXXX01LH"</span> 0603 UO<span style="color:#f44f4f">"27"</span> <span style="color:#7a7c7d">-- Equivalent to B"010_111"</span> 0604 UO<span style="color:#f44f4f">"2C"</span> <span style="color:#7a7c7d">-- Equivalent to B"011_CCC"</span> 0605 SX<span style="color:#f44f4f">"3W"</span> <span style="color:#7a7c7d">-- Equivalent to B"0011_WWWW"</span> 0606 D<span style="color:#f44f4f">"35"</span> <span style="color:#7a7c7d">-- Equivalent to B"100011"</span> 0607 <span style="color:#f67400">12</span>UB<span style="color:#f44f4f">"X1"</span> <span style="color:#7a7c7d">-- Equivalent to B"0000_0000_00X1"</span> 0608 <span style="color:#f67400">12</span>SB<span style="color:#f44f4f">"X1"</span> <span style="color:#7a7c7d">-- Equivalent to B"XXXX_XXXX_XXX1"</span> 0609 <span style="color:#f67400">12</span>UX<span style="color:#f44f4f">"F-"</span> <span style="color:#7a7c7d">-- Equivalent to B"0000_1111_----"</span> 0610 <span style="color:#f67400">12</span>SX<span style="color:#f44f4f">"F-"</span> <span style="color:#7a7c7d">-- Equivalent to B"1111_1111_----"</span> 0611 <span style="color:#f67400">12</span>D<span style="color:#f44f4f">"13"</span> <span style="color:#7a7c7d">-- Equivalent to B"0000_0000_1101"</span> 0612 <span style="color:#f67400">12</span>UX<span style="color:#f44f4f">"000WWW"</span> <span style="color:#7a7c7d">-- Equivalent to B"WWWW_WWWW_WWWW"</span> 0613 <span style="color:#f67400">12</span>SX<span style="color:#f44f4f">"FFFC00"</span> <span style="color:#7a7c7d">-- Equivalent to B"1100_0000_0000"</span> 0614 <span style="color:#f67400">12</span>SX<span style="color:#f44f4f">"XXXX00"</span> <span style="color:#7a7c7d">-- Equivalent to B"XXXX_0000_0000"</span> 0615 <span style="color:#f67400">8</span>D<span style="color:#f44f4f">"511"</span> <span style="color:#7a7c7d">-- Error</span> 0616 <span style="color:#f67400">8</span>UO<span style="color:#f44f4f">"477"</span> <span style="color:#7a7c7d">-- Error</span> 0617 <span style="color:#f67400">8</span>SX<span style="color:#f44f4f">"0FF"</span> <span style="color:#7a7c7d">-- Error</span> 0618 <span style="color:#f67400">8</span>SX<span style="color:#f44f4f">"FXX"</span> <span style="color:#7a7c7d">-- Error</span> 0619 </pre></body></html>